@budibase/pro 3.7.2 → 3.7.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/sdk/backups/queue.d.ts +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -35,7 +35,7 @@ d/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR
|
|
|
35
35
|
mwIDAQAB
|
|
36
36
|
-----END PUBLIC KEY-----
|
|
37
37
|
`;function Lr(e){return Hn.default.verify(e,TI,{algorithms:["RS256"]})}function PI(e,t){return Hn.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}var qa={};S(qa,{getFeatures:()=>zn});var l=require("@budibase/types");var OI={[l.PlanType.FREE]:[...ue.SELF_FREE_LICENSE.features],[l.PlanType.PREMIUM]:void 0,[l.PlanType.PREMIUM_PLUS]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS],[l.PlanType.PREMIUM_PLUS_TRIAL]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS],[l.PlanType.PRO]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS],[l.PlanType.TEAM]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS],[l.PlanType.BUSINESS]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS],[l.PlanType.ENTERPRISE_BASIC]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.CUSTOM_APP_SCRIPTS],[l.PlanType.ENTERPRISE_BASIC_TRIAL]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.CUSTOM_APP_SCRIPTS],[l.PlanType.ENTERPRISE]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.CUSTOM_APP_SCRIPTS]},CI={[l.PlanType.FREE]:[...ue.CLOUD_FREE_LICENSE.features],[l.PlanType.PREMIUM]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS],[l.PlanType.PREMIUM_PLUS]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.BUDIBASE_AI],[l.PlanType.PREMIUM_PLUS_TRIAL]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.BUDIBASE_AI],[l.PlanType.PRO]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.BRANDING],[l.PlanType.TEAM]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.BRANDING],[l.PlanType.BUSINESS]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.BUDIBASE_AI],[l.PlanType.ENTERPRISE_BASIC]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.CUSTOM_APP_SCRIPTS],[l.PlanType.ENTERPRISE_BASIC_TRIAL]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.CUSTOM_APP_SCRIPTS],[l.PlanType.ENTERPRISE]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.CUSTOM_APP_SCRIPTS]};function zn(e,t){let r=[];function a(n){let o=n[t];if(!o)throw new Error(`Features do not exist for planType=${t} and hosting=${e}`);return o}switch(e){case l.Hosting.SELF:r=a(OI);break;case l.Hosting.CLOUD:r=a(CI);break}return r}var Ua={};S(Ua,{UNLIMITED:()=>d,getQuotas:()=>Jn});var B=require("@budibase/types");var p=$e,_u=ue,d=-1,Br=e=>e*1e6,qI={[B.PlanType.FREE]:{..._u.CLOUD_FREE_LICENSE.quotas},[B.PlanType.PREMIUM]:{usage:{monthly:{...p.queries(d),...p.automations(1e3),...p.budibaseAICredits(0)},static:{...p.rows(1e4),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(0),...p.plugins(d),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[B.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...p.queries(d),...p.automations(5e3),...p.budibaseAICredits(Br(2))},static:{...p.rows(25e3),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(0),...p.plugins(d),...p.customAIConfigurations(1)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[B.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...p.queries(d),...p.automations(5e3),...p.budibaseAICredits(Br(2))},static:{...p.rows(25e3),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(0),...p.plugins(d),...p.customAIConfigurations(1)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[B.PlanType.PRO]:{usage:{monthly:{...p.queries(d),...p.automations(1e3),...p.budibaseAICredits(0)},static:{...p.rows(d),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(5),...p.plugins(d),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[B.PlanType.TEAM]:{usage:{monthly:{...p.queries(d),...p.automations(5e3),...p.budibaseAICredits(0)},static:{...p.rows(d),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(10),...p.plugins(d),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(90)}},[B.PlanType.BUSINESS]:{usage:{monthly:{...p.queries(d),...p.automations(1e4),...p.budibaseAICredits(0)},static:{...p.rows(5e4),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(50),...p.plugins(d),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(365),...p.appBackupRetentionDays(365)}},[B.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...p.queries(d),...p.automations(d),...p.budibaseAICredits(Br(4))},static:{...p.rows(d),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(d),...p.plugins(d),...p.customAIConfigurations(d)}},constant:{...p.automationLogRetentionDays(d),...p.appBackupRetentionDays(d)}},[B.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...p.queries(d),...p.automations(d),...p.budibaseAICredits(Br(4))},static:{...p.rows(d),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(d),...p.plugins(d),...p.customAIConfigurations(d)}},constant:{...p.automationLogRetentionDays(15),...p.appBackupRetentionDays(15)}},[B.PlanType.ENTERPRISE]:{usage:{monthly:{...p.queries(d),...p.automations(d),...p.budibaseAICredits(Br(4))},static:{...p.rows(d),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(d),...p.plugins(d),...p.customAIConfigurations(d)}},constant:{...p.automationLogRetentionDays(d),...p.appBackupRetentionDays(d)}}},UI={[B.PlanType.FREE]:{..._u.SELF_FREE_LICENSE.quotas},[B.PlanType.PREMIUM]:void 0,[B.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...p.queries(d),...p.automations(d),...p.budibaseAICredits(0)},static:{...p.rows(d),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(0),...p.plugins(d),...p.customAIConfigurations(1)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[B.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...p.queries(d),...p.automations(d),...p.budibaseAICredits(0)},static:{...p.rows(d),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(0),...p.plugins(d),...p.customAIConfigurations(1)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[B.PlanType.PRO]:{usage:{monthly:{...p.queries(d),...p.automations(d),...p.budibaseAICredits(0)},static:{...p.rows(d),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(5),...p.plugins(d),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[B.PlanType.TEAM]:{usage:{monthly:{...p.queries(d),...p.automations(d),...p.budibaseAICredits(0)},static:{...p.rows(d),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(10),...p.plugins(d),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(90)}},[B.PlanType.BUSINESS]:{usage:{monthly:{...p.queries(d),...p.automations(d),...p.budibaseAICredits(0)},static:{...p.rows(d),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(50),...p.plugins(d),...p.customAIConfigurations(0)}},constant:{...p.automationLogRetentionDays(90),...p.appBackupRetentionDays(365)}},[B.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...p.queries(d),...p.automations(d),...p.budibaseAICredits(0)},static:{...p.rows(d),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(d),...p.plugins(d),...p.customAIConfigurations(d)}},constant:{...p.automationLogRetentionDays(d),...p.appBackupRetentionDays(d)}},[B.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...p.queries(d),...p.automations(d),...p.budibaseAICredits(0)},static:{...p.rows(d),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(d),...p.plugins(d),...p.customAIConfigurations(d)}},constant:{...p.automationLogRetentionDays(15),...p.appBackupRetentionDays(15)}},[B.PlanType.ENTERPRISE]:{usage:{monthly:{...p.queries(d),...p.automations(d),...p.budibaseAICredits(0)},static:{...p.rows(d),...p.apps(d),...p.users(d),...p.creators(d),...p.userGroups(d),...p.plugins(d),...p.customAIConfigurations(d)}},constant:{...p.automationLogRetentionDays(d),...p.appBackupRetentionDays(d)}}};function Jn(e,t){let r;function a(n){let o=n[t];if(!o)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return o}switch(e){case B.Hosting.SELF:r=a(UI);break;case B.Hosting.CLOUD:r=a(qI);break}return JSON.parse(JSON.stringify(r))}var Nt={};S(Nt,{appExists:()=>LI,encoding:()=>Bt});var Tu=require("@budibase/backend-core");async function LI(e){return(await Tu.db.getAllApps({all:!0,idsOnly:!0})).includes(e)}var Bt={};S(Bt,{base64ToObject:()=>BI,objectToBase64:()=>DI});function DI(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}function BI(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}var ld=require("@budibase/types"),zt=require("@budibase/backend-core"),dd=O(Wc()),fd=O(xo());async function l_(e){await he.save({offlineLicenseToken:e}),await At()}async function d_(){await he.save({offlineLicenseToken:void 0}),await At()}async function gd(){return(await he.get()).offlineLicenseToken}async function _o(){let t=(await zt.installation.getInstall()).installId,r=zt.context.getTenantId(),a=await zt.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:a}}async function f_(){let e=await _o();return Bt.objectToBase64(e)}function g_(e){return Bt.base64ToObject(e)}function md(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}async function yd(e){let t=await _o();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}function Ad(e){let t=e.plan.type,r=ld.Hosting.SELF,a=zn(r,t),n=Jn(r,t);return e.features=(0,dd.default)(e.features,a),e.quotas=(0,fd.default)(e.quotas,n),e}async function To(){try{let e=await gd();if(e){let t=await Lr(e);return md(t),await yd(t),Ad(t)}}catch(e){console.error("Error retrieving offline license",e)}}var ta={};S(ta,{deleteDevLicense:()=>b_,getOfflineLicense:()=>A_,writeDevLicenseToDisk:()=>h_});var hd=require("@budibase/backend-core"),Oo=require("path"),bd=require("os"),ht=O(require("fs"));var m_=hd.env.isTest()?".budibase-test":".budibase",Po=(0,Oo.join)((0,bd.tmpdir)(),m_),y_="dev_license.txt",ea=(0,Oo.join)(Po,y_);if(!ht.default.existsSync(Po))try{ht.default.mkdirSync(Po)}catch{}function A_(){try{if(ht.default.existsSync(ea)){let e=ht.default.readFileSync(ea,{encoding:"utf-8"});return Lr(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}function h_(e){console.log(`Writing license to: ${ea}`),ht.default.writeFileSync(ea,e,{encoding:"utf-8"})}function b_(){ht.default.rmSync(ea,{force:!0})}var qo=async()=>{if(Co.env.OFFLINE_MODE)return To();let e=await Dt();return e||(e=ta.getOfflineLicense()),e},I_=e=>Kn(e),Uo=()=>Co.env.SELF_HOSTED?ue.SELF_FREE_LICENSE:ue.CLOUD_FREE_LICENSE;var Lo={};S(Lo,{activateLicenseKey:()=>S_,deleteLicenseKey:()=>v_,getLicenseKey:()=>w_});async function S_(e){await Yn(e),await he.save({licenseKey:e}),await At()}async function w_(){return(await he.get()).licenseKey}async function v_(){await he.save({licenseKey:void 0}),await At()}var ra=require("@budibase/backend-core"),Ha=O(require("dd-trace")),Id=3600,At=async()=>{await vd(),await wd()},Sd=async(e,t)=>{let{populateLicense:r=qo,populateFreeLicense:a=Uo}=t||{};return await Ha.default.trace("getCachedLicense",async n=>{let o=ra.tenancy.getTenantId(),i=await Ln(),s=await i.get(o);return n.addTags({tenantId:o,foundInCache:!!s}),s||(s=await Ha.default.trace("populateLicense",async()=>await r(o)),n.addTags({populatedLicense:!!s}),s||(s=Ha.default.trace("populateFreeLicense",()=>a(e,o)),n.addTags({populatedFreeLicense:!!s})),s.refreshedAt=new Date().toISOString(),n.addTags({refreshedAt:s.refreshedAt,expirySeconds:Id}),await i.store(o,s,Id),s)})};ra.env.isJest()&&(Sd=jest.fn());var wd=Sd,vd=async()=>{let e=ra.tenancy.getTenantId();await(await Ln()).delete(e)};async function X(e,t){Array.isArray(e)||(e=[e]),t||(t=await xe.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}async function za(e,t){if(!await X(e,t))throw new Ve.FeatureDisabledError(`${e} is not currently enabled`,e)}async function Do(e,t){if(!await X(e,t)){let r=e.join(", ");throw new Ve.FeatureDisabledError(`${r} are not currently enabled`,r)}}function ce(e){return async(...t)=>(await za(J.Feature.APP_BACKUPS),e(...t))}async function Bo(){return X(J.Feature.APP_BACKUPS)}async function No(){return X(J.Feature.BRANDING)}async function Ed(){return X(J.Feature.ENFORCEABLE_SSO)}async function R_(){return X(J.Feature.SYNC_AUTOMATIONS)}async function x_(){return X(J.Feature.TRIGGER_AUTOMATION_RUN)}async function bt(){return X(J.Feature.APP_BUILDERS)}async function Ja(){return X(J.Feature.AUDIT_LOGS)}async function Go(){return X(J.Feature.USER_GROUPS)}async function Ke(){return X(J.Feature.EXPANDED_PUBLIC_API)}async function __(e){if(Ve.env.ENABLE_SSO_MAINTENANCE_MODE||!await Ed())return!1;let r;return e?.config?r=e.config:r=await Ve.configs.getSettingsConfig(),!!r.isSSOEnforced}var Mo=async()=>{let e=J.Feature.SCIM,t=await X(e),r=await Ve.configs.getSCIMConfig();if(!t||!r?.enabled)throw new Ve.FeatureDisabledError(`${e} is not currently enabled`,e);return!0};async function T_(){return X(J.Feature.VIEW_PERMISSIONS)}async function P_(){return X(J.Feature.VIEW_READONLY_COLUMNS)}async function aa(){return X(J.Feature.BUDIBASE_AI)}async function O_(){return X(J.Feature.AI_CUSTOM_CONFIGS)}var C_={faviconUrl:void 0,faviconUrlEtag:void 0,emailBrandingEnabled:!0,testimonialsEnabled:!0,platformTitle:void 0,loginHeading:void 0,loginButton:void 0,metaDescription:void 0,metaImageUrl:void 0,metaTitle:void 0};async function q_(e){return await No()?{faviconUrl:e.faviconUrl,faviconUrlEtag:e.faviconUrlEtag,emailBrandingEnabled:e.emailBrandingEnabled,testimonialsEnabled:e.testimonialsEnabled,platformTitle:e.platformTitle,loginHeading:e.loginHeading,loginButton:e.loginButton,metaDescription:e.metaDescription,metaImageUrl:e.metaImageUrl,metaTitle:e.metaTitle}:C_}var Za={};S(Za,{enrichAIConfig:()=>ko});var U_="budibase_ai";async function ko(e){return await aa()&&(e.config[U_]={provider:"OpenAI",active:!0,isDefault:Object.keys(e.config).every(t=>!e.config[t].isDefault),isBudibaseAI:!0,defaultModel:process.env.BUDIBASE_AI_DEFAULT_MODEL||"gpt-4o-mini",apiKey:process.env.OPENAI_API_KEY,name:"Budibase AI"}),e}var ke={};S(ke,{addApp:()=>G_,addAutomation:()=>W_,addCustomAIConfig:()=>$_,addGroup:()=>Qo,addPlugin:()=>Wo,addRow:()=>k_,addRows:()=>Q_,addUsers:()=>tn,bustCache:()=>Ji,decrement:()=>Te,decrementMany:()=>St,getCurrentUsageValues:()=>tu,getLicensedQuota:()=>xd,getQuotaUsage:()=>dt,increment:()=>fe,incrementBudibaseAICredits:()=>Ko,incrementMany:()=>It,removeApp:()=>M_,removeCustomAIConfig:()=>V_,removeCustomAIConfigs:()=>K_,removeGroup:()=>jo,removePlugin:()=>$o,removeRow:()=>F_,removeRows:()=>j_,removeUsers:()=>er,set:()=>Fo,setAllUsage:()=>Fn,setAppUsageValue:()=>kn,setUsage:()=>Xi,setUsagePerApp:()=>Zi,updatePluginCount:()=>Vo,updateUsage:()=>Jt,usageLimitIsExceeded:()=>N_,utils:()=>yr});var Y=require("@budibase/types");var de=require("@budibase/backend-core");var fe=(e,t,r)=>Rd({change:1,name:e,type:t,opts:r}),It=e=>Rd(e),Rd=async e=>{let t=Array.isArray(e)?e:[e];await Jt(t.map(a=>({usageChange:a.change,name:a.name,type:a.type,opts:{dryRun:!0,suppressErrorLog:a.opts?.suppressErrorLog,id:a.opts?.id}})));let r=[];for(let a of t){let n=a.opts?.fn;n&&r.push(await n())}return await Jt(t.map(a=>({usageChange:a.change,name:a.name,type:a.type,opts:{dryRun:!1,valueFn:a.opts?.valueFn,suppressErrorLog:a.opts?.suppressErrorLog,id:a.opts?.id}}))),r[0]},Te=(e,t,r={})=>Jt({usageChange:-1,name:e,type:t,opts:r}),St=e=>{let t=Array.isArray(e)?e:[e];return Jt(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},Fo=async(e,t,r)=>Le.setUsage(r,e,t),L_=(e,t,r)=>{if(e==Y.QuotaUsageType.STATIC){let a=r.usageQuota.triggers;return a?a[t]||{}:{}}else{let a=Le.utils.getCurrentMonthString(),n=r.monthly[a].triggers;return n?n[t]||{}:{}}},D_=async(e,t,r,a)=>{try{await de.locks.doWithLock({type:Y.LockType.TRY_ONCE,name:Y.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let n={percentage:r,name:t.name};a&&(n.resetDate=a),await at.triggerQuota(n)})}catch(n){de.logging.logAlert("Error triggering quota",n)}},B_=async(e,t,r,a)=>{let n=await dt(),o=e===Y.QuotaUsageType.MONTHLY?n.quotaReset:void 0,i=await L_(e,t,n),s=a.triggers,c=r/a.value*100;c>100&&(c=100);for(let[f,m]of s.entries())if(c>=m&&a.value!==$e.UNLIMITED){if(!i[m]){i[m]=new Date().toISOString();let y=s[f+1]||100;(!(c>=y)||c===m)&&await D_(t,a,c,o)}}else i[m]=void 0;return i},Jt=async e=>{let t=de.tenancy.getTenantId(),r=Array.isArray(e)?e:[e],a=null,n,o=[],i={},s={},c={},f={};for(let g of r){try{a=de.context.getAppId()}catch{}if(Y.APP_QUOTA_NAMES.includes(g.name)&&!a)throw new Error("App context required for quota update");try{n=await xd(Y.QuotaType.USAGE,g.name,g.type),o.push(n);let{total:h,app:E,breakdown:T}=await Le.getCurrentUsageValues(g.type,g.name,g.opts?.id);h+=g.usageChange,E!=null&&(E+=g.usageChange),T!=null&&(T+=g.usageChange);let x={};if(g.opts?.dryRun||(x=await B_(g.type,g.name,h,n),f={...f,[g.name]:x}),n.value!==$e.UNLIMITED&&h>n.value&&g.usageChange>0)throw new de.UsageLimitError(`Licensed ${n.name} of ${n.value} has been exceeded`,n.name);if(h=Math.max(0,h),E&&(E=Math.max(0,E)),T&&(T=Math.max(0,T),c={...c,[g.name]:T}),!g.opts?.dryRun){let R=g.opts?.valueFn;R&&(h=await R(),E=h),i={...i,[g.name]:h},s={...s,[g.name]:E}}}catch(h){throw g.opts?.suppressErrorLog||console.error(`Error updating usage quotas for ${g.name}`,h),h}}let m=r.filter(g=>!g.opts?.dryRun).map(g=>({name:g.name,type:g.type,values:{total:i[g.name],app:s[g.name],breakdown:c[g.name],triggers:f[g.name]},opts:{...g.opts,tenantId:t}}));m.length>0&&await Le.setAllUsage(m)},xd=async(e,t,r)=>{let a=await xe.getCachedLicense();if(!a){let n=de.tenancy.getTenantId();throw new Error("License not found for tenant id "+n)}if(r&&(0,Y.isStaticQuota)(e,r,t))return a.quotas[e][r][t];if(r&&(0,Y.isMonthlyQuota)(e,r,t))return a.quotas[e][r][t];if((0,Y.isConstantQuota)(e,t))return a.quotas[e][t];throw new Error("Invalid quota type")},N_=async(e,t)=>{try{return await Jt({usageChange:1,name:e,type:t,opts:{dryRun:!0}}),!1}catch(r){if(r.code===de.ErrorCode.USAGE_LIMIT_EXCEEDED)return!0;throw r}};var Xt=require("@budibase/types"),_d=require("@budibase/backend-core"),Td=async()=>{let e=await _d.db.getAllApps({dev:!0});return e?e.length:0},G_=async(e,{appId:t}={})=>fe(Xt.StaticQuotaName.APPS,Xt.QuotaUsageType.STATIC,{fn:e,valueFn:Td,id:t}),M_=async({appId:e}={})=>Te(Xt.StaticQuotaName.APPS,Xt.QuotaUsageType.STATIC,{valueFn:Td,id:e});var Ge=require("@budibase/types"),k_=async(e,{tableId:t}={})=>fe(Ge.StaticQuotaName.ROWS,Ge.QuotaUsageType.STATIC,{fn:e,id:t}),F_=async({tableId:e}={})=>Te(Ge.StaticQuotaName.ROWS,Ge.QuotaUsageType.STATIC,{id:e}),Q_=async(e,t,{tableId:r}={})=>It({change:e,name:Ge.StaticQuotaName.ROWS,type:Ge.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),j_=async(e,{tableId:t}={})=>St({change:e,name:Ge.StaticQuotaName.ROWS,type:Ge.QuotaUsageType.STATIC,opts:{id:t}});var en=require("@budibase/types"),W_=async(e,{automationId:t}={})=>fe(en.MonthlyQuotaName.AUTOMATIONS,en.QuotaUsageType.MONTHLY,{fn:e,id:t});var Zt=require("@budibase/types"),Qo=async e=>fe(Zt.StaticQuotaName.USER_GROUPS,Zt.QuotaUsageType.STATIC,{fn:e}),jo=async()=>Te(Zt.StaticQuotaName.USER_GROUPS,Zt.QuotaUsageType.STATIC);var st=require("@budibase/types"),Wo=async e=>fe(st.StaticQuotaName.PLUGINS,st.QuotaUsageType.STATIC,{fn:e}),$o=async()=>Te(st.StaticQuotaName.PLUGINS,st.QuotaUsageType.STATIC),Vo=async e=>Fo(st.StaticQuotaName.PLUGINS,st.QuotaUsageType.STATIC,e);var Me=require("@budibase/types"),na=require("@budibase/backend-core");var tn=async(e,t,r)=>{let a=[{change:e,name:Me.StaticQuotaName.USERS,type:Me.QuotaUsageType.STATIC,opts:{fn:r,valueFn:na.users.getUserCount}}];t>0&&a.push({change:t,name:Me.StaticQuotaName.CREATORS,type:Me.QuotaUsageType.STATIC,opts:{valueFn:na.users.getCreatorCount}});let n=await It(a);return await Dt(),n},er=async(e,t)=>{let r=[{change:e,name:Me.StaticQuotaName.USERS,type:Me.QuotaUsageType.STATIC,opts:{valueFn:na.users.getUserCount}}];t>0&&r.push({change:t,name:Me.StaticQuotaName.CREATORS,type:Me.QuotaUsageType.STATIC,opts:{valueFn:na.users.getCreatorCount}}),await St(r),await Dt()};var Pe=require("@budibase/types"),Ko=async e=>It({change:e,name:Pe.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:Pe.QuotaUsageType.MONTHLY}),$_=async()=>fe(Pe.StaticQuotaName.AI_CUSTOM_CONFIGS,Pe.QuotaUsageType.STATIC),V_=async()=>Te(Pe.StaticQuotaName.AI_CUSTOM_CONFIGS,Pe.QuotaUsageType.STATIC),K_=async e=>St({change:e,name:Pe.StaticQuotaName.AI_CUSTOM_CONFIGS,type:Pe.QuotaUsageType.STATIC});var Ye={};S(Ye,{addAppBuilder:()=>X_,db:()=>Fe,removeAppBuilder:()=>Z_});var sa=require("@budibase/backend-core");var M={};S(M,{addAppBuilder:()=>Xo,addUsers:()=>Ho,adjustGroupCreatorsQuotas:()=>J_,cleanupApp:()=>z_,enrichUserRolesFromGroups:()=>H_,fetch:()=>oa,get:()=>vt,getBulk:()=>Dd,getGroupBuilderAppIds:()=>Ld,getGroupRoleId:()=>Y_,remove:()=>Yo,removeAppBuilder:()=>Zo,removeUsers:()=>zo,save:()=>tr,updateGroupApps:()=>Jo});var v=require("@budibase/backend-core");var Pd=require("@budibase/backend-core"),rn=class extends Pd.HTTPError{constructor(t){super(`Group name "${t}" is unavailable`,409)}};async function qd(e,t){try{let r=[];for(let s of e)if(s.roles){let c=s.roles[v.db.getProdAppID(t)];c&&r.push(c)}let a=await Promise.all(r.map(async s=>({[s]:await v.roles.roleToNumber(s)}))),n,o,i={};a.forEach(s=>{let[c,f]=Object.entries(s)[0];i[c]={roleId:c,roleNum:f}});for(let{roleId:s,roleNum:c}of Object.values(i))(o===void 0||c>o)&&(o=c,n=s);return n}catch(r){throw v.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}async function Ud(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await D.getBulk(e,{enriched:!1}),t}async function Ld(e,t){if(!e.userGroups)return[];let r=await Ud(e.userGroups,t?.groups),a=t?.appId?v.db.getProdAppID(t?.appId):null,n=[];for(let o of r){let i=o.builder?.apps;a&&i?.includes(a)?n.push(a):a||(n=n.concat(i||[]))}return[...new Set(n)]}async function Y_(e,t,r){if(!e.userGroups)return null;let a=await Ud(e.userGroups,r?.groups),n=v.db.getProdAppID(t);return e.roles?.[n]?e.roles[n]:(a=a.filter(o=>o?.roles?Object.keys(o.roles).includes(n):!1),await qd(a,t))}async function H_(e){if(!e||!e.userGroups)return e;let t=await Dd(e.userGroups,{enriched:!1}),r=[];for(let n of t)n?.roles&&(r=r.concat(Object.keys(n.roles)));r=[...new Set(r)];for(let n of r)await v.context.doInAppContext(n,async()=>{if(e.roles[n])return;let o=await qd(t,n);o&&(e.roles[n]=o)});let a=await Ld(e,{groups:t});if(a.length&&!e.builder?.global){let n=e.builder?.apps||[];e.builder={apps:n.concat(a)}}return e}async function oa(){return await D.fetch()}async function vt(e){return await D.get(e)}async function Dd(e,t={enriched:!0}){return await D.getBulk(e,t)}async function Od(e){if(await D.getByName(e))throw new rn(e)}async function Cd(e){let t=await D.getGroupUsers(e._id);if(!t.length)return 0;let a=await v.tenancy.getGlobalDB().getMultiple(t.map(o=>o._id));return(await v.userUtils.creatorsInList(a)).filter(o=>o).length}async function tr(e){let t=[],r=!e._id,a=0;if(delete e.users,!e._id)e._id=D.generateUserGroupID(),await Od(e.name),t.push(v.events.group.created(e));else{let o=await D.get(e._id);if(o.name!==e.name&&await Od(e.name),t.push(v.events.group.updated(e)),JSON.stringify(o.roles)!==JSON.stringify(e.roles)){let i=o.users?.length||0,s=0;i>0&&(s=await Cd(o)),Object.values(e.roles).includes(v.roles.BUILTIN_ROLE_IDS.ADMIN)?a=i-s:a=-i,t.push(v.events.group.permissionsEdited(e))}}await Promise.all(t);let n=()=>D.save(e);if(r)return await Qo(n);{let o=await n();if(a>0)await tn(0,a);else if(a<0){let i=await Cd(e),s=Math.abs(a)-i;s>0&&await er(0,s)}return o}}async function Yo(e,t){let r;try{r=await D.get(e)}catch{throw new Error("Group not found")}let a=Object.values(r.roles||{}).includes(v.roles.BUILTIN_ROLE_IDS.ADMIN),n=()=>{};if(a){let i=v.tenancy.getGlobalDB(),s=await D.getGroupUsers(e),f=(await Promise.all(s.map(h=>i.get(h._id)))).map(h=>({...h,userGroups:h.userGroups.filter(E=>E!==e)})),g=(await v.userUtils.creatorsInList(f)).filter(h=>h).length,y=s.length-g;y&&(n=()=>er(0,y))}let o=await D.destroy(e,t);return await v.events.group.deleted(r),await jo(),await n(),o}async function Ho(e,t){let r=await D.get(e),a=await v.users.bulkGetGlobalUsersById(t),n=[];for(let c of a)c.userGroups||(c.userGroups=[]),c.userGroups.includes(e)||n.push(c);if(!n.length)return n;let o=n.map(c=>({...c,userGroups:[...c?.userGroups||[],e]}));if(await v.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes(v.roles.BUILTIN_ROLE_IDS.ADMIN)){let f=(await v.userUtils.creatorsInList(n)).filter(g=>g).length,m=n.length-f;m&&await tn(0,m)}let s=[];for(let c of t)s.push(v.cache.user.invalidateUser(c));return await Promise.all(s),await v.events.group.usersAdded(o.length,r),o}async function zo(e,t){let r=await D.get(e),a=await v.users.bulkGetGlobalUsersById(t),n=[];for(let s of a){if(!s.userGroups||!s.userGroups.includes(e))continue;let c=s.userGroups.indexOf(e);s.userGroups.splice(c,1),n.push(s)}if(await v.users.bulkUpdateGlobalUsers(n),Object.values(r.roles||{}).includes(v.roles.BUILTIN_ROLE_IDS.ADMIN)){let c=(await v.userUtils.creatorsInList(n)).filter(m=>m).length,f=n.length-c;f&&await er(0,f)}let i=[];for(let s of t)i.push(v.cache.user.invalidateUser(s));return await Promise.all(i),n.length&&await v.events.group.usersDeleted(n.length,r),n}async function Jo(e,t){let r=await vt(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 await tr(r)}async function z_(e){let t=await oa(),r=[];for(let a of t)!a.roles||!a.roles[e]||(delete a.roles[e],r.push(a));return await D.bulkSave(r)}async function Xo(e,t){if(!await bt())throw new Error("Feature not enabled, please check license");let r=v.db.getProdAppID(t),a=await vt(e);a.builder??={apps:[]},a.builder.apps.includes(t)||(a.builder.apps.push(r),await tr(a))}async function Zo(e,t){if(!await bt())throw new Error("Feature not enabled, please check license");let r=v.db.getProdAppID(t),a=await vt(e);a.builder?.apps.includes(t)&&(a.builder.apps=a.builder.apps.filter(n=>n!==r),await tr(a))}async function J_(){if(!await Go()){let e=v.tenancy.getGlobalDB(),r=(await oa()||[]).filter(a=>Object.values(a?.roles||{}).includes(v.roles.BUILTIN_ROLE_IDS.ADMIN));for(let a of r){let n=await D.getGroupUsers(a._id),i=(await Promise.all(n.map(m=>e.get(m._id)))).map(m=>({...m,userGroups:m.userGroups.filter(g=>g!==a._id)})),c=(await v.userUtils.creatorsInList(i)).filter(m=>m).length,f=n.length-c;await D.save({...a,roles:{}}),f&&await er(0,f)}}}sa.users.UserDB.init(ke,M,le);var Fe=sa.users.UserDB;async function X_(e,t){if(!await bt())throw new Error("Feature not enabled, please check license");await sa.users.addAppBuilder(e,t)}async function Z_(e,t){if(!await bt())throw new Error("Feature not enabled, please check license");await sa.users.removeAppBuilder(e,t)}var nn={};S(nn,{logs:()=>is});var is={};S(is,{logSearch:()=>uT,oldestLogDate:()=>Qd,storeLog:()=>pT});var Fd=require("@budibase/types"),an=require("@budibase/backend-core");var it=require("@budibase/types");var K=require("@budibase/backend-core");var Bd=require("@budibase/backend-core");async function Nd(e,t){let r,a=5,n=!1,o,i=!0;for(;a>0;a--)try{i?o=await e():o=await exports.randomDelay(e),n=!0;break}catch(s){r=s}return n||Bd.logging.logWarn(`Failed to backoff: ${t}`,r),o}var{SEPARATOR:He,UNICODE_MAX:eT,DocumentType:Gd,AutomationViewMode:es,ViewName:tT,getQueryIndex:rT}=K.db,aT=new Date(0).toISOString(),nT=100,ts=async()=>_a(it.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS);function Md(e,t,{status:r,automationId:a}={},n={}){let o=a?`${a}${He}`:"",i=r?`${r}${He}`:"",s;return r&&a?s=`${es.ALL}${He}${i}${o}`:r?s=`${es.STATUS}${He}${i}`:a?s=`${es.AUTOMATION}${He}${o}`:s=`${Gd.AUTOMATION_LOG}${He}`,{...n,descending:!0,startkey:`${s}${t}${eT}`,endkey:`${s}${e}`}}function rs(e){let t=it.AutomationStatus.SUCCESS,r=!0;for(let a of e.steps){let n=a.outputs?.status?.toLowerCase(),o=n==="stopped_error";if(r&&!o){r=!1;continue}if(o){t=it.AutomationStatus.STOPPED_ERROR;break}else if(a.outputs?.success){if(n==="stopped"){t=it.AutomationStatus.STOPPED;break}}else{t=it.AutomationStatus.ERROR;break}}return t}function oT(e,t,r){return`${Gd.AUTOMATION_LOG}${He}${e}${He}${r}${He}${t}`}async function as(e,t,r={docs:!0}){let a=K.context.getProdAppDB();await a.exists()||(a=K.context.getDevAppDB());let n={status:r.status},o=r?.limit?r.limit:r?.paginate?9+1:void 0,i=Md(e,t,n,{include_docs:r.docs,limit:o});r?.page&&(i.startkey=r.page);let s=await a.allDocs(i);return hr(s,{paginate:r?.paginate,pageSize:9})}async function ns(e,t,r={}){let a=K.context.getProdAppDB();await a.exists()||(a=K.context.getDevAppDB());let n;try{let o={automationId:r?.automationId,status:r?.status},i=Md(e,t,o,{include_docs:!0,limit:9+1});r?.page&&(i.startkey=r.page),n=await a.query(rT(tT.AUTOMATION_LOGS),i)}catch(o){if(o!=null&&(o.name==="not_found"||o.error==="not_found"))return await du(),ns(e,t,r);throw o}return hr(n,{paginate:!0,pageSize:9})}async function kd(e,t){let r=K.context.getProdAppDB(),a=e._id,n=e.name,o=rs(t),i=new Date().toISOString(),s=oT(i,o,a),c={...t,automationId:a,status:o,automationName:n,createdAt:i,_id:s};return await r.put(c),s}async function os(e,{clearing:t}={clearing:!1}){let r=K.context.getProdAppDB();await Nd(async()=>{let a=await r.get(K.db.DocumentType.APP_METADATA);for(let n of e){let o=n.split(K.db.SEPARATOR),i=`${o[o.length-3]}${K.db.SEPARATOR}${o[o.length-2]}`,s={};a.automationErrors&&(s=a.automationErrors),Array.isArray(s[i])||(s[i]=[]);let c=s[i].indexOf(n);t&&c!==-1?s[i].splice(c,1):s[i].push(n),s[i].length===0&&delete s[i],a.automationErrors=s}await r.put(a),await K.cache.app.invalidateAppMetadata(a.appId,a)},"Failed to update app metadata with automation log error")}async function sT(){let e=await ts();try{return await as(aT,e,{docs:!1,paginate:!1,limit:nT})}catch{return{data:[],hasNextPage:!1}}}async function ss(){let e=K.context.getProdAppDB();try{let t=await sT();if(!t.data||t.data.length===0)return;let r=t.data.map(n=>({_id:n.id,_rev:n.value.rev,_deleted:!0})),a=t.data.filter(n=>{let o=n.id.split(K.db.SEPARATOR);return o[o.length-1]===it.AutomationStatus.ERROR}).map(n=>n.id);await e.bulkDocs(r),a.length&&await os(a,{clearing:!0})}catch(t){K.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}var Qd=ts;async function iT(e,t,r,a){let n,o=new Date().toISOString(),i=await Qd();return(!e||e<i)&&(e=i),r||t?n=await ns(e,o,{automationId:r,status:t,page:a}):n=await as(e,o,{status:t,page:a,docs:!0,paginate:!0}),n}async function uT(e){return await ss(),await iT(e.startDate,e.status,e.automationId,e.page)}async function pT(e,t){if(!an.db.isProdAppID(an.context.getAppId()))return;let r=rs(t),a=await kd(e,t);r===Fd.AutomationStatus.ERROR&&await os([a]),await ss()}var on={};S(on,{checkPluginQuotas:()=>dT,deletePlugin:()=>lT,storePlugin:()=>cT});var Vd=require("@budibase/types"),j=require("@budibase/backend-core");var jd=O(require("fs")),Wd=require("path");function $d(e,t){return jd.default.readFileSync((0,Wd.join)(e,t),"utf8")}async function cT(metadata,directory,source){let db=j.tenancy.getGlobalDB(),version=metadata.package.version,name=metadata.package.name,description=metadata.package.description,hash=metadata.schema.hash,bucketPath=j.objectStore.getPluginS3Dir(name),files=await j.objectStore.uploadDirectory(j.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===Vd.PluginType.DATASOURCE){let js=$d(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=j.db.generatePluginID(name),rev;try{rev=(await db.get(pluginId))._rev}catch(e){rev=void 0}let doc={_id:pluginId,_rev:rev,...metadata,name,version,hash,description,source};iconFileName&&(doc.iconFileName=iconFileName),source&&(doc={...doc,source});let write=async()=>{let e=await db.put(doc);return await j.events.plugin.imported(doc),{...doc,_rev:e.rev}};return rev?await write():await Wo(write)}async function lT(e){let t=j.tenancy.getGlobalDB();try{let r=await t.get(e),a=j.objectStore.getPluginS3Dir(r.name);await j.objectStore.deleteFolder(j.objectStore.ObjectStoreBuckets.PLUGINS,a),await t.remove(e,r._rev),await j.events.plugin.deleted(r),await $o()}catch(r){let a=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${a}`)}}async function dT(){let e=j.tenancy.getGlobalDB();try{let r=(await e.allDocs(j.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await Vo(r)}catch(t){j.logging.logAlert("Unable to retrieve plugins for quota check",t)}}var Qe={};S(Qe,{fetch:()=>gT,fetchValues:()=>mT,isEncryptionKeyAvailable:()=>fT,isValid:()=>Hd,remove:()=>AT,update:()=>yT});var ia=require("@budibase/types"),Kd=require("@budibase/backend-core");function fT(){return!!Kd.env.ENCRYPTION_KEY}async function gT(){let e=await mt.get();return Object.keys(e.variables)}async function mT(e){let r=(await mt.get()).variables,a={};for(let[n,o]of Object.entries(r))switch(e){case ia.AppEnvironment.DEVELOPMENT:a[n]=o.development;break;case ia.AppEnvironment.PRODUCTION:default:a[n]=o.production;break}return a}async function Yd(e){if(!(await Ne.cache.getCachedLicense()).features.includes(ia.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await mt.get();r.variables=e(r.variables),await mt.update(r)}async function yT(e,t){if(Hd(e))await Yd(a=>(a[e]=t,a));else throw new Error("Variable name has characters that are not allowed")}async function AT(e){await Yd(t=>(delete t[e],t))}function Hd(e){return/^[a-zA-Z0-9-_]+$/.test(e)}var ut={};S(ut,{definitions:()=>TT,download:()=>_T,fetch:()=>xT,write:()=>ET});var un=require("@budibase/types");var F=require("@budibase/backend-core"),Oe=require("@budibase/types");var zd=require("memorystream"),Jd=new F.sql.Sql(Oe.SqlClient.SQL_LITE);async function hT(e,t,r){let a={operation:Oe.Operation.READ,table:Lt.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:Oe.SortOrder.DESCENDING,type:Oe.SortType.STRING}}},n=Jd._query(a);if(Array.isArray(n))throw new Error("Cannot execute multiple queries for audit log search");return{sql:n.sql,bindings:n.bindings}}function bT(e){return`${F.DocumentType.AUDIT_LOG}${F.SEPARATOR}${e}${F.SEPARATOR}${F.utils.newid()}`}async function Xd(e){e._id||(e._id=bT(e.timestamp)),e.type||(e.type=Oe.AUDIT_LOG_TYPE);try{let r=await F.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){F.logging.logAlert("Failed to write audit log",t)}}async function us(e,t,r){t||(t=1);let a=F.context.getAuditLogsDB();try{let n=9+1,o=await hT(e,t,n),i=Lt.searchTable(),s=Jd.convertJsonStringColumns(i,await a.sql(o.sql,o.bindings)),c;s.length>n&&(c=s.pop());let f={rows:s,hasNextPage:!!c};return f.hasNextPage&&(f.bookmark=t+1),f}catch(n){if(n.status===404&&!r?.isRetry)return await IT(),await ru(),await us(e,t,{isRetry:!0});throw n}}async function IT(){let e=F.context.getAuditLogsDB(),r=(await e.allDocs(F.db.getDocParams(F.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(a=>a.doc).filter(a=>a&&!a.type).map(a=>({...a,type:Oe.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}function Zd(e){let t=F.context.getAuditLogsDB(),r=new zd,a=t.dump(r,{filter:o=>{let i=o;if(!i._id?.startsWith(F.DocumentType.AUDIT_LOG))return!1;let s=!0,c=(f,m)=>{!f||f.length===0||(s=!!(s&&m&&f.includes(m)))};if(c(e.userIds,i.userId),c(e.appIds,i.appId),c(e.events,i.event),(e.startDate||e.endDate)&&(s=s&&i.timestamp>=e.startDate&&i.timestamp<=e.endDate),e.fullSearch){let f=JSON.stringify(o);s=s&&f.includes(e.fullSearch)}return s}}),n=new zd;return r.on("data",o=>{let i=JSON.parse(Buffer.from(o).toString());if(Array.isArray(i.docs)){let s="";for(let c of i.docs)s+=JSON.stringify(c)+`
|
|
38
|
-
`;n.write(s)}}),r.on("end",()=>{n.end()}),{promise:a,stream:n}}var ne=require("@budibase/backend-core");var sn=require("@budibase/types"),ua=require("@budibase/string-templates"),pa=require("@budibase/backend-core"),wT=pa.constants.MIN_VALID_DATE.toISOString(),vT=pa.constants.MAX_VALID_DATE.toISOString();function ps(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||wT,e.endDate=e.endDate||vT),e}async function ef(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(a=>pa.db.getProdAppID(a)));let t={};function r(a,n){n?.length&&(t.oneOf={...t.oneOf,[a]:n})}return 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=ps(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}function cs(e,t,r){let a={_id:e,status:sn.AuditLogResourceStatus.DELETED};switch(t){case"app":a.name=r?.appName;break;case"user":a.email=r?.email;break}return a}function ls(e){let t=(0,ua.findHBSBlocks)(e);for(let r of t){let a=` "${r}"`;e=e.replace(e.includes(a)?a:` ${r}`,""),e=(0,ua.processStringSync)(e,{})}return e}function tf(e,t){let r=sn.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let a=(0,ua.processStringSync)(r,t);return a.includes('""')&&(a=ls(r)),a}async function ET(e,t,r){if(!await Ja()||!ne.utils.isAudited(e))return;let a=tf(e,t),n=new Date;r?.timestamp&&(n=new Date(r.timestamp));let o={timestamp:n.toISOString(),event:e,name:a,userId:r?.userId||un.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){o.appId=ne.db.getProdAppID(r.appId);let s=await ne.cache.app.getAppMetadata(r.appId);"name"in s&&(i.appName=s.name)}if(r?.userId){let s=await ne.users.getById(r?.userId);i.email=s.email}}catch(s){ne.logging.logAlert("Failed to retrieve fallback information for audit log",s)}return o.fallback=i,await Xd(o)}async function RT(e){let t=e.map(s=>s.userId),a=e.filter(s=>s.appId).map(s=>ne.db.getDevAppID(s.appId)),n=await ne.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),o=await ne.db.getAppsByIDs([...new Set(a)]),i=[];for(let s of e){let c=n.find(g=>g?._id===s.userId),f=o.find(g=>ne.db.isSameAppID(g?.appId,s.appId)),m={event:s.event,timestamp:s.timestamp,name:s.name,metadata:s.metadata,user:c||cs(s.userId,"user",s.fallback)};s.appId&&(m.app=f||cs(s.appId,"app",s.fallback)),i.push(m)}return i}async function xT(e){if(!await Ja())throw new Error("Audit logs not available - license required.");let t=await ef(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await us(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await RT(r.rows)}}function _T(e){return e=ps(e),Zd(e)}function TT(){let e=Object.entries(un.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=ls(r[1]);return t}var pn={};S(pn,{applications:()=>ms,roles:()=>fs,users:()=>ds});var ds={};S(ds,{roleCheck:()=>OT});function PT(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}async function OT(e,t){return await Ke()||PT(e,t),e}var fs={};S(fs,{assign:()=>CT,unAssign:()=>qT});var ca=require("@budibase/backend-core");async function CT(e,t){if(!await Ke())throw new Error("Unable to assign roles - license required.");let r=await Fe.bulkGet(e);for(let a of r){if(t.role&&t.role.roleId){let n=ca.db.getProdAppID(t.role.appId);a.roles[n]=t.role.roleId}if(t.appBuilder){let n=ca.db.getProdAppID(t.appBuilder.appId),o=a.builder?.apps||[];a.builder={apps:o.concat([n])}}t.builder&&(a.builder={global:!0}),t.admin&&(a.admin={global:!0}),a.roles}await Fe.bulkUpdate(r)}async function qT(e,t){if(!await Ke())throw new Error("Unable to un-assign roles - license required.");let r=await Fe.bulkGet(e);for(let a of r){if(t.role){let n=ca.db.getProdAppID(t.role?.appId);a.roles[n]===t.role.roleId&&delete a.roles[n]}if(t.appBuilder&&a.builder?.apps){let n=ca.db.getProdAppID(t.appBuilder.appId);a.builder.apps=a.builder.apps.filter(o=>o!==n)}t.builder&&a.builder&&delete a.builder,t.admin&&a.admin&&delete a.admin}}var ms={};S(ms,{buildExportFn:()=>LT,buildImportFn:()=>UT});var gs=require("@budibase/backend-core");function UT(e){return async(t,r)=>{await Ke()||t.throw(403,"Endpoint unavailable, license required."),t.request.files?.appExport||t.throw(400,"Must provide app export file for import."),await gs.context.doInAppContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}function LT(e){return async(t,r)=>{await Ke()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:a,excludeRows:n}=t.request.body;await gs.context.doInAppContext(t.params.appId,async()=>{t.request.body={encryptPassword:a,excludeRows:n},t.query.appId=t.params.appId,await e(t),await r()})}}var je=require("@budibase/backend-core"),ae=require("@budibase/types");var ys=require("@budibase/backend-core"),rf;function af(){rf=ys.queue.createQueue(ys.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}function Et(){return rf}var nf=require("path"),of=O(require("fs"));async function As(e,t={}){return be.storeAppBackupMetadata(e,t)}function sf(e){let t=new Date().toISOString();switch(e){case ae.AppBackupStatus.COMPLETE:case ae.AppBackupStatus.FAILED:return{timestamp:t,finishedAt:t};case ae.AppBackupStatus.STARTED:return{timestamp:t,startedAt:t};case ae.AppBackupStatus.PENDING:return{timestamp:t,createdAt:t}}}async function DT(e,t,r,a){let n=await cn(e);return await be.storeAppBackupMetadata({...n,...sf(t),contents:r,status:t,type:ae.AppBackupType.BACKUP},{filename:a,docId:e})}async function BT(e,t,r){let a=await cn(e);return await be.storeAppBackupMetadata({...a,...sf(r),status:r,type:ae.AppBackupType.RESTORE,trigger:ae.AppBackupTrigger.MANUAL},{docId:e,docRev:t})}async function cn(e){return be.getAppBackupMetadata(e)}async function NT(e,t){return be.updateAppBackupMetadata(e,t)}async function GT(e){let t=await be.getAppBackupMetadata(e);return t.filename&&await je.objectStore.deleteFile(je.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),be.deleteAppBackupMetadata(e)}async function MT(e,t){return be.fetchAppBackups(e,t)}async function uf(e){let t=await be.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let r=await je.objectStore.getReadStream(je.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}async function kT(e){let{stream:t}=await uf(e),r=(0,nf.join)(je.objectStore.budibaseTempDir(),je.utils.newid()),a=of.default.createWriteStream(r);return new Promise((n,o)=>{t.on("error",o),a.on("error",o),t.pipe(a).on("close",()=>n(r))})}async function FT(e,t,r={}){let a;try{a=await As({appId:e,trigger:t,timestamp:new Date().toISOString(),status:ae.AppBackupStatus.PENDING,type:ae.AppBackupType.BACKUP,...r})}catch(n){if(n.status===409)return;throw n}return await Et().add({docId:a.id,docRev:a.rev,appId:e,export:{trigger:t,...r}}),await je.events.backup.appBackupTriggered(e,a.id,ae.AppBackupType.BACKUP,t,r?.name),a.id}async function QT(e,t,r,a){let n=await cn(t),o;try{o=await As({appId:e,timestamp:new Date().toISOString(),status:ae.AppBackupStatus.PENDING,type:ae.AppBackupType.RESTORE,createdBy:a})}catch(i){if(i?.status===409)return;throw i}return await Et().add({appId:e,docId:o.id,docRev:o.rev,import:{nameForBackup:r,backupId:t,createdBy:a}}),{restoreId:o.id,metadata:n}}var jT={isEnabled:Bo,triggerAppRestore:ce(QT),triggerAppBackup:ce(FT),getBackupDownloadStream:ce(uf),downloadAppBackup:ce(kT),fetchAppBackups:ce(MT),storeAppBackupMetadata:ce(As),updateBackupStatus:ce(DT),updateRestoreStatus:ce(BT),getAppBackup:ce(cn),updateAppBackup:ce(NT),deleteAppBackup:ce(GT)},ze=jT;var bs={};S(bs,{init:()=>hs});var W=require("@budibase/backend-core");var Ce=require("@budibase/types");var rr=O(require("fs"));async function hs(e){Et().process(async t=>{let r=t.data;try{if(r.export)return VT(t,e);if(r.import)return $T(t,e)}catch(a){W.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,a)}})}async function WT(e){await W.db.getDB(e,{skip_setup:!0}).destroy()}async function pf(e,t,r,a){let n=W.db.getDevAppID(r),o=W.db.getProdAppID(r),i=new Date().toISOString(),s=async(c,f)=>{a?.doc?await ze.updateBackupStatus(a.doc.id,c,f?.contents,f?.filename):await ze.storeAppBackupMetadata({appId:o,timestamp:i,trigger:e,status:c,name:a?.name,type:Ce.AppBackupType.BACKUP,contents:f?.contents,createdBy:a?.createdBy},{filename:f?.filename})};try{let c=await a.processing.exportAppFn(n,{tar:!0}),f=await a.processing.statsFn(n),m=`${o}/backup-${i}.tar.gz`,g=W.objectStore.ObjectStoreBuckets.BACKUPS,y=rr.default.createReadStream(c);await W.objectStore.streamUpload({bucket:g,filename:m,stream:y,extra:{type:"application/gzip",metadata:{name:a?.name,trigger:e,timestamp:i,appId:o}}}),await s(Ce.AppBackupStatus.COMPLETE,{filename:m,contents:f}),rr.default.existsSync(c)&&rr.default.rmSync(c)}catch(c){W.logging.logAlert("App backup error",c),await s(Ce.AppBackupStatus.FAILED)}}async function $T(e,t){let r=e.data,a=r.appId,n=r.import.backupId,o=r.import.nameForBackup,i=r.import.createdBy,s=W.tenancy.getTenantIDFromAppID(a);return W.tenancy.doInTenant(s,async()=>{let c=W.db.getDevAppID(a),{rev:f}=await ze.updateRestoreStatus(r.docId,r.docRev,Ce.AppBackupStatus.STARTED);await pf(Ce.AppBackupTrigger.RESTORING,s,a,{processing:t,createdBy:i,name:o});let m=await ze.downloadAppBackup(n);await WT(c);let g=Ce.AppBackupStatus.COMPLETE;try{await t.importAppFn(c,W.db.getDB(c),{file:{type:"application/gzip",path:m},key:m})}catch(y){W.logging.logAlert("App restore error",y),g=Ce.AppBackupStatus.FAILED}await ze.updateRestoreStatus(r.docId,f,g),rr.default.existsSync(m)&&rr.default.rmSync(m,{force:!0})})}async function VT(e,t){let r=e.data,a=r.appId,n=r.export.trigger,o=r.export.name,i=W.tenancy.getTenantIDFromAppID(a);await W.tenancy.doInTenant(i,async()=>{try{let{rev:s}=await ze.updateBackupStatus(r.docId,Ce.AppBackupStatus.STARTED);return pf(n,i,a,{processing:t,doc:{id:r.docId,rev:s},name:o})}catch(s){W.logging.logAlert("App backup error",s)}})}var KT=async e=>{af(),await hs(e.processing)},Se={...ze,processing:bs,init:KT,getBackupQueue:Et};var cf=async e=>{e.backups&&await Se.init(e.backups)};var se={};S(se,{create:()=>kN,find:()=>MN,get:()=>GN,remove:()=>QN,update:()=>FN});var qA=O(gi()),Je=require("@budibase/backend-core");var UA=require("@budibase/types");async function GN(e){let t=Je.tenancy.getGlobalDB(),r=new Je.db.QueryBuilder(t.name,UA.SearchIndex.USER);r.setIndexBuilder(Je.db.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[n,o]of Object.entries(e.filters?.equal??{}))r.addEqual(n,o);r.setSort("_id"),r.setSkip(e.skip);let a=await r.run();return{users:a.rows,total:a.totalRows}}async function MN(e){return await Je.users.getById(e)}async function kN(e){let t=await Fe.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new Je.HTTPError("User is already synched",409);e={...t,scimInfo:(0,qA.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Fe.save(e,{requirePassword:!1})}async function FN(e,t){return await Fe.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}async function QN(e){return await Fe.destroy(e)}var ur={};S(ur,{create:()=>jN});var LA=O(gi());var DA=require("@budibase/backend-core");async function jN(e){let t=await jn(e.name),r;if(!t)r=(await M.save(e)).id;else{if(t.scimInfo?.isSync)throw new DA.HTTPError("Group is already synched",409);r=t._id,t.users&&(await M.removeUsers(r,t.users.map(n=>n._id)),delete t.users),t.scimInfo=(0,LA.default)(t.scimInfo,e.scimInfo),await M.save(t)}return await M.get(r)}var xt={};S(xt,{logRequest:()=>WN,logResponse:()=>$N});var mi=require("@budibase/backend-core");async function WN(e){mi.logging.logWarn("SCIM request log",e)}async function $N(e){mi.logging.logWarn("SCIM response error",e)}var Ii={};S(Ii,{doInScimContext:()=>Ai,feature:()=>N,internalGroupOnly:()=>Rn,licensing:()=>BA,requireSCIM:()=>hi,scimGroupOnly:()=>ga,scimUserOnly:()=>fa});var pt=require("@budibase/backend-core");var vn=require("@budibase/types"),VN=(e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(pt.env.SELF_HOSTED&&pt.env.DEFAULT_LICENSE)return t.user.license=$n,r();t.user.license=await Ne.cache.getCachedLicense(t,{populateLicense:e.populateLicense,populateFreeLicense:e.populateFreeLicense}),e.checkUsersLimit&&(pt.utils.isServingApp(t)||pt.utils.isServingBuilder(t)||pt.utils.isServingBuilderPreview(t)||pt.utils.isPublicApiRequest(t))&&await ke.usageLimitIsExceeded(vn.StaticQuotaName.USERS,vn.QuotaUsageType.STATIC)}return r()},BA=VN;var N={};S(N,{requireFeature:()=>KN,requireFeatures:()=>YN});var KN=e=>async(t,r)=>{await za(e),await r()},YN=(...e)=>async(t,r)=>{await Do(e),await r()};var En=require("@budibase/backend-core");var Ai=async(e,t)=>(En.env.DISABLE_SCIM_CALLS||await xt.logRequest({...e.request.toJSON(),body:e.request.body}),await En.context.doInScimContext(async()=>{let r=await t();return await xt.logResponse({...e.response.toJSON(),body:e.response.body}),r}));var hi=async(e,t)=>{await Mo(),await t()};var NA=require("@budibase/backend-core");var fa=e=>bi(NA.users.getById,e,!0),ga=e=>bi(D.get,e,!0),Rn=e=>bi(D.get,e,!1);function bi(e,t,r){return async(a,n)=>{let o=a.params[t];return typeof o!="string"&&a.throw(404),!!(await e(o)).scimInfo?.isSync!==r&&a.throw(404),n()}}var Bi={};S(Bi,{ai:()=>ZA,appBackups:()=>Gh,auditLogs:()=>Th,environmentVariables:()=>Ih,groups:()=>lh,scim:()=>mb,users:()=>Ib});var YA=require("@budibase/types");var Ri={};S(Ri,{getLLM:()=>ma});var VA=require("@budibase/backend-core"),KA=require("@budibase/types");var vi=O(require("openai"));var ct=require("@budibase/types");var we=class e{constructor(t){this.messages=t}user(t){return this.messages.push({role:"user",content:t}),this}system(t){return this.messages.push({role:"system",content:t}),this}static user(t){return new e([{role:"user",content:t}])}static system(t){return new e([{role:"system",content:t}])}};function Si(e){return we.user(`Summarize this text:
|
|
38
|
+
`;n.write(s)}}),r.on("end",()=>{n.end()}),{promise:a,stream:n}}var ne=require("@budibase/backend-core");var sn=require("@budibase/types"),ua=require("@budibase/string-templates"),pa=require("@budibase/backend-core"),wT=pa.constants.MIN_VALID_DATE.toISOString(),vT=pa.constants.MAX_VALID_DATE.toISOString();function ps(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||wT,e.endDate=e.endDate||vT),e}async function ef(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(a=>pa.db.getProdAppID(a)));let t={};function r(a,n){n?.length&&(t.oneOf={...t.oneOf,[a]:n})}return 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=ps(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}function cs(e,t,r){let a={_id:e,status:sn.AuditLogResourceStatus.DELETED};switch(t){case"app":a.name=r?.appName;break;case"user":a.email=r?.email;break}return a}function ls(e){let t=(0,ua.findHBSBlocks)(e);for(let r of t){let a=` "${r}"`;e=e.replace(e.includes(a)?a:` ${r}`,""),e=(0,ua.processStringSync)(e,{})}return e}function tf(e,t){let r=sn.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let a=(0,ua.processStringSync)(r,t);return a.includes('""')&&(a=ls(r)),a}async function ET(e,t,r){if(!await Ja()||!ne.utils.isAudited(e))return;let a=tf(e,t),n=new Date;r?.timestamp&&(n=new Date(r.timestamp));let o={timestamp:n.toISOString(),event:e,name:a,userId:r?.userId||un.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){o.appId=ne.db.getProdAppID(r.appId);let s=await ne.cache.app.getAppMetadata(r.appId);"name"in s&&(i.appName=s.name)}if(r?.userId){let s=await ne.users.getById(r?.userId);i.email=s.email}}catch(s){ne.logging.logAlert("Failed to retrieve fallback information for audit log",s)}return o.fallback=i,await Xd(o)}async function RT(e){let t=e.map(s=>s.userId),a=e.filter(s=>s.appId).map(s=>ne.db.getDevAppID(s.appId)),n=await ne.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),o=await ne.db.getAppsByIDs([...new Set(a)]),i=[];for(let s of e){let c=n.find(g=>g?._id===s.userId),f=o.find(g=>ne.db.isSameAppID(g?.appId,s.appId)),m={event:s.event,timestamp:s.timestamp,name:s.name,metadata:s.metadata,user:c||cs(s.userId,"user",s.fallback)};s.appId&&(m.app=f||cs(s.appId,"app",s.fallback)),i.push(m)}return i}async function xT(e){if(!await Ja())throw new Error("Audit logs not available - license required.");let t=await ef(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await us(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await RT(r.rows)}}function _T(e){return e=ps(e),Zd(e)}function TT(){let e=Object.entries(un.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=ls(r[1]);return t}var pn={};S(pn,{applications:()=>ms,roles:()=>fs,users:()=>ds});var ds={};S(ds,{roleCheck:()=>OT});function PT(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}async function OT(e,t){return await Ke()||PT(e,t),e}var fs={};S(fs,{assign:()=>CT,unAssign:()=>qT});var ca=require("@budibase/backend-core");async function CT(e,t){if(!await Ke())throw new Error("Unable to assign roles - license required.");let r=await Fe.bulkGet(e);for(let a of r){if(t.role&&t.role.roleId){let n=ca.db.getProdAppID(t.role.appId);a.roles[n]=t.role.roleId}if(t.appBuilder){let n=ca.db.getProdAppID(t.appBuilder.appId),o=a.builder?.apps||[];a.builder={apps:o.concat([n])}}t.builder&&(a.builder={global:!0}),t.admin&&(a.admin={global:!0}),a.roles}await Fe.bulkUpdate(r)}async function qT(e,t){if(!await Ke())throw new Error("Unable to un-assign roles - license required.");let r=await Fe.bulkGet(e);for(let a of r){if(t.role){let n=ca.db.getProdAppID(t.role?.appId);a.roles[n]===t.role.roleId&&delete a.roles[n]}if(t.appBuilder&&a.builder?.apps){let n=ca.db.getProdAppID(t.appBuilder.appId);a.builder.apps=a.builder.apps.filter(o=>o!==n)}t.builder&&a.builder&&delete a.builder,t.admin&&a.admin&&delete a.admin}}var ms={};S(ms,{buildExportFn:()=>LT,buildImportFn:()=>UT});var gs=require("@budibase/backend-core");function UT(e){return async(t,r)=>{await Ke()||t.throw(403,"Endpoint unavailable, license required."),t.request.files?.appExport||t.throw(400,"Must provide app export file for import."),await gs.context.doInAppContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}function LT(e){return async(t,r)=>{await Ke()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:a,excludeRows:n}=t.request.body;await gs.context.doInAppContext(t.params.appId,async()=>{t.request.body={encryptPassword:a,excludeRows:n},t.query.appId=t.params.appId,await e(t),await r()})}}var je=require("@budibase/backend-core"),ae=require("@budibase/types");var ys=require("@budibase/backend-core"),rf;function af(){rf=new ys.queue.BudibaseQueue(ys.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}function Et(){return rf}var nf=require("path"),of=O(require("fs"));async function As(e,t={}){return be.storeAppBackupMetadata(e,t)}function sf(e){let t=new Date().toISOString();switch(e){case ae.AppBackupStatus.COMPLETE:case ae.AppBackupStatus.FAILED:return{timestamp:t,finishedAt:t};case ae.AppBackupStatus.STARTED:return{timestamp:t,startedAt:t};case ae.AppBackupStatus.PENDING:return{timestamp:t,createdAt:t}}}async function DT(e,t,r,a){let n=await cn(e);return await be.storeAppBackupMetadata({...n,...sf(t),contents:r,status:t,type:ae.AppBackupType.BACKUP},{filename:a,docId:e})}async function BT(e,t,r){let a=await cn(e);return await be.storeAppBackupMetadata({...a,...sf(r),status:r,type:ae.AppBackupType.RESTORE,trigger:ae.AppBackupTrigger.MANUAL},{docId:e,docRev:t})}async function cn(e){return be.getAppBackupMetadata(e)}async function NT(e,t){return be.updateAppBackupMetadata(e,t)}async function GT(e){let t=await be.getAppBackupMetadata(e);return t.filename&&await je.objectStore.deleteFile(je.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),be.deleteAppBackupMetadata(e)}async function MT(e,t){return be.fetchAppBackups(e,t)}async function uf(e){let t=await be.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let r=await je.objectStore.getReadStream(je.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}async function kT(e){let{stream:t}=await uf(e),r=(0,nf.join)(je.objectStore.budibaseTempDir(),je.utils.newid()),a=of.default.createWriteStream(r);return new Promise((n,o)=>{t.on("error",o),a.on("error",o),t.pipe(a).on("close",()=>n(r))})}async function FT(e,t,r={}){let a;try{a=await As({appId:e,trigger:t,timestamp:new Date().toISOString(),status:ae.AppBackupStatus.PENDING,type:ae.AppBackupType.BACKUP,...r})}catch(n){if(n.status===409)return;throw n}return await Et().add({docId:a.id,docRev:a.rev,appId:e,export:{trigger:t,...r}}),await je.events.backup.appBackupTriggered(e,a.id,ae.AppBackupType.BACKUP,t,r?.name),a.id}async function QT(e,t,r,a){let n=await cn(t),o;try{o=await As({appId:e,timestamp:new Date().toISOString(),status:ae.AppBackupStatus.PENDING,type:ae.AppBackupType.RESTORE,createdBy:a})}catch(i){if(i?.status===409)return;throw i}return await Et().add({appId:e,docId:o.id,docRev:o.rev,import:{nameForBackup:r,backupId:t,createdBy:a}}),{restoreId:o.id,metadata:n}}var jT={isEnabled:Bo,triggerAppRestore:ce(QT),triggerAppBackup:ce(FT),getBackupDownloadStream:ce(uf),downloadAppBackup:ce(kT),fetchAppBackups:ce(MT),storeAppBackupMetadata:ce(As),updateBackupStatus:ce(DT),updateRestoreStatus:ce(BT),getAppBackup:ce(cn),updateAppBackup:ce(NT),deleteAppBackup:ce(GT)},ze=jT;var bs={};S(bs,{init:()=>hs});var W=require("@budibase/backend-core");var Ce=require("@budibase/types");var rr=O(require("fs"));async function hs(e){Et().process(async t=>{let r=t.data;try{if(r.export)return VT(t,e);if(r.import)return $T(t,e)}catch(a){W.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,a)}})}async function WT(e){await W.db.getDB(e,{skip_setup:!0}).destroy()}async function pf(e,t,r,a){let n=W.db.getDevAppID(r),o=W.db.getProdAppID(r),i=new Date().toISOString(),s=async(c,f)=>{a?.doc?await ze.updateBackupStatus(a.doc.id,c,f?.contents,f?.filename):await ze.storeAppBackupMetadata({appId:o,timestamp:i,trigger:e,status:c,name:a?.name,type:Ce.AppBackupType.BACKUP,contents:f?.contents,createdBy:a?.createdBy},{filename:f?.filename})};try{let c=await a.processing.exportAppFn(n,{tar:!0}),f=await a.processing.statsFn(n),m=`${o}/backup-${i}.tar.gz`,g=W.objectStore.ObjectStoreBuckets.BACKUPS,y=rr.default.createReadStream(c);await W.objectStore.streamUpload({bucket:g,filename:m,stream:y,extra:{type:"application/gzip",metadata:{name:a?.name,trigger:e,timestamp:i,appId:o}}}),await s(Ce.AppBackupStatus.COMPLETE,{filename:m,contents:f}),rr.default.existsSync(c)&&rr.default.rmSync(c)}catch(c){W.logging.logAlert("App backup error",c),await s(Ce.AppBackupStatus.FAILED)}}async function $T(e,t){let r=e.data,a=r.appId,n=r.import.backupId,o=r.import.nameForBackup,i=r.import.createdBy,s=W.tenancy.getTenantIDFromAppID(a);return W.tenancy.doInTenant(s,async()=>{let c=W.db.getDevAppID(a),{rev:f}=await ze.updateRestoreStatus(r.docId,r.docRev,Ce.AppBackupStatus.STARTED);await pf(Ce.AppBackupTrigger.RESTORING,s,a,{processing:t,createdBy:i,name:o});let m=await ze.downloadAppBackup(n);await WT(c);let g=Ce.AppBackupStatus.COMPLETE;try{await t.importAppFn(c,W.db.getDB(c),{file:{type:"application/gzip",path:m},key:m})}catch(y){W.logging.logAlert("App restore error",y),g=Ce.AppBackupStatus.FAILED}await ze.updateRestoreStatus(r.docId,f,g),rr.default.existsSync(m)&&rr.default.rmSync(m,{force:!0})})}async function VT(e,t){let r=e.data,a=r.appId,n=r.export.trigger,o=r.export.name,i=W.tenancy.getTenantIDFromAppID(a);await W.tenancy.doInTenant(i,async()=>{try{let{rev:s}=await ze.updateBackupStatus(r.docId,Ce.AppBackupStatus.STARTED);return pf(n,i,a,{processing:t,doc:{id:r.docId,rev:s},name:o})}catch(s){W.logging.logAlert("App backup error",s)}})}var KT=async e=>{af(),await hs(e.processing)},Se={...ze,processing:bs,init:KT,getBackupQueue:Et};var cf=async e=>{e.backups&&await Se.init(e.backups)};var se={};S(se,{create:()=>kN,find:()=>MN,get:()=>GN,remove:()=>QN,update:()=>FN});var qA=O(gi()),Je=require("@budibase/backend-core");var UA=require("@budibase/types");async function GN(e){let t=Je.tenancy.getGlobalDB(),r=new Je.db.QueryBuilder(t.name,UA.SearchIndex.USER);r.setIndexBuilder(Je.db.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[n,o]of Object.entries(e.filters?.equal??{}))r.addEqual(n,o);r.setSort("_id"),r.setSkip(e.skip);let a=await r.run();return{users:a.rows,total:a.totalRows}}async function MN(e){return await Je.users.getById(e)}async function kN(e){let t=await Fe.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new Je.HTTPError("User is already synched",409);e={...t,scimInfo:(0,qA.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Fe.save(e,{requirePassword:!1})}async function FN(e,t){return await Fe.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}async function QN(e){return await Fe.destroy(e)}var ur={};S(ur,{create:()=>jN});var LA=O(gi());var DA=require("@budibase/backend-core");async function jN(e){let t=await jn(e.name),r;if(!t)r=(await M.save(e)).id;else{if(t.scimInfo?.isSync)throw new DA.HTTPError("Group is already synched",409);r=t._id,t.users&&(await M.removeUsers(r,t.users.map(n=>n._id)),delete t.users),t.scimInfo=(0,LA.default)(t.scimInfo,e.scimInfo),await M.save(t)}return await M.get(r)}var xt={};S(xt,{logRequest:()=>WN,logResponse:()=>$N});var mi=require("@budibase/backend-core");async function WN(e){mi.logging.logWarn("SCIM request log",e)}async function $N(e){mi.logging.logWarn("SCIM response error",e)}var Ii={};S(Ii,{doInScimContext:()=>Ai,feature:()=>N,internalGroupOnly:()=>Rn,licensing:()=>BA,requireSCIM:()=>hi,scimGroupOnly:()=>ga,scimUserOnly:()=>fa});var pt=require("@budibase/backend-core");var vn=require("@budibase/types"),VN=(e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(pt.env.SELF_HOSTED&&pt.env.DEFAULT_LICENSE)return t.user.license=$n,r();t.user.license=await Ne.cache.getCachedLicense(t,{populateLicense:e.populateLicense,populateFreeLicense:e.populateFreeLicense}),e.checkUsersLimit&&(pt.utils.isServingApp(t)||pt.utils.isServingBuilder(t)||pt.utils.isServingBuilderPreview(t)||pt.utils.isPublicApiRequest(t))&&await ke.usageLimitIsExceeded(vn.StaticQuotaName.USERS,vn.QuotaUsageType.STATIC)}return r()},BA=VN;var N={};S(N,{requireFeature:()=>KN,requireFeatures:()=>YN});var KN=e=>async(t,r)=>{await za(e),await r()},YN=(...e)=>async(t,r)=>{await Do(e),await r()};var En=require("@budibase/backend-core");var Ai=async(e,t)=>(En.env.DISABLE_SCIM_CALLS||await xt.logRequest({...e.request.toJSON(),body:e.request.body}),await En.context.doInScimContext(async()=>{let r=await t();return await xt.logResponse({...e.response.toJSON(),body:e.response.body}),r}));var hi=async(e,t)=>{await Mo(),await t()};var NA=require("@budibase/backend-core");var fa=e=>bi(NA.users.getById,e,!0),ga=e=>bi(D.get,e,!0),Rn=e=>bi(D.get,e,!1);function bi(e,t,r){return async(a,n)=>{let o=a.params[t];return typeof o!="string"&&a.throw(404),!!(await e(o)).scimInfo?.isSync!==r&&a.throw(404),n()}}var Bi={};S(Bi,{ai:()=>ZA,appBackups:()=>Gh,auditLogs:()=>Th,environmentVariables:()=>Ih,groups:()=>lh,scim:()=>mb,users:()=>Ib});var YA=require("@budibase/types");var Ri={};S(Ri,{getLLM:()=>ma});var VA=require("@budibase/backend-core"),KA=require("@budibase/types");var vi=O(require("openai"));var ct=require("@budibase/types");var we=class e{constructor(t){this.messages=t}user(t){return this.messages.push({role:"user",content:t}),this}system(t){return this.messages.push({role:"system",content:t}),this}static user(t){return new e([{role:"user",content:t}])}static system(t){return new e([{role:"system",content:t}])}};function Si(e){return we.user(`Summarize this text:
|
|
39
39
|
${e}.
|
|
40
40
|
Only return the summary.`)}function GA(e,t){return we.user(`Return the category of this text: "${e}". Based on these categories: ${t.join(", ")}. Only return the category.`)}function MA(e){return we.user(`Clean the following string: "${e}". Remove any spelling mistakes or data issues. Only return the cleaned string itself and nothing else.`)}function kA(e){return we.user(`Generate a node-cron compatible expression based on the following prompt. Return only the cron expression (without backticks), and if not possible return only 'Error generating cron' with a short explanation:
|
|
41
41
|
${e}`)}function FA(e,t){return we.user(`Translate the following text: "${e}" into ${t}. Only return the translation.`)}function QA(e){return we.user(`Return the sentiment of this text: "${e}". Only return the sentiment.`)}function jA(e){return we.user(`Search the web for the following: "${e}". Only return the top results.`)}function WA(e,t){let r="You do not have access to any bindings in this request.";e&&e.length>0&&(r=`The bindings you have access to are:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { queue } from "@budibase/backend-core";
|
|
2
2
|
import { AppBackupQueueData } from "@budibase/types";
|
|
3
3
|
export declare function init(): void;
|
|
4
|
-
export declare function getBackupQueue(): queue.
|
|
4
|
+
export declare function getBackupQueue(): queue.BudibaseQueue<AppBackupQueueData>;
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"dist"
|
|
5
5
|
],
|
|
6
6
|
"license": "UNLICENSED",
|
|
7
|
-
"version": "3.7.
|
|
7
|
+
"version": "3.7.4",
|
|
8
8
|
"description": "Budibase Pro (Backend)",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"types": "dist/index.d.ts",
|
|
@@ -72,5 +72,5 @@
|
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
},
|
|
75
|
-
"gitHead": "
|
|
75
|
+
"gitHead": "ce3a08a254779376de9dce7a6e121528e324a54e"
|
|
76
76
|
}
|