@budibase/pro 3.19.0 → 3.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. 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 Kr(e){return vo.default.verify(e,hS,{algorithms:["RS256"]})}a(Kr,"verifyLicenseToken");function yS(e,t){return vo.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}a(yS,"sign");var Ha={};T(Ha,{getFeatures:()=>_o});var l=require("@budibase/types");var AS={[l.PlanType.FREE]:[...be.SELF_FREE_LICENSE.features],[l.PlanType.PREMIUM]:void 0,[l.PlanType.PREMIUM_PLUS]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.PREMIUM_PLUS_TRIAL]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.PRO]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS],[l.PlanType.TEAM]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS],[l.PlanType.BUSINESS]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.ENTERPRISE_BASIC]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.BUDIBASE_AI,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC],[l.PlanType.ENTERPRISE_BASIC_TRIAL]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.BUDIBASE_AI,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC],[l.PlanType.ENTERPRISE]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.BUDIBASE_AI,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC]},bS={[l.PlanType.FREE]:[...be.CLOUD_FREE_LICENSE.features],[l.PlanType.PREMIUM]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.PDF],[l.PlanType.PREMIUM_PLUS]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.BUDIBASE_AI,l.Feature.PDF],[l.PlanType.PREMIUM_PLUS_TRIAL]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.BUDIBASE_AI,l.Feature.PDF],[l.PlanType.PRO]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING],[l.PlanType.TEAM]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING],[l.PlanType.BUSINESS]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.BUDIBASE_AI,l.Feature.PDF],[l.PlanType.ENTERPRISE_BASIC]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC],[l.PlanType.ENTERPRISE_BASIC_TRIAL]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC],[l.PlanType.ENTERPRISE]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC]};function _o(e,t){let r=[];function n(o){let s=o[t];if(!s)throw new Error(`Features do not exist for planType=${t} and hosting=${e}`);return s}switch(a(n,"readFeatures"),e){case l.Hosting.SELF:r=n(AS);break;case l.Hosting.CLOUD:r=n(bS);break}return r}a(_o,"getFeatures");var Ya={};T(Ya,{UNLIMITED:()=>f,getQuotas:()=>xo});var G=require("@budibase/types");var d=et,Sc=be,f=-1,Hr=a(e=>e*1e6,"millions"),IS={[G.PlanType.FREE]:{...Sc.CLOUD_FREE_LICENSE.quotas},[G.PlanType.PREMIUM]:{usage:{monthly:{...d.queries(f),...d.automations(1e3),...d.budibaseAICredits(0),...d.actions(f)},static:{...d.rows(1e4),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(0),...d.plugins(f),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(7),...d.appBackupRetentionDays(7)}},[G.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...d.queries(f),...d.automations(5e3),...d.budibaseAICredits(Hr(2)),...d.actions(f)},static:{...d.rows(25e3),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(0),...d.plugins(f),...d.customAIConfigurations(1)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(30)}},[G.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...d.queries(f),...d.automations(5e3),...d.budibaseAICredits(Hr(2)),...d.actions(f)},static:{...d.rows(25e3),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(0),...d.plugins(f),...d.customAIConfigurations(1)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(30)}},[G.PlanType.PRO]:{usage:{monthly:{...d.queries(f),...d.automations(1e3),...d.budibaseAICredits(0),...d.actions(f)},static:{...d.rows(f),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(5),...d.plugins(f),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(7),...d.appBackupRetentionDays(7)}},[G.PlanType.TEAM]:{usage:{monthly:{...d.queries(f),...d.automations(5e3),...d.budibaseAICredits(0),...d.actions(f)},static:{...d.rows(f),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(10),...d.plugins(f),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(90)}},[G.PlanType.BUSINESS]:{usage:{monthly:{...d.queries(f),...d.automations(1e4),...d.budibaseAICredits(0),...d.actions(f)},static:{...d.rows(5e4),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(50),...d.plugins(f),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(365),...d.appBackupRetentionDays(365)}},[G.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...d.queries(f),...d.automations(f),...d.budibaseAICredits(Hr(4)),...d.actions(f)},static:{...d.rows(f),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(f),...d.plugins(f),...d.customAIConfigurations(f)}},constant:{...d.automationLogRetentionDays(f),...d.appBackupRetentionDays(f)}},[G.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...d.queries(f),...d.automations(f),...d.budibaseAICredits(Hr(4)),...d.actions(f)},static:{...d.rows(f),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(f),...d.plugins(f),...d.customAIConfigurations(f)}},constant:{...d.automationLogRetentionDays(15),...d.appBackupRetentionDays(15)}},[G.PlanType.ENTERPRISE]:{usage:{monthly:{...d.queries(f),...d.automations(f),...d.budibaseAICredits(Hr(4)),...d.actions(f)},static:{...d.rows(f),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(f),...d.plugins(f),...d.customAIConfigurations(f)}},constant:{...d.automationLogRetentionDays(f),...d.appBackupRetentionDays(f)}}},SS={[G.PlanType.FREE]:{...Sc.SELF_FREE_LICENSE.quotas},[G.PlanType.PREMIUM]:void 0,[G.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...d.queries(f),...d.automations(f),...d.budibaseAICredits(0),...d.actions(f)},static:{...d.rows(f),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(0),...d.plugins(f),...d.customAIConfigurations(1)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(30)}},[G.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...d.queries(f),...d.automations(f),...d.budibaseAICredits(0),...d.actions(f)},static:{...d.rows(f),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(0),...d.plugins(f),...d.customAIConfigurations(1)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(30)}},[G.PlanType.PRO]:{usage:{monthly:{...d.queries(f),...d.automations(f),...d.budibaseAICredits(0),...d.actions(f)},static:{...d.rows(f),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(5),...d.plugins(f),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(7),...d.appBackupRetentionDays(7)}},[G.PlanType.TEAM]:{usage:{monthly:{...d.queries(f),...d.automations(f),...d.budibaseAICredits(0),...d.actions(f)},static:{...d.rows(f),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(10),...d.plugins(f),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(90)}},[G.PlanType.BUSINESS]:{usage:{monthly:{...d.queries(f),...d.automations(f),...d.budibaseAICredits(0),...d.actions(f)},static:{...d.rows(f),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(50),...d.plugins(f),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(90),...d.appBackupRetentionDays(365)}},[G.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...d.queries(f),...d.automations(f),...d.budibaseAICredits(0),...d.actions(f)},static:{...d.rows(f),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(f),...d.plugins(f),...d.customAIConfigurations(f)}},constant:{...d.automationLogRetentionDays(f),...d.appBackupRetentionDays(f)}},[G.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...d.queries(f),...d.automations(f),...d.budibaseAICredits(0),...d.actions(f)},static:{...d.rows(f),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(f),...d.plugins(f),...d.customAIConfigurations(f)}},constant:{...d.automationLogRetentionDays(15),...d.appBackupRetentionDays(15)}},[G.PlanType.ENTERPRISE]:{usage:{monthly:{...d.queries(f),...d.automations(f),...d.budibaseAICredits(0),...d.actions(f)},static:{...d.rows(f),...d.apps(f),...d.users(f),...d.creators(f),...d.userGroups(f),...d.plugins(f),...d.customAIConfigurations(f)}},constant:{...d.automationLogRetentionDays(f),...d.appBackupRetentionDays(f)}}};function xo(e,t){let r;function n(o){let s=o[t];if(!s)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return s}switch(a(n,"readQuotas"),e){case G.Hosting.SELF:r=n(SS);break;case G.Hosting.CLOUD:r=n(IS);break}return JSON.parse(JSON.stringify(r))}a(xo,"getQuotas");var Kt={};T(Kt,{encoding:()=>$t,workspaceExists:()=>wS});var wc=require("@budibase/backend-core");async function wS(e){return(await wc.db.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}a(wS,"workspaceExists");var $t={};T($t,{base64ToObject:()=>ES,objectToBase64:()=>TS});function TS(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}a(TS,"objectToBase64");function ES(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}a(ES,"base64ToObject");var of=require("@budibase/types"),or=require("@budibase/backend-core"),sf=U(Bl()),uf=U(rs());async function Z_(e){await ve.save({offlineLicenseToken:e}),await xt()}a(Z_,"activateOfflineLicenseToken");async function ex(){await ve.save({offlineLicenseToken:void 0}),await xt()}a(ex,"deleteOfflineLicenseToken");async function cf(){return(await ve.get()).offlineLicenseToken}a(cf,"getOfflineLicenseToken");async function as(){let t=(await or.installation.getInstall()).installId,r=or.context.getTenantId(),n=await or.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:n}}a(as,"getIdentifier");async function tx(){let e=await as();return $t.objectToBase64(e)}a(tx,"getIdentifierBase64");function rx(e){return $t.base64ToObject(e)}a(rx,"getIdentifierFromBase64");function pf(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}a(pf,"verifyExpiry");async function lf(e){let t=await as();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}a(lf,"verifyInstallation");function df(e){let t=e.plan.type,r=of.Hosting.SELF,n=_o(r,t),o=xo(r,t);return e.features=(0,sf.default)(e.features,n),e.quotas=(0,uf.default)(e.quotas,o),e}a(df,"enrichLicense");async function ns(){try{let e=await cf();if(e){let t=await Kr(e);return pf(t),await lf(t),df(t)}}catch(e){console.error("Error retrieving offline license",e)}}a(ns,"getOfflineLicense");var fa={};T(fa,{deleteDevLicense:()=>ix,getOfflineLicense:()=>ox,writeDevLicenseToDisk:()=>sx});var ff=require("@budibase/backend-core"),ss=require("path"),mf=require("os"),Ct=U(require("fs"));var ax=ff.env.isTest()?".budibase-test":".budibase",os=(0,ss.join)((0,mf.tmpdir)(),ax),nx="dev_license.txt",da=(0,ss.join)(os,nx);if(!Ct.default.existsSync(os))try{Ct.default.mkdirSync(os)}catch{}function ox(){try{if(Ct.default.existsSync(da)){let e=Ct.default.readFileSync(da,{encoding:"utf-8"});return Kr(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}a(ox,"getOfflineLicense");function sx(e){console.log(`Writing license to: ${da}`),Ct.default.writeFileSync(da,e,{encoding:"utf-8"})}a(sx,"writeDevLicenseToDisk");function ix(){Ct.default.rmSync(da,{force:!0})}a(ix,"deleteDevLicense");var gf=require("dd-trace");var us=a(async()=>await gf.tracer.trace("getLicense",async e=>{if(is.env.OFFLINE_MODE)return e.addTags({offline:!0}),ns();let t=await Qt();return t||(e.addTags({offlineFallback:!0}),t=fa.getOfflineLicense()),t}),"getLicense"),cs=a(e=>Eo(e),"getLicenseFromKey"),ps=a(()=>is.env.SELF_HOSTED?be.SELF_FREE_LICENSE:be.CLOUD_FREE_LICENSE,"getFreeLicense");var ds={};T(ds,{activateLicenseKey:()=>ux,deleteLicenseKey:()=>cx,getLicenseKey:()=>dn});var ls=U(require("dd-trace"));async function ux(e){await Ro(e),await ve.save({licenseKey:e}),await xt()}a(ux,"activateLicenseKey");async function dn(){return await ls.default.trace("getLicenseKey",async e=>{let t=await ve.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}a(dn,"getLicenseKey");async function cx(){return await ls.default.trace("deleteLicenseKey",async()=>{await ve.save({licenseKey:void 0}),await xt()})}a(cx,"deleteLicenseKey");var Ot=require("@budibase/backend-core"),fn=U(require("dd-trace"));var hf=3600,xt=a(async()=>{await bf(),await Af()},"refresh"),yf=a(async(e,t)=>{let{populateLicense:r=us,populateFreeLicense:n=ps}=t||{};return await fn.default.trace("getCachedLicense",async o=>{let s=Ot.context.getLicense();if(s)return o.addTags({foundInContext:!0,features:s.features,plan:s.plan,quotas:s.quotas}),s;let i=Ot.tenancy.getTenantId(),u=await uo(),c=await u.get(i);return o.addTags({tenantId:i,foundInCache:!!c}),c?(o.addTags({foundInCache:!0,refreshedAt:c.refreshedAt,features:c.features,plan:c.plan,quotas:c.quotas}),c):(c=await fn.default.trace("populateLicense",async()=>await r(i)),o.addTags({populatedLicense:!!c}),c||(c=fn.default.trace("populateFreeLicense",()=>n(e,i)),o.addTags({populatedFreeLicense:!!c})),c.refreshedAt=new Date().toISOString(),o.addTags({refreshedAt:c.refreshedAt,features:c.features,plan:c.plan,quotas:c.quotas,expirySeconds:hf}),await u.store(i,c,hf),c)})},"_getCachedLicense");Ot.env.isJest()&&(yf=jest.fn());var Af=yf,bf=a(async()=>{let e=Ot.tenancy.getTenantId();await(await uo()).delete(e)},"invalidate");async function re(e,t){Array.isArray(e)||(e=[e]),t||(t=await ke.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}a(re,"areFeaturesEnabled");async function mn(e,t){if(!await re(e,t))throw new tt.FeatureDisabledError(`${e} is not currently enabled`,e)}a(mn,"checkFeature");async function fs(e,t){if(!await re(e,t)){let r=e.join(", ");throw new tt.FeatureDisabledError(`${r} are not currently enabled`,r)}}a(fs,"checkFeatures");function le(e){return async(...t)=>(await mn(te.Feature.WORKSPACE_BACKUPS),e(...t))}a(le,"checkBackups");async function ms(){return re(te.Feature.WORKSPACE_BACKUPS)}a(ms,"isBackupsEnabled");async function gs(){return re(te.Feature.BRANDING)}a(gs,"isBrandingEnabled");async function If(){return re(te.Feature.ENFORCEABLE_SSO)}a(If,"isEnforceableSSO");async function lx(){return re(te.Feature.SYNC_AUTOMATIONS)}a(lx,"isSyncAutomationsEnabled");async function dx(){return re(te.Feature.TRIGGER_AUTOMATION_RUN)}a(dx,"isTriggerAutomationRunEnabled");async function hs(){return re(te.Feature.APP_BUILDERS)}a(hs,"isAppBuildersEnabled");async function gn(){return re(te.Feature.AUDIT_LOGS)}a(gn,"isAuditLogsEnabled");async function ys(){return re(te.Feature.USER_GROUPS)}a(ys,"isUserGroupsEnabled");function fx(){return re(te.Feature.PWA)}a(fx,"isPWAEnabled");function mx(){return re(te.Feature.RECAPTCHA)}a(mx,"isRecaptchaEnabled");var gx=a(()=>re(te.Feature.PKCE_OIDC),"isPkceOidcEnabled");async function rt(){return re(te.Feature.EXPANDED_PUBLIC_API)}a(rt,"isExpandedPublicApiEnabled");async function hx(e){if(tt.env.ENABLE_SSO_MAINTENANCE_MODE||!await If())return!1;let r;return e?.config?r=e.config:r=await tt.configs.getSettingsConfig(),!!r.isSSOEnforced}a(hx,"isSSOEnforced");var As=a(async()=>{let e=te.Feature.SCIM,t=await re(e),r=await tt.configs.getSCIMConfig();if(!t||!r?.enabled)throw new tt.FeatureDisabledError(`${e} is not currently enabled`,e);return!0},"checkSCIM");async function yx(){return re(te.Feature.VIEW_PERMISSIONS)}a(yx,"isViewPermissionEnabled");async function Ax(){return re(te.Feature.VIEW_READONLY_COLUMNS)}a(Ax,"isViewReadonlyColumnsEnabled");var bx={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 Ix(e){return await gs()?{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}:bx}a(Ix,"getBrandingConfig");var Is={};T(Is,{enrichAIConfig:()=>bs});var Sf=require("@budibase/backend-core");var Sx="budibase_ai";async function bs(e){if(Sf.env.SELF_HOSTED)return e;for(let t of Object.values(e.config))if(t.provider==="BudibaseAI")return e;return e.config[Sx]={provider:"BudibaseAI",active:!0,isDefault:Object.keys(e.config).every(t=>!e.config[t].isDefault),defaultModel:process.env.BUDIBASE_AI_DEFAULT_MODEL||"gpt-5-mini",name:"Budibase AI"},e}a(bs,"enrichAIConfig");var Ye={};T(Ye,{addAction:()=>vx,addApp:()=>_x,addAutomation:()=>Ux,addGroup:()=>ws,addPlugin:()=>Es,addRow:()=>Cx,addRows:()=>Lx,addUsers:()=>bn,bustCache:()=>go,decrement:()=>at,decrementMany:()=>ma,getCurrentUsageValues:()=>Yu,getLicensedQuota:()=>Tf,getQuotaUsage:()=>Tt,increment:()=>Se,incrementBudibaseAICredits:()=>Sn,incrementMany:()=>Pt,removeApp:()=>xx,removeGroup:()=>Ts,removePlugin:()=>Rs,removeRow:()=>Ox,removeRows:()=>Px,removeUsers:()=>cr,set:()=>Ss,setAllUsage:()=>yo,setAppUsageValue:()=>ho,setUsage:()=>Ku,setUsagePerApp:()=>Vu,updatePluginCount:()=>vs,updateUsage:()=>sr,usageLimitIsExceeded:()=>Rx,utils:()=>vr});var yn=require("@budibase/types");var Be=require("@budibase/backend-core"),z=require("@budibase/types"),Lt=require("dd-trace");var Se=a(async(e,t,r)=>await Lt.tracer.trace("quotas.increment",async n=>(n.addTags({name:e,type:t}),await wf({change:1,name:e,type:t,opts:r}))),"increment"),Pt=a(e=>Lt.tracer.trace("quotas.incrementMany",async()=>wf(e)),"incrementMany"),wf=a(async e=>await Lt.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await sr(r.map(o=>({usageChange:o.change,name:o.name,type:o.type,opts:{dryRun:!0,suppressErrorLog:o.opts?.suppressErrorLog,id:o.opts?.id}})));let n=[];for(let o of r)await Lt.tracer.trace("quotas.incrementMany.fn",async s=>{s.addTags({actionName:o.name,actionType:o.type,actionChange:o.change});let i=o.opts?.fn;i&&n.push(await i())});return await sr(r.map(o=>({usageChange:o.change,name:o.name,type:o.type,opts:{dryRun:!1,valueFn:o.opts?.valueFn,suppressErrorLog:o.opts?.suppressErrorLog,id:o.opts?.id}}))),n[0]}),"tryIncrement"),at=a((e,t,r={})=>sr({usageChange:-1,name:e,type:t,opts:r}),"decrement"),ma=a(e=>{let t=Array.isArray(e)?e:[e];return sr(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),Ss=a(async(e,t,r)=>je.setUsage(r,e,t),"set"),wx=a((e,t,r)=>{if(e==z.QuotaUsageType.STATIC){let n=r.usageQuota.triggers;return n?n[t]||{}:{}}else{let n=je.utils.getCurrentMonthString(),o=r.monthly[n].triggers;return o?o[t]||{}:{}}},"getExistingTriggers"),Tx=a(async(e,t,r,n)=>{try{await Be.locks.doWithLock({type:z.LockType.TRY_ONCE,name:z.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let o={percentage:r,name:t.name};n&&(o.resetDate=n),await mt.triggerQuota(o)})}catch(o){Be.logging.logAlert("Error triggering quota",o)}},"triggerQuota"),Ex=a(async(e,t,r,n)=>{let o=await Tt(),s=e===z.QuotaUsageType.MONTHLY?o.quotaReset:void 0,i=await wx(e,t,o),u=n.triggers,c=r/n.value*100;c>100&&(c=100);for(let[m,g]of u.entries())if(c>=g&&n.value!==et.UNLIMITED){if(!i[g]){i[g]=new Date().toISOString();let y=u[m+1]||100;(!(c>=y)||c===g)&&await Tx(t,n,c,s)}}else i[g]=void 0;return i},"checkTriggers"),sr=a(async e=>{await Lt.tracer.trace("quotas.updateUsage",async t=>{let r=Be.tenancy.getTenantId(),n=Array.isArray(e)?e:[e];t.addTags({numActions:n.length,tenantId:r});let o,s,i=[],u={},c={},m={},g={};for(let y of n)await Lt.tracer.trace("quotas.updateUsage.action",async S=>{S.addTags({actionName:y.name,actionType:y.type,actionUsageChange:y.usageChange});try{o=Be.context.getWorkspaceId()}catch{}if(z.APP_QUOTA_NAMES.includes(y.name)&&!o)throw new Error("App context required for quota update");try{s=await Tf(z.QuotaType.USAGE,y.name,y.type),i.push(s);let{total:x,app:_,breakdown:v}=await je.getCurrentUsageValues(y.type,y.name,y.opts?.id);x+=y.usageChange,_!=null&&(_+=y.usageChange),v!=null&&(v+=y.usageChange);let q={};if(y.opts?.dryRun||(q=await Ex(y.type,y.name,x,s),g={...g,[y.name]:q}),s.value!==et.UNLIMITED&&x>s.value&&y.usageChange>0)throw new Be.UsageLimitError(`Licensed ${s.name} of ${s.value} has been exceeded`,s.name);if(x=Math.max(0,x),_&&(_=Math.max(0,_)),v&&(v=Math.max(0,v),m={...m,[y.name]:v}),!y.opts?.dryRun){let Ue=y.opts?.valueFn;Ue&&(x=await Ue(),_=x),u={...u,[y.name]:x},c={...c,[y.name]:_}}}catch(x){throw y.opts?.suppressErrorLog||console.error(`Error updating usage quotas for ${y.name}`,x),x}});let h=n.filter(y=>!y.opts?.dryRun).map(y=>({name:y.name,type:y.type,values:{total:u[y.name],app:c[y.name],breakdown:m[y.name],triggers:g[y.name]},opts:{...y.opts,tenantId:r}}));h.length>0&&await je.setAllUsage(h)})},"updateUsage"),Tf=a(async(e,t,r)=>{let n=await ke.getCachedLicense();if(!n){let o=Be.tenancy.getTenantId();throw new Error("License not found for tenant id "+o)}if(r&&(0,z.isStaticQuota)(e,r,t))return n.quotas[e][r][t];if(r&&(0,z.isMonthlyQuota)(e,r,t))return n.quotas[e][r][t];if((0,z.isConstantQuota)(e,t))return n.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),Rx=a(async({name:e,type:t,usageChange:r})=>{try{return await sr({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(n){if(n.code===z.ErrorCode.USAGE_LIMIT_EXCEEDED)return!0;throw n}},"usageLimitIsExceeded");var vx=a(async e=>Se(yn.MonthlyQuotaName.ACTIONS,yn.QuotaUsageType.MONTHLY,{fn:e}),"addAction");var Ef=require("@budibase/backend-core"),ir=require("@budibase/types");var Rf=a(async()=>{let e=await Ef.db.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),_x=a(async(e,{appId:t}={})=>Se(ir.StaticQuotaName.WORKSPACES,ir.QuotaUsageType.STATIC,{fn:e,valueFn:Rf,id:t}),"addApp"),xx=a(async({appId:e}={})=>at(ir.StaticQuotaName.WORKSPACES,ir.QuotaUsageType.STATIC,{valueFn:Rf,id:e}),"removeApp");var Ve=require("@budibase/types");var Cx=a(async(e,{tableId:t}={})=>Se(Ve.StaticQuotaName.ROWS,Ve.QuotaUsageType.STATIC,{fn:e,id:t}),"addRow"),Ox=a(async({tableId:e}={})=>at(Ve.StaticQuotaName.ROWS,Ve.QuotaUsageType.STATIC,{id:e}),"removeRow"),Lx=a(async(e,t,{tableId:r}={})=>Pt({change:e,name:Ve.StaticQuotaName.ROWS,type:Ve.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),"addRows"),Px=a(async(e,{tableId:t}={})=>ma({change:e,name:Ve.StaticQuotaName.ROWS,type:Ve.QuotaUsageType.STATIC,opts:{id:t}}),"removeRows");var An=require("@budibase/types");var Ux=a(async(e,{automationId:t}={})=>Se(An.MonthlyQuotaName.AUTOMATIONS,An.QuotaUsageType.MONTHLY,{fn:e,id:t}),"addAutomation");var ur=require("@budibase/types");var ws=a(async e=>Se(ur.StaticQuotaName.USER_GROUPS,ur.QuotaUsageType.STATIC,{fn:e}),"addGroup"),Ts=a(async()=>at(ur.StaticQuotaName.USER_GROUPS,ur.QuotaUsageType.STATIC),"removeGroup");var At=require("@budibase/types");var Es=a(async e=>Se(At.StaticQuotaName.PLUGINS,At.QuotaUsageType.STATIC,{fn:e}),"addPlugin"),Rs=a(async()=>at(At.StaticQuotaName.PLUGINS,At.QuotaUsageType.STATIC),"removePlugin"),vs=a(async e=>Ss(At.StaticQuotaName.PLUGINS,At.QuotaUsageType.STATIC,e),"updatePluginCount");var He=require("@budibase/types"),ga=require("@budibase/backend-core");var bn=a(async(e,t,r)=>{let n=[{change:e,name:He.StaticQuotaName.USERS,type:He.QuotaUsageType.STATIC,opts:{fn:r,valueFn:ga.users.getUserCount}}];t>0&&n.push({change:t,name:He.StaticQuotaName.CREATORS,type:He.QuotaUsageType.STATIC,opts:{valueFn:ga.users.getCreatorCount}});let o=await Pt(n);return await Qt(),o},"addUsers"),cr=a(async(e,t)=>{let r=[{change:e,name:He.StaticQuotaName.USERS,type:He.QuotaUsageType.STATIC,opts:{valueFn:ga.users.getUserCount}}];t>0&&r.push({change:t,name:He.StaticQuotaName.CREATORS,type:He.QuotaUsageType.STATIC,opts:{valueFn:ga.users.getCreatorCount}}),await ma(r),await Qt()},"removeUsers");var In=require("@budibase/types");var Sn=a(async e=>Pt({change:e,name:In.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:In.QuotaUsageType.MONTHLY}),"incrementBudibaseAICredits");var Rn={};T(Rn,{db:()=>Ce});var Os=require("@budibase/backend-core");var Q={};T(Q,{addUsers:()=>En,adjustGroupCreatorsQuotas:()=>Nx,cleanupApp:()=>Dx,enrichUserRolesFromGroups:()=>kx,fetch:()=>ha,get:()=>pr,getBulk:()=>Pf,getGroupBuilderAppIds:()=>Lf,getGroupRoleId:()=>qx,remove:()=>_s,removeUsers:()=>xs,save:()=>Tn,updateGroupApps:()=>Cs});var C=require("@budibase/backend-core");var vf=require("@budibase/backend-core");var wn=class extends vf.HTTPError{static{a(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}};async function Cf(e,t){try{let r=[];for(let u of e)if(u.roles){let c=u.roles[C.db.getProdWorkspaceID(t)];c&&r.push(c)}let n=await Promise.all(r.map(async u=>({[u]:await C.roles.roleToNumber(u)}))),o,s,i={};n.forEach(u=>{let[c,m]=Object.entries(u)[0];i[c]={roleId:c,roleNum:m}});for(let{roleId:u,roleNum:c}of Object.values(i))(s===void 0||c>s)&&(s=c,o=u);return o}catch(r){throw C.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}a(Cf,"findHighestRole");async function Of(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await M.getBulk(e,{enriched:!1}),t}a(Of,"groupList");async function Lf(e,t){if(!e.userGroups)return[];let r=await Of(e.userGroups,t?.groups),n=t?.appId?C.db.getProdWorkspaceID(t?.appId):null,o=[];for(let s of r){let i=s.builder?.apps;n&&i?.includes(n)?o.push(n):n||(o=o.concat(i||[]))}return[...new Set(o)]}a(Lf,"getGroupBuilderAppIds");async function qx(e,t,r){if(!e.userGroups)return null;let n=await Of(e.userGroups,r?.groups),o=C.db.getProdWorkspaceID(t);return e.roles?.[o]?e.roles[o]:(n=n.filter(s=>s?.roles?Object.keys(s.roles).includes(o):!1),await Cf(n,t))}a(qx,"getGroupRoleId");async function kx(e){if(!e||!e.userGroups)return e;let t=await Pf(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 C.context.doInWorkspaceContext(o,async()=>{if(e.roles[o])return;let s=await Cf(t,o);s&&(e.roles[o]=s)});let n=await Lf(e,{groups:t});if(n.length&&!e.builder?.global){let o=e.builder?.apps||[];e.builder={apps:o.concat(n)}}return e}a(kx,"enrichUserRolesFromGroups");async function ha(){return await M.fetch()}a(ha,"fetch");async function pr(e){return await M.get(e)}a(pr,"get");async function Pf(e,t={enriched:!0}){return await M.getBulk(e,t)}a(Pf,"getBulk");async function _f(e){if(await M.getByName(e))throw new wn(e)}a(_f,"guardNameAvailability");async function xf(e){let t=await M.getGroupUsers(e._id);if(!t.length)return 0;let n=await C.tenancy.getGlobalDB().getMultiple(t.map(s=>s._id));return(await C.userUtils.creatorsInList(n)).filter(s=>s).length}a(xf,"getCreatorsCountInGroup");async function Tn(e){let t=[],r=!e._id,n=0;if(delete e.users,!e._id)e._id=M.generateUserGroupID(),await _f(e.name),t.push(C.events.group.created(e));else{let s=await M.get(e._id);if(s.name!==e.name&&await _f(e.name),t.push(C.events.group.updated(e)),JSON.stringify(s.roles)!==JSON.stringify(e.roles)){let i=s.users?.length||0,u=0;i>0&&(u=await xf(s)),Object.values(e.roles).includes("CREATOR")?n=i-u:n=-i,t.push(C.events.group.permissionsEdited(e))}}await Promise.all(t);let o=a(()=>M.save(e),"saveGroup");if(r)return await ws(o);{let s=await o();if(n>0)await bn(0,n);else if(n<0){let i=await xf(e),u=Math.abs(n)-i;u>0&&await cr(0,u)}return s}}a(Tn,"save");async function _s(e,t){let r;try{r=await M.get(e)}catch{throw new Error("Group not found")}let n=Object.values(r.roles||{}).includes("CREATOR"),o=a(()=>{},"recalculateCreatorsQuotasFn");if(n){let i=C.tenancy.getGlobalDB(),u=await M.getGroupUsers(e),m=(await Promise.all(u.map(S=>i.get(S._id)))).map(S=>({...S,userGroups:S.userGroups.filter(O=>O!==e)})),h=(await C.userUtils.creatorsInList(m)).filter(S=>S).length,y=u.length-h;y&&(o=a(()=>cr(0,y),"recalculateCreatorsQuotasFn"))}let s=await M.destroy(e,t);return await C.events.group.deleted(r),await Ts(),await o(),s}a(_s,"remove");async function En(e,t){let r=await M.get(e),n=await C.users.bulkGetGlobalUsersById(t),o=[];for(let c of n)c.userGroups||(c.userGroups=[]),c.userGroups.includes(e)||o.push(c);if(!o.length)return o;let s=o.map(c=>({...c,userGroups:[...c?.userGroups||[],e]}));if(await C.users.bulkUpdateGlobalUsers(s),Object.values(r.roles||{}).includes("CREATOR")){let m=(await C.userUtils.creatorsInList(o)).filter(h=>h).length,g=o.length-m;g&&await bn(0,g)}let u=[];for(let c of t)u.push(C.cache.user.invalidateUser(c));return await Promise.all(u),await C.events.group.usersAdded(s.length,r),s}a(En,"addUsers");async function xs(e,t){let r=await M.get(e),n=await C.users.bulkGetGlobalUsersById(t),o=[];for(let u of n){if(!u.userGroups||!u.userGroups.includes(e))continue;let c=u.userGroups.indexOf(e);u.userGroups.splice(c,1),o.push(u)}if(await C.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes("CREATOR")){let c=(await C.userUtils.creatorsInList(o)).filter(g=>g).length,m=o.length-c;m&&await cr(0,m)}let i=[];for(let u of t)i.push(C.cache.user.invalidateUser(u));return await Promise.all(i),o.length&&await C.events.group.usersDeleted(o.length,r),o}a(xs,"removeUsers");async function Cs(e,t){let r=await pr(e);if(r.roles||(r.roles={}),t.appsToAdd)for(let n of t.appsToAdd)r.roles[n.appId]=n.roleId;if(t.appsToRemove)for(let n of t.appsToRemove)delete r.roles[n.appId];if(r.builder={apps:Object.entries(r.roles).filter(([n,o])=>o==="CREATOR").map(([n])=>n)},r.builder.apps.length&&!hs())throw new C.HTTPError("Feature not enabled, please check license",400);return await Tn(r)}a(Cs,"updateGroupApps");async function Dx(e){let t=await ha(),r=[];for(let n of t)!n.roles||!n.roles[e]||(delete n.roles[e],r.push(n));return await M.bulkSave(r)}a(Dx,"cleanupApp");async function Nx(){if(!await ys()){let e=C.tenancy.getGlobalDB(),r=(await ha()||[]).filter(n=>Object.values(n?.roles||{}).includes("CREATOR"));for(let n of r){let o=await M.getGroupUsers(n._id),i=(await Promise.all(o.map(g=>e.get(g._id)))).map(g=>({...g,userGroups:g.userGroups.filter(h=>h!==n._id)})),c=(await C.userUtils.creatorsInList(i)).filter(g=>g).length,m=o.length-c;await M.save({...n,roles:{}}),m&&await cr(0,m)}}}a(Nx,"adjustGroupCreatorsQuotas");Os.users.UserDB.init(Ye,Q,Ne);var Ce=Os.users.UserDB;var xn={};T(xn,{logs:()=>Ns});var Ns={};T(Ns,{logSearch:()=>Kx,oldestLogDate:()=>Mf,storeLog:()=>Vx});var _n=require("@budibase/backend-core"),Bf=require("@budibase/types");var Z=require("@budibase/backend-core"),vn=require("@budibase/types");var Uf=require("@budibase/backend-core");async function qf(e,t){let r,n=5,o=!1,s,i=!0;for(;n>0;n--)try{i?s=await e():s=await exports.randomDelay(e),o=!0;break}catch(u){r=u}return o||Uf.logging.logWarn(`Failed to backoff: ${t}`,r),s}a(qf,"backOff");var{SEPARATOR:nt,UNICODE_MAX:Bx,DocumentType:kf,AutomationViewMode:Ls,ViewName:Mx,getQueryIndex:Gx}=Z.db,Fx=new Date(0).toISOString(),Wx=100,Ps=a(async()=>ja(vn.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS),"oldestLogDate");function Df(e,t,{status:r,automationId:n}={},o={}){let s=n?`${n}${nt}`:"",i=r?`${r}${nt}`:"",u;return r&&n?u=`${Ls.ALL}${nt}${i}${s}`:r?u=`${Ls.STATUS}${nt}${i}`:n?u=`${Ls.AUTOMATION}${nt}${s}`:u=`${kf.AUTOMATION_LOG}${nt}`,{...o,descending:!0,startkey:`${u}${t}${Bx}`,endkey:`${u}${e}`}}a(Df,"getAutomationLogParams");function jx(e,t,r){return`${kf.AUTOMATION_LOG}${nt}${e}${nt}${r}${nt}${t}`}a(jx,"generateAutomationLogID");async function Us(e,t,r={docs:!0}){let n=Z.context.getProdWorkspaceDB();await n.exists()||(n=Z.context.getDevWorkspaceDB());let o={status:r.status},s=r?.limit?r.limit:r?.paginate?9+1:void 0,i=Df(e,t,o,{include_docs:r.docs,limit:s});r?.page&&(i.startkey=r.page);let u=await n.allDocs(i);return Qr(u,{paginate:r?.paginate,pageSize:9})}a(Us,"getAllLogs");async function qs(e,t,r={}){let n=Z.context.getProdWorkspaceDB();await n.exists()||(n=Z.context.getDevWorkspaceDB());let o;try{let s={automationId:r?.automationId,status:r?.status},i=Df(e,t,s,{include_docs:!0,limit:9+1});r?.page&&(i.startkey=r.page),o=await n.query(Gx(Mx.AUTOMATION_LOGS),i)}catch(s){if(s!=null&&(s.name==="not_found"||s.error==="not_found"))return await pc(),qs(e,t,r);throw s}return Qr(o,{paginate:!0,pageSize:9})}a(qs,"getLogsByView");async function Nf(e,t){let r=Z.context.getProdWorkspaceDB(),n=e._id,o=e.name,s=new Date().toISOString(),i=jx(s,t.status,n),u={...t,automationId:n,status:t.status,automationName:o,createdAt:s,_id:i};return await r.put(u),i}a(Nf,"writeLog");async function ks(e,{clearing:t}={clearing:!1}){let r=Z.context.getProdWorkspaceDB();await qf(async()=>{let n=await r.get(Z.db.DocumentType.WORKSPACE_METADATA);for(let o of e){let s=o.split(Z.db.SEPARATOR),i=`${s[s.length-3]}${Z.db.SEPARATOR}${s[s.length-2]}`,u={};n.automationErrors&&(u=n.automationErrors),Array.isArray(u[i])||(u[i]=[]);let c=u[i].indexOf(o);t&&c!==-1?u[i].splice(c,1):u[i].push(o),u[i].length===0&&delete u[i],n.automationErrors=u}await r.put(n),await Z.cache.workspace.invalidateWorkspaceMetadata(n.appId,n)},"Failed to update app metadata with automation log error")}a(ks,"updateAppMetadataWithErrors");async function Qx(){let e=await Ps();try{return await Us(Fx,e,{docs:!1,paginate:!1,limit:Wx})}catch{return{data:[],hasNextPage:!1}}}a(Qx,"getExpiredLogs");async function Ds(){let e=Z.context.getProdWorkspaceDB();try{let t=await Qx();if(!t.data||t.data.length===0)return;let r=t.data.map(o=>({_id:o.id,_rev:o.value.rev,_deleted:!0})),n=t.data.filter(o=>{let s=o.id.split(Z.db.SEPARATOR);return s[s.length-1]===vn.AutomationStatus.ERROR}).map(o=>o.id);await e.bulkDocs(r),n.length&&await ks(n,{clearing:!0})}catch(t){Z.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}a(Ds,"clearOldHistory");var Mf=Ps;async function $x(e,t,r,n){let o,s=new Date().toISOString(),i=await Mf();return(!e||e<i)&&(e=i),r||t?o=await qs(e,s,{automationId:r,status:t,page:n}):o=await Us(e,s,{status:t,page:n,docs:!0,paginate:!0}),o}a($x,"getLogs");async function Kx(e){return await Ds(),await $x(e.startDate,e.status,e.automationId,e.page)}a(Kx,"logSearch");async function Vx(e,t){if(!_n.db.isProdWorkspaceID(_n.context.getWorkspaceId()))return;let r=await Nf(e,t);t.status===Bf.AutomationStatus.ERROR&&await ks([r]),await Ds()}a(Vx,"storeLog");var Cn={};T(Cn,{checkPluginQuotas:()=>zx,deletePlugin:()=>Yx,storePlugin:()=>Hx});var jf=require("@budibase/types"),J=require("@budibase/backend-core");var Gf=U(require("fs")),Ff=require("path");function Wf(e,t){return Gf.default.readFileSync((0,Ff.join)(e,t),"utf8")}a(Wf,"loadJSFile");async function Hx(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===jf.PluginType.DATASOURCE){let js=Wf(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=a(async()=>{let e=await db.put(doc);return await J.events.plugin.imported(doc),{...doc,_rev:e.rev}},"write");return rev?await write():await Es(write)}a(Hx,"storePlugin");async function Yx(e){let t=J.tenancy.getGlobalDB();try{let r=await t.get(e),n=J.objectStore.getPluginS3Dir(r.name);await J.objectStore.deleteFolder(J.objectStore.ObjectStoreBuckets.PLUGINS,n),await t.remove(e,r._rev),await J.events.plugin.deleted(r),await Rs()}catch(r){let n=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${n}`)}}a(Yx,"deletePlugin");async function zx(){let e=J.tenancy.getGlobalDB();try{let r=(await e.allDocs(J.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await vs(r)}catch(t){J.logging.logAlert("Unable to retrieve plugins for quota check",t)}}a(zx,"checkPluginQuotas");var ze={};T(ze,{fetch:()=>Xx,fetchValues:()=>Zx,isEncryptionKeyAvailable:()=>Jx,isValid:()=>Kf,remove:()=>tC,update:()=>eC});var Qf=require("@budibase/backend-core"),ya=require("@budibase/types");function Jx(){return!!Qf.env.ENCRYPTION_KEY}a(Jx,"isEncryptionKeyAvailable");async function Xx(){let e=await vt.get();return Object.keys(e.variables)}a(Xx,"fetch");async function Zx(e){let r=(await vt.get()).variables,n={};for(let[o,s]of Object.entries(r))switch(e){case ya.Environment.DEVELOPMENT:n[o]=s.development;break;case ya.Environment.PRODUCTION:default:n[o]=s.production;break}return n}a(Zx,"fetchValues");async function $f(e){if(!(await $e.cache.getCachedLicense()).features.includes(ya.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await vt.get();r.variables=e(r.variables),await vt.update(r)}a($f,"changeValues");async function eC(e,t){if(Kf(e))await $f(n=>(n[e]=t,n));else throw new Error("Variable name has characters that are not allowed")}a(eC,"update");async function tC(e){await $f(t=>(delete t[e],t))}a(tC,"remove");function Kf(e){return/^[a-zA-Z0-9-_]+$/.test(e)}a(Kf,"isValid");var bt={};T(bt,{definitions:()=>dC,download:()=>lC,fetch:()=>pC,write:()=>uC});var ge=require("@budibase/backend-core"),Ln=require("@budibase/types");var V=require("@budibase/backend-core"),Me=require("@budibase/types");var Vf=require("memorystream"),Hf=new V.sql.Sql(Me.SqlClient.SQL_LITE);async function rC(e,t,r){let n={operation:Me.Operation.READ,table:Wt.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:Me.SortOrder.DESCENDING,type:Me.SortType.STRING}}},o=Hf._query(n);if(Array.isArray(o))throw new Error("Cannot execute multiple queries for audit log search");return{sql:o.sql,bindings:o.bindings}}a(rC,"getAuditLogSqlQuery");function aC(e){return`${V.DocumentType.AUDIT_LOG}${V.SEPARATOR}${e}${V.SEPARATOR}${V.utils.newid()}`}a(aC,"generateAuditLogID");async function Yf(e){e._id||(e._id=aC(e.timestamp)),e.type||(e.type=Me.AUDIT_LOG_TYPE);try{let r=await V.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){V.logging.logAlert("Failed to write audit log",t)}}a(Yf,"save");async function Bs(e,t,r){t||(t=1);let n=V.context.getAuditLogsDB();try{let o=9+1,s=await rC(e,t,o),i=Wt.searchTable(),u=Hf.convertJsonStringColumns(i,await n.sql(s.sql,s.bindings)),c;u.length>o&&(c=u.pop());let m={rows:u,hasNextPage:!!c};return m.hasNextPage&&(m.bookmark=t+1),m}catch(o){if(o.status===404&&!r?.isRetry)return await nC(),await zu(),await Bs(e,t,{isRetry:!0});throw o}}a(Bs,"searchSQL");async function nC(){let e=V.context.getAuditLogsDB(),r=(await e.allDocs(V.db.getDocParams(V.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(n=>n.doc).filter(n=>n&&!n.type).map(n=>({...n,type:Me.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}a(nC,"migrate");function zf(e){let t=V.context.getAuditLogsDB(),r=new Vf,n=t.dump(r,{filter:s=>{let i=s;if(!i._id?.startsWith(V.DocumentType.AUDIT_LOG))return!1;let u=!0,c=a((m,g)=>{!m||m.length===0||(u=!!(u&&g&&m.includes(g)))},"matcher");if(c(e.userIds,i.userId),c(e.appIds,i.appId),c(e.events,i.event),(e.startDate||e.endDate)&&(u=u&&i.timestamp>=e.startDate&&i.timestamp<=e.endDate),e.fullSearch){let m=JSON.stringify(s);u=u&&m.includes(e.fullSearch)}return u}}),o=new Vf;return r.on("data",s=>{let i=JSON.parse(Buffer.from(s).toString());if(Array.isArray(i.docs)){let u="";for(let c of i.docs)u+=JSON.stringify(c)+`
38
- `;o.write(u)}}),r.on("end",()=>{o.end()}),{promise:n,stream:o}}a(zf,"dump");var Aa=require("@budibase/backend-core"),ba=require("@budibase/string-templates"),On=require("@budibase/types");var sC=Aa.constants.MIN_VALID_DATE.toISOString(),iC=Aa.constants.MAX_VALID_DATE.toISOString();function Ms(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||sC,e.endDate=e.endDate||iC),e}a(Ms,"fillDates");async function Jf(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(n=>Aa.db.getProdWorkspaceID(n)));let t={};function r(n,o){o?.length&&(t.oneOf={...t.oneOf,[n]:o})}return a(r,"addStringParams"),r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=Ms(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}a(Jf,"getSearchFilters");function Gs(e,t,r){let n={_id:e,status:On.AuditLogResourceStatus.DELETED};switch(t){case"app":n.name=r?.appName;break;case"user":n.email=r?.email;break}return n}a(Gs,"deleted");function Fs(e){let t=(0,ba.findHBSBlocks)(e);for(let r of t){let n=` "${r}"`;e=e.replace(e.includes(n)?n:` ${r}`,""),e=(0,ba.processStringSync)(e,{})}return e}a(Fs,"removeTemplateStrings");function Xf(e,t){let r=On.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let n=(0,ba.processStringSync)(r,t);return n.includes('""')&&(n=Fs(r)),n}a(Xf,"getEventFriendlyName");async function uC(e,t,r){if(!await gn()||!ge.utils.isAudited(e))return;let n=Xf(e,t),o=new Date;r?.timestamp&&(o=new Date(r.timestamp));let s={timestamp:o.toISOString(),event:e,name:n,userId:r?.userId||Ln.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){s.appId=ge.db.getProdWorkspaceID(r.appId);let u=await ge.cache.workspace.getWorkspaceMetadata(r.appId);"name"in u&&(i.appName=u.name)}if(r?.userId){let u=await ge.users.getById(r?.userId);i.email=u.email}}catch(u){ge.logging.logAlert("Failed to retrieve fallback information for audit log",u)}return s.fallback=i,await Yf(s)}a(uC,"write");async function cC(e){let t=e.map(u=>u.userId),n=e.filter(u=>u.appId).map(u=>ge.db.getDevWorkspaceID(u.appId)),o=await ge.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),s=await ge.db.getWorkspacesByIDs([...new Set(n)]),i=[];for(let u of e){let c=o.find(h=>h?._id===u.userId),m=s.find(h=>ge.db.isSameWorkspaceID(h?.appId,u.appId)),g={event:u.event,timestamp:u.timestamp,name:u.name,metadata:u.metadata,user:c||Gs(u.userId,"user",u.fallback)};u.appId&&(g.app=m||Gs(u.appId,"app",u.fallback)),i.push(g)}return i}a(cC,"enrich");async function pC(e){if(!await gn())throw new Error("Audit logs not available - license required.");let t=await Jf(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await Bs(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await cC(r.rows)}}a(pC,"fetch");function lC(e){return e=Ms(e),zf(e)}a(lC,"download");function dC(){let e=Object.entries(Ln.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=Fs(r[1]);return t}a(dC,"definitions");var Pn={};T(Pn,{applications:()=>Ks,roles:()=>Qs,users:()=>Ws});var Ws={};T(Ws,{roleCheck:()=>mC});function fC(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}a(fC,"removeRoles");async function mC(e,t){return await rt()||fC(e,t),e}a(mC,"roleCheck");var Qs={};T(Qs,{assign:()=>gC,unAssign:()=>hC});var Ia=require("@budibase/backend-core");async function gC(e,t){if(!await rt())throw new Error("Unable to assign roles - license required.");let r=await Ce.bulkGet(e);for(let n of r){if(t.role&&t.role.roleId){let o=Ia.db.getProdWorkspaceID(t.role.appId);n.roles[o]=t.role.roleId}if(t.appBuilder){let o=Ia.db.getProdWorkspaceID(t.appBuilder.appId),s=n.builder?.apps||[];n.builder={apps:s.concat([o])}}t.builder&&(n.builder={global:!0}),t.admin&&(n.admin={global:!0}),n.roles}await Ce.bulkUpdate(r)}a(gC,"assign");async function hC(e,t){if(!await rt())throw new Error("Unable to un-assign roles - license required.");let r=await Ce.bulkGet(e);for(let n of r){if(t.role){let o=Ia.db.getProdWorkspaceID(t.role?.appId);n.roles[o]===t.role.roleId&&delete n.roles[o]}if(t.appBuilder&&n.builder?.apps){let o=Ia.db.getProdWorkspaceID(t.appBuilder.appId);n.builder.apps=n.builder.apps.filter(s=>s!==o)}t.builder&&n.builder&&delete n.builder,t.admin&&n.admin&&delete n.admin}}a(hC,"unAssign");var Ks={};T(Ks,{buildExportFn:()=>AC,buildImportFn:()=>yC});var $s=require("@budibase/backend-core");function yC(e){return async(t,r)=>{await rt()||t.throw(403,"Endpoint unavailable, license required."),t.request.files?.appExport||t.throw(400,"Must provide app export file for import."),await $s.context.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}a(yC,"buildImportFn");function AC(e){return async(t,r)=>{await rt()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:n,excludeRows:o}=t.request.body;await $s.context.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:n,excludeRows:o},t.query.appId=t.params.appId,await e(t),await r()})}}a(AC,"buildExportFn");var ne=require("@budibase/backend-core"),ae=require("@budibase/types"),tm=U(require("fs")),rm=require("path");var Vs=require("@budibase/backend-core");var Zf;function em(){Zf=new Vs.queue.BudibaseQueue(Vs.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}a(em,"init");function Ut(){return Zf}a(Ut,"getBackupQueue");async function Hs(e,t={}){return _e.storeAppBackupMetadata(e,t)}a(Hs,"storeAppBackupMetadata");function am(e){let t=new Date().toISOString();switch(e){case ae.BackupStatus.COMPLETE:case ae.BackupStatus.FAILED:return{timestamp:t,finishedAt:t};case ae.BackupStatus.STARTED:return{timestamp:t,startedAt:t};case ae.BackupStatus.PENDING:return{timestamp:t,createdAt:t}}}a(am,"getTimestamps");async function bC(e,t,r,n){let o=await Un(e);return await _e.storeAppBackupMetadata({...o,...am(t),contents:r,status:t,type:ae.BackupType.BACKUP},{filename:n,docId:e})}a(bC,"updateBackupStatus");async function IC(e,t,r){let n=await Un(e);return await _e.storeAppBackupMetadata({...n,...am(r),status:r,type:ae.BackupType.RESTORE,trigger:ae.BackupTrigger.MANUAL},{docId:e,docRev:t})}a(IC,"updateRestoreStatus");async function Un(e){return _e.getAppBackupMetadata(e)}a(Un,"getAppBackup");async function SC(e,t){return _e.updateAppBackupMetadata(e,t)}a(SC,"updateAppBackup");async function nm(e){let t=await _e.getAppBackupMetadata(e);return t.filename&&await ne.objectStore.deleteFile(ne.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),_e.deleteAppBackupMetadata(e)}a(nm,"deleteAppBackup");async function wC(e){let t=[];for(let r of e)try{await nm(r),t.push({backupId:r,success:!0})}catch(n){t.push({backupId:r,success:!1,error:n instanceof Error?n.message:"Unknown error"})}return t}a(wC,"deleteAppBackups");async function TC(e,t){return _e.fetchAppBackups(e,t)}a(TC,"fetchAppBackups");async function om(e){let t=await _e.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let r=await ne.objectStore.getReadStream(ne.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}a(om,"getBackupDownloadStream");async function EC(e){let{stream:t}=await om(e),r=(0,rm.join)(ne.objectStore.budibaseTempDir(),ne.utils.newid()),n=tm.default.createWriteStream(r);return new Promise((o,s)=>{t.on("error",s),n.on("error",s),t.pipe(n).on("close",()=>o(r))})}a(EC,"downloadAppBackup");async function RC(e,t,r={}){let n;try{n=await Hs({appId:e,trigger:t,timestamp:new Date().toISOString(),status:ae.BackupStatus.PENDING,type:ae.BackupType.BACKUP,...r})}catch(o){if(o.status===409)return;throw o}return await Ut().add({docId:n.id,docRev:n.rev,appId:e,export:{trigger:t,...r}}),await ne.events.backup.appBackupTriggered(e,n.id,ae.BackupType.BACKUP,t,r?.name),n.id}a(RC,"triggerAppBackup");async function vC(e,t,r,n){let o=await Un(t),s;try{s=await Hs({appId:e,timestamp:new Date().toISOString(),status:ae.BackupStatus.PENDING,type:ae.BackupType.RESTORE,createdBy:n})}catch(i){if(i?.status===409)return;throw i}return await Ut().add({appId:e,docId:s.id,docRev:s.rev,import:{nameForBackup:r,backupId:t,createdBy:n}}),{restoreId:s.id,metadata:o}}a(vC,"triggerAppRestore");async function _C(e,t,r){let n=ne.db.getProdWorkspaceID(e);await ne.context.doInWorkspaceContext(n,async()=>{let o=ne.context.getProdWorkspaceDB();if(!await o.exists())return;let i=await o.tryGet(ae.DocumentType.WORKSPACE_METADATA);i&&(i.backupErrors||(i.backupErrors={}),i.backupErrors[t]||(i.backupErrors[t]=[]),i.backupErrors[t].push(r),await o.put(i),await ne.cache.workspace.invalidateWorkspaceMetadata(i.appId,i))})}a(_C,"trackBackupError");var xC={isEnabled:ms,triggerAppRestore:le(vC),triggerAppBackup:le(RC),getBackupDownloadStream:le(om),downloadAppBackup:le(EC),fetchAppBackups:le(TC),storeAppBackupMetadata:le(Hs),updateBackupStatus:le(bC),updateRestoreStatus:le(IC),getAppBackup:le(Un),updateAppBackup:le(SC),deleteAppBackup:le(nm),deleteAppBackups:le(wC),trackBackupError:le(_C)},Oe=xC;var zs={};T(zs,{init:()=>Ys});var $=require("@budibase/backend-core"),Ge=require("@budibase/types"),lr=U(require("fs"));async function Ys(e){Ut().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),LC(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),OC(t,e)}catch(n){$.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,n)}})}a(Ys,"init");async function CC(e){await $.db.getDB(e,{skip_setup:!0}).destroy()}a(CC,"removeExistingApp");async function sm(e,t,r,n){let o=$.db.getDevWorkspaceID(r),s=$.db.getProdWorkspaceID(r),i=new Date().toISOString(),u=a(async(c,m)=>{n?.doc?await Oe.updateBackupStatus(n.doc.id,c,m?.contents,m?.filename):await Oe.storeAppBackupMetadata({appId:s,timestamp:i,trigger:e,status:c,name:n?.name,type:Ge.BackupType.BACKUP,contents:m?.contents,createdBy:n?.createdBy},{filename:m?.filename})},"updateMetadata");try{let c=await n.processing.exportAppFn(o,{tar:!0}),m=await n.processing.statsFn(o),g=`${s}/backup-${i}.tar.gz`,h=$.objectStore.ObjectStoreBuckets.BACKUPS,y=lr.default.createReadStream(c);await $.objectStore.streamUpload({bucket:h,filename:g,stream:y,extra:{type:"application/gzip",metadata:{name:n?.name,trigger:e,timestamp:i,appId:s}}}),await u(Ge.BackupStatus.COMPLETE,{filename:g,contents:m}),lr.default.existsSync(c)&&lr.default.rmSync(c)}catch(c){$.logging.logAlert("App backup error",c),await u(Ge.BackupStatus.FAILED);let m=n?.doc?.id||`backup-${i}`,g=c instanceof Error?c.message:String(c);await Oe.trackBackupError(s,m,`Backup export failed: ${g}`)}}a(sm,"runBackup");async function OC(e,t){let r=e.data,n=r.appId,o=r.import.backupId,s=r.import.nameForBackup,i=r.import.createdBy,u=$.tenancy.getTenantIDFromWorkspaceID(n);return $.tenancy.doInTenant(u,async()=>{let c=$.db.getDevWorkspaceID(n),m=`${c}_temp_${Date.now()}`,{rev:g}=await Oe.updateRestoreStatus(r.docId,r.docRev,Ge.BackupStatus.STARTED);await sm(Ge.BackupTrigger.RESTORING,u,n,{processing:t,createdBy:i,name:s});let h=await Oe.downloadAppBackup(o),y=Ge.BackupStatus.COMPLETE;try{await t.importAppFn(m,$.db.getDB(m),{file:{type:"application/gzip",path:h},key:h}),await CC(c),await new $.db.Replication({source:m,target:c}).replicate()}catch(S){$.logging.logAlert("App restore error",S),y=Ge.BackupStatus.FAILED;let O=S instanceof Error?S.message:String(S);await Oe.trackBackupError(n,o,`Backup restore failed: ${O}`)}finally{try{await $.db.getDB(m,{skip_setup:!0}).destroy()}catch{}}await Oe.updateRestoreStatus(r.docId,g,y),lr.default.existsSync(h)&&lr.default.rmSync(h,{force:!0})})}a(OC,"importProcessor");async function LC(e,t){let r=e.data,n=r.appId,o=r.export.trigger,s=r.export.name,i=$.tenancy.getTenantIDFromWorkspaceID(n);await $.tenancy.doInTenant(i,async()=>{try{let{rev:u}=await Oe.updateBackupStatus(r.docId,Ge.BackupStatus.STARTED);return sm(o,i,n,{processing:t,doc:{id:r.docId,rev:u},name:s})}catch(u){$.logging.logAlert("App backup error",u);let c=u instanceof Error?u.message:String(u);await Oe.trackBackupError(n,r.docId,`Backup export failed: ${c}`)}})}a(LC,"exportProcessor");var PC=a(async e=>{em(),await Ys(e.processing)},"init"),we={...Oe,processing:zs,init:PC,getBackupQueue:Ut};var im=a(async e=>{e.backups&&await we.init(e.backups)},"init");var ye={};T(ye,{create:()=>RB,find:()=>EB,get:()=>TB,remove:()=>_B,update:()=>vB});var CA=U(Qi()),ot=require("@budibase/backend-core");var OA=require("@budibase/types");async function TB(e){let t=ot.tenancy.getGlobalDB(),r=new ot.db.QueryBuilder(t.name,OA.SearchIndex.USER);r.setIndexBuilder(ot.db.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[o,s]of Object.entries(e.filters?.equal??{}))r.addEqual(o,s);r.setSort("_id"),r.setSkip(e.skip);let n=await r.run();return{users:n.rows,total:n.totalRows}}a(TB,"get");async function EB(e){return await ot.users.getById(e)}a(EB,"find");async function RB(e){let t=await Ce.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new ot.HTTPError("User is already synched",409);e={...t,scimInfo:(0,CA.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Ce.save(e,{requirePassword:!1})}a(RB,"create");async function vB(e,t){return await Ce.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}a(vB,"update");async function _B(e){return await Ce.destroy(e)}a(_B,"remove");var yr={};T(yr,{create:()=>xB});var LA=U(Qi());var PA=require("@budibase/backend-core");async function xB(e){let t=await bo(e.name),r;if(!t)r=(await Q.save(e)).id;else{if(t.scimInfo?.isSync)throw new PA.HTTPError("Group is already synched",409);r=t._id,t.users&&(await Q.removeUsers(r,t.users.map(o=>o._id)),delete t.users),t.scimInfo=(0,LA.default)(t.scimInfo,e.scimInfo),await Q.save(t)}return await Q.get(r)}a(xB,"create");var kt={};T(kt,{logRequest:()=>CB,logResponse:()=>OB});var $i=require("@budibase/backend-core");async function CB(e){$i.logging.logWarn("SCIM request log",e)}a(CB,"logRequest");async function OB(e){$i.logging.logWarn("SCIM response error",e)}a(OB,"logResponse");var Xi={};T(Xi,{doInScimContext:()=>Vi,feature:()=>oe,internalGroupOnly:()=>Ra,licenseAuth:()=>Ji,licensing:()=>UA,requireSCIM:()=>Hi,scimGroupOnly:()=>Ea,scimUserOnly:()=>Ta});var It=require("@budibase/backend-core");var Kn=require("@budibase/types");var LB=a((e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(It.env.SELF_HOSTED&&It.env.DEFAULT_LICENSE)return t.user.license=Io,r();t.user.license=await $e.cache.getCachedLicense(t,{populateLicense:e.populateLicense,populateFreeLicense:e.populateFreeLicense}),e.checkUsersLimit&&(It.utils.isServingApp(t)||It.utils.isServingBuilder(t)||It.utils.isServingBuilderPreview(t)||It.utils.isPublicApiRequest(t))&&await Ye.usageLimitIsExceeded({name:Kn.StaticQuotaName.USERS,type:Kn.QuotaUsageType.STATIC,usageChange:0})}return r()},"licensing"),UA=LB;var oe={};T(oe,{requireFeature:()=>PB,requireFeatures:()=>UB});var PB=a(e=>async(t,r)=>{await mn(e),await r()},"requireFeature"),UB=a((...e)=>async(t,r)=>{await fs(e),await r()},"requireFeatures");var Vn=require("@budibase/backend-core");var Vi=a(async(e,t)=>(Vn.env.DISABLE_SCIM_CALLS||await kt.logRequest({...e.request.toJSON(),body:e.request.body}),await Vn.context.doInScimContext(async()=>{let r=await t();return await kt.logResponse({...e.response.toJSON(),body:e.response.body}),r})),"doInScimContext");var Hi=a(async(e,t)=>{await As(),await t()},"requireSCIM");var qA=require("@budibase/backend-core");var Ta=a(e=>Yi(qA.users.getById,e,!0),"scimUserOnly"),Ea=a(e=>Yi(M.get,e,!0),"scimGroupOnly"),Ra=a(e=>Yi(M.get,e,!1),"internalGroupOnly");function Yi(e,t,r){return async(n,o)=>{let s=n.params[t];return typeof s!="string"&&n.throw(404),!!(await e(s)).scimInfo?.isSync!==r&&n.throw(404),o()}}a(Yi,"scimSyncChecks");var va=require("@budibase/backend-core");var zi=require("dd-trace");async function Ji(e,t){await zi.tracer.trace("licenseAuth",async r=>{let n=e.request.headers[va.constants.Header.LICENSE_KEY];Array.isArray(n)&&(n=n[0]),r.addTags({licenseKey:n}),n||e.throw(403,"License key not provided");let o=await cs(n);o||(r.addTags({licenseFound:!1}),e.throw(403,"License not found or invalid")),o.tenantId||e.throw(403,"License does not have a tenant ID"),zi.tracer.setUser({id:"anonymous",tenantId:o.tenantId}),await va.context.doInSelfHostTenantUsingCloud(o.tenantId,async()=>{await va.context.doInLicenseContext(o,async()=>{await t()})})})}a(Ji,"default");var nu={};T(nu,{appBackups:()=>QA,auditLogs:()=>XA,environmentVariables:()=>ib,groups:()=>Ib,scim:()=>zb});var st=require("@budibase/backend-core"),Yn=require("@budibase/types"),WA=U(require("@koa/router")),Nt=U(require("joi"));var Hn=require("@budibase/backend-core"),Zi=require("@budibase/types");async function Dt(e,t){t||e.throw(400,"App ID missing"),await Kt.workspaceExists(t)||e.throw(400,`Provided app ID: ${t} - is invalid.`)}a(Dt,"checkAppID");async function kA(e){let t=e.params.appId;await Dt(e,t);let{body:r}=e.request,n=e.user?._id,o=await we.triggerAppBackup(t,Zi.BackupTrigger.MANUAL,{name:r.name,createdBy:n});o||e.throw(500,"Unable to start backup."),e.body={backupId:o,message:"Backup triggered - process starting."}}a(kA,"manualBackup");async function DA(e){let t=e.params.appId;await Dt(e,t);let r=e.params.backupId,n=e.request.body.name,o=await we.triggerAppRestore(t,r,n,e.user?._id);o||e.throw(500,"Unable to start restore."),await Hn.events.backup.appBackupRestored(o.metadata),e.body={restoreId:o?.restoreId,message:"Restore triggered - process starting."}}a(DA,"importBackup");async function NA(e){let t=e.params.appId;await Dt(e,t);let r=e.params.backupId;await we.deleteAppBackup(r),e.body={message:"Backup deleted successfully."}}a(NA,"deleteBackup");async function BA(e){let t=Hn.context.getWorkspaceId();await Dt(e,t);let{backupIds:r}=e.request.body;(!Array.isArray(r)||r.length===0)&&e.throw(400,"backupIds must be a non-empty array");let n=await we.deleteAppBackups(r),o=n.filter(i=>i.success).length,s=n.length-o;e.body={message:`${o} backups deleted successfully${s>0?`, ${s} failed`:""}.`,results:n,successCount:o,failureCount:s}}a(BA,"deleteBackups");async function MA(e){let t=e.params.appId;await Dt(e,t);let r=e.request.body;r?.trigger&&(r.trigger=r.trigger.toLowerCase(),Object.values(Zi.BackupTrigger).includes(r.trigger)||e.throw(400,"Provided trigger is not a valid option.")),e.body=await we.fetchAppBackups(t,{paginate:!0,...r})}a(MA,"fetchBackups");async function GA(e){let t=e.params.appId;await Dt(e,t);let r=e.params.backupId,n=e.request.body;e.body=await we.updateAppBackup(r,n.name)}a(GA,"updateBackup");async function FA(e){let t=e.params.appId;await Dt(e,t);let r=e.params.backupId,{metadata:n,stream:o}=await we.getBackupDownloadStream(r);e.attachment(`backup-${n.timestamp}.tar.gz`),e.body=o}a(FA,"downloadBackup");var jA=new WA.default;function kB(){return st.auth.joiValidator.body(Nt.default.object({trigger:Nt.default.string().valid(...Object.values(Yn.BackupTrigger)),type:Nt.default.string().valid(...Object.values(Yn.BackupType)),startDate:Nt.default.date(),endDate:Nt.default.date(),page:Nt.default.string()}))}a(kB,"validateBackupSearch");jA.post("/api/apps/:appId/backups",st.auth.builderOrAdmin,kA).post("/api/apps/:appId/backups/search",st.auth.builderOrAdmin,kB(),MA).get("/api/apps/:appId/backups/:backupId/file",st.auth.builderOrAdmin,FA).patch("/api/apps/:appId/backups/:backupId",st.auth.builderOrAdmin,GA).delete("/api/apps/:appId/backups/:backupId",st.auth.builderOrAdmin,NA).delete("/api/apps/:appId/backups",st.auth.builderOrAdmin,BA).post("/api/apps/:appId/backups/:backupId/import",st.auth.builderOrAdmin,DA);var QA=jA;var eu=require("@budibase/backend-core");async function $A(e){let t=e.request.body,r=await bt.fetch(t);await eu.events.auditLog.filtered(t),e.body=r}a($A,"search");async function KA(e){let t=e.request.body,{stream:r}=bt.download(t);await eu.events.auditLog.downloaded(t),e.attachment(`audit-logs-${Date.now()}.log`),e.body=r}a(KA,"download");async function VA(e){e.body={events:bt.definitions()}}a(VA,"definitions");var YA=require("@budibase/types"),Bt=require("@budibase/backend-core"),zA=U(require("@koa/router")),Le=U(require("joi"));function HA(){return Bt.auth.joiValidator.body(Le.default.object({userIds:Le.default.array().items(Le.default.string()).optional(),appIds:Le.default.array().items(Le.default.string()).optional(),events:Le.default.array().items(Le.default.string().valid(...Object.values(YA.Event))).optional(),startDate:Le.default.string().optional().allow(""),endDate:Le.default.string().optional().allow(""),fullSearch:Le.default.string().optional().allow(""),bookmark:Le.default.number()}))}a(HA,"buildAuditLogSearchValidator");var JA=new zA.default;JA.post("/api/global/auditlogs/search",Bt.auth.adminOnly,HA(),$A).get("/api/global/auditlogs/download",Bt.auth.adminOnly,Bt.middleware.querystringToBody,HA(),KA).get("/api/global/auditlogs/definitions",Bt.auth.adminOnly,VA);var XA=JA;var ru=require("@budibase/backend-core"),tu=require("@budibase/types");async function ZA(e){e.body={encryptionKeyAvailable:ze.isEncryptionKeyAvailable()}}a(ZA,"status");async function eb(e){e.body={variables:await ze.fetch()}}a(eb,"fetch");async function tb(e){let{name:t,production:r,development:n}=e.request.body;await ze.update(t,{production:r,development:n});let o=[tu.Environment.PRODUCTION];r!==n&&o.push(tu.Environment.DEVELOPMENT),await ru.events.environmentVariable.created(t,o),e.body={message:`Environment variable "${t}" created.`}}a(tb,"create");async function rb(e){let{production:t,development:r}=e.request.body,n=e.params.varName;await ze.update(n,{production:t,development:r}),e.body={message:`Environment variable "${n}" updated.`}}a(rb,"update");async function ab(e){let t=e.params.varName;await ze.remove(t),await ru.events.environmentVariable.deleted(t),e.body={message:`Environment variable "${t}" deleted.`}}a(ab,"destroy");var Mt=require("@budibase/backend-core"),ob=U(require("@koa/router")),_a=U(require("joi"));var sb=new ob.default;function nb(){return Mt.auth.joiValidator.body(_a.default.object({name:_a.default.string().optional(),production:_a.default.string().required(),development:_a.default.string().required()}))}a(nb,"buildEnvVarUpdateValidator");sb.get("/api/env/variables/status",Mt.auth.builderOrAdmin,ZA).get("/api/env/variables",Mt.auth.builderOrAdmin,eb).post("/api/env/variables",Mt.auth.builderOrAdmin,nb(),tb).patch("/api/env/variables/:varName",Mt.auth.builderOrAdmin,nb(),rb).delete("/api/env/variables/:varName",Mt.auth.builderOrAdmin,ab);var ib=sb;var Je=require("@budibase/backend-core"),it=require("@budibase/types"),Ab=U(require("@koa/router")),de=U(require("joi"));var ub=require("@budibase/backend-core");async function cb(e){let t=e.request.body;if(t.name=t.name.trim(),delete t.roles,t._id){let n=await pr(t._id);t.roles=n.roles,t.scimInfo=n.scimInfo}let r=await Tn(t);e.body={_id:r.id,_rev:r.rev}}a(cb,"save");async function pb(e){let t=e.params.groupId,r=e.request.body.add,n=e.request.body.remove;(r&&!Array.isArray(r)||n&&!Array.isArray(n))&&e.throw(400,"Must supply a list of users to add or to remove");let o,s;r&&(o=await En(t,r)),n&&(s=await xs(t,n)),e.body={added:o,removed:s}}a(pb,"updateGroupUsers");async function lb(e){let t=e.params.groupId,r=e.request.body.add,n=e.request.body.remove;(r&&!Array.isArray(r)||n&&!Array.isArray(n))&&e.throw(400,"Must supply a list of objects, with appId and roleId to add or remove"),e.body=await Cs(t,{appsToAdd:r,appsToRemove:n})}a(lb,"updateGroupApps");async function fb(e){e.body={data:await ha()}}a(fb,"fetch");async function mb(e){let{groupId:t,rev:r}=e.params;try{await _s(t,r),e.body={message:"Group deleted successfully"}}catch(n){e.throw(n.status,n)}}a(mb,"destroy");async function gb(e){try{e.body=await pr(e.params.groupId)}catch(t){e.throw(t.status,t)}}a(gb,"find");async function hb(e){let{pageSize:t=10,bookmark:r,emailSearch:n}=e.request.query,o=e.params.groupId,s={limit:t+1},i=await Fa(o,{...s,emailSearch:n,bookmark:r}),u=n?i[t]?.email:i[t]?._id,c=!!u;e.body={users:i.slice(0,t),bookmark:u,hasNextPage:c}}a(hb,"searchUsers");async function yb(e){let{groupId:t}=e.params,{csvContent:r}=e.request.body;(r===void 0||r.trim().length===0)&&e.throw(400,"CSV is empty");let n=await ub.csv.jsonFromCsvString(r,{allowSingleColumn:!0});(!n||n.length===0)&&e.throw(400,"CSV file is invalid");let s=Object.keys(n[0]).find(h=>/^(email|e-mail|email address|mail|e_mail)$/i.test(h.trim()));s||e.throw(400,"CSV file must contain an email column");let i=Array.from(new Set(n.map(h=>h[s]).filter(h=>h&&typeof h=="string"&&h.trim().length>0).map(h=>h.trim())));i.length===0&&e.throw(400,"No valid email addresses found in CSV");try{await pr(t)}catch(h){if(h.status===404)e.throw(404,"Group not found");else throw h}let u=[],c=[],m=[],g=await Promise.all(i.map(h=>Ce.getUserByEmail(h)));for(let h of i){let y=g.find(S=>S?.email===h);y?(u.push({_id:y._id,email:y.email}),m.push(y._id)):c.push({email:h,reason:"User not found"})}m.length>0&&await En(t,m),e.body={added:u,skipped:c}}a(yb,"bulkAddUsersFromCsv");var bb=new Ab.default;function MB(){return Je.auth.joiValidator.body(de.default.object({_id:de.default.string().optional(),_rev:de.default.string().optional(),color:de.default.string().required(),icon:de.default.string().required(),name:de.default.string().trim().required().max(50),role:de.default.string().optional(),users:de.default.array().optional(),apps:de.default.array().optional(),roles:de.default.object().optional(),createdAt:de.default.string().optional(),updatedAt:de.default.string().optional()}).required())}a(MB,"buildGroupSaveValidation");bb.post("/api/global/groups",Je.auth.adminOnly,oe.requireFeature(it.Feature.USER_GROUPS),MB(),cb).get("/api/global/groups",oe.requireFeature(it.Feature.USER_GROUPS),fb).delete("/api/global/groups/:groupId/:rev",oe.requireFeature(it.Feature.USER_GROUPS),Je.auth.adminOnly,Ra("groupId"),mb).get("/api/global/groups/:groupId",oe.requireFeature(it.Feature.USER_GROUPS),Je.auth.builderOrAdmin,gb).get("/api/global/groups/:groupId/users",oe.requireFeature(it.Feature.USER_GROUPS),Je.auth.builderOrAdmin,hb).post("/api/global/groups/:groupId/users",Je.auth.adminOnly,oe.requireFeature(it.Feature.USER_GROUPS),Ra("groupId"),pb).post("/api/global/groups/:groupId/users/bulk",Je.auth.adminOnly,oe.requireFeature(it.Feature.USER_GROUPS),Ra("groupId"),Je.auth.joiValidator.body(de.default.object({csvContent:de.default.string().required()}).required()),yb).post("/api/global/groups/:groupId/apps",Je.auth.builderOrAdmin,oe.requireFeature(it.Feature.USER_GROUPS),lb);var Ib=bb;var Yb=U(require("@koa/router"));var zn=require("scim-patch");var wb=require("@budibase/backend-core");function Sb(e,t){let r=e.request.query[t];if(r!==void 0)return+r}a(Sb,"tryGetQueryAsNumber");var Tb=a(async e=>{let t=Sb(e,"pageSize")??20,r=Sb(e,"startIndex"),n;e.request.query.filter&&(n=H.user.userFilters(e.request.query.filter));let o=await ye.get({pageSize:t,skip:r,filters:n});e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:o.total,Resources:o.users.map(H.user.toScimUserResponse),startIndex:(r||0)+1,itemsPerPage:t}},"get"),Eb=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404);let r=await ye.find(t);e.body=H.user.toScimUserResponse(r)},"find"),Rb=a(async e=>{let t=H.user.fromScimUser(e.request.body);try{let r=await ye.create(t);e.body=H.user.toScimUserResponse(r)}catch(r){throw r instanceof wb.EmailUnavailableError&&e.throw(409,"Email already in use"),r}},"create");function GB(e){let t=e.Operations.find(r=>(r.op==="Replace"||r.op==="replace")&&r.path==="active");return t?t.value===!1||t.value?.toLowerCase?.()==="false":!1}a(GB,"isDeactivation");var vb=a(async e=>{let t=await ye.find(e.params.id);t||e.throw(404);let r=H.user.toScimUserResponse(t),n=e.request.body;try{(0,zn.patchBodyValidation)(n)}catch{}if(GB(n))return au(e);let o;try{o=(0,zn.scimPatch)(r,n.Operations)}catch{}o||e.throw(500);let s=H.user.fromScimUser(o);await ye.update(s,{allowChangingEmail:!0}),e.body=H.user.toScimUserResponse(s)},"update"),au=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404),await ye.remove(t),e.status=204},"remove");var Fb=U(Gb()),Wb=require("@budibase/shared-core"),Jn=require("scim-patch");var Xn=require("scim2-parse-filter");function jb(e,t){for(let r of t.split(","))delete e[r]}a(jb,"cleanResponse");var Qb=a(async e=>{let r=(await Q.fetch()).filter(s=>s.scimInfo?.isSync).map(H.group.toScimGroupResponse),{filter:n,excludedAttributes:o}=e.request.query;if(n){let s=(0,Xn.filter)((0,Xn.parse)(n));r=r.filter(s)}o&&r.forEach(s=>{jb(s,o)}),e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:r.length,Resources:r,startIndex:1,itemsPerPage:r.length}},"get"),$b=a(async e=>{let t=H.group.fromScimGroup(e.request.body),r=await yr.create(t);e.body=H.group.toScimGroupResponse(r)},"create"),Kb=a(async e=>{let{id:t}=e.params,r=await Q.get(t),n=H.group.toScimGroupResponse(r),{excludedAttributes:o}=e.request.query;o&&jb(n,o),e.body=n},"find"),Vb=a(async e=>{let{id:t}=e.params,r=await Q.get(t);await Q.remove(t,r._rev),e.status=204},"remove"),Hb=a(async e=>{let{id:t}=e.params,r=await Q.get(t),n=H.group.toScimGroupResponse(r),o=e.request.body;try{(0,Jn.patchBodyValidation)(o)}catch{e.throw(400)}let{true:s,false:i}=(0,Fb.default)(o.Operations,u=>u.path==="members");if(i?.length){let u=(0,Jn.scimPatch)(n,i);u||e.throw(500);let c={...H.group.fromScimGroup(u),_rev:r._rev};await Q.save(c)}if(s?.length){let u=[],c=[];for(let{op:m,value:g}of s)switch(m){case"add":case"Add":for(let h of g)u.push(await ye.find(h.value));break;case"remove":case"Remove":for(let h of g)c.push(await ye.find(h.value));break;case"replace":case"Replace":throw new Error("Replacing members is not allowed");default:Wb.utils.unreachable(m)}u.length&&await Q.addUsers(t,u.map(m=>m._id)),c.length&&await Q.removeUsers(t,c.map(m=>m._id))}e.body=H.group.toScimGroupResponse(await Q.get(t))},"update");var xa=require("@budibase/types"),Te=new Yb.default({prefix:"/api/global/scim/v2"});Te.use(Hi);Te.use(Vi);Te.get("/users",Tb);Te.get("/users/:id",Ta("id"),Eb);Te.post("/users",Rb);Te.patch("/users/:id",Ta("id"),vb);Te.delete("/users/:id",Ta("id"),au);Te.get("/groups",Qb);Te.post("/groups",oe.requireFeature(xa.Feature.USER_GROUPS),$b);Te.get("/groups/:id",oe.requireFeature(xa.Feature.USER_GROUPS),Ea("id"),Kb);Te.delete("/groups/:id",oe.requireFeature(xa.Feature.USER_GROUPS),Ea("id"),Vb);Te.patch("/groups/:id",oe.requireFeature(xa.Feature.USER_GROUPS),Ea("id"),Hb);var zb=Te;var H={};T(H,{group:()=>su,user:()=>ou});var ou={};T(ou,{fromScimUser:()=>mM,toScimUserResponse:()=>lM,userFilters:()=>gM});var Zn=require("@budibase/types"),Jb=require("scim2-parse-filter"),Xb=require("@budibase/backend-core"),Zb=require("@budibase/shared-core");var{unreachable:pM}=Zb.utils,lM=a(e=>{let{isSync:t,roles:r,...n}=e.scimInfo||{},o={...n,schemas:["urn:ietf:params:scim:schemas:core:2.0:User"],id:e._id,meta:{resourceType:"User",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},active:e.status===Zn.UserStatus.ACTIVE};return(e.firstName||e.lastName)&&(o.name={formatted:[e.firstName,e.lastName].filter(s=>s).join(" "),familyName:e.lastName,givenName:e.firstName}),o},"toScimUserResponse"),dM=a(e=>!!e?.id,"isScimUserResponse");function fM(e){if(Xb.utils.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}a(fM,"tryGetEmail");var mM=a(e=>{let t=dM(e)?e:void 0,r=fM(e);if(!r)throw new Error("Email is required");let n;switch(e.active){case"True":case"true":case!0:n=!0;break;case"False":case"false":case!1:n=!1;break;default:pM(e.active)}let o,s;return e.name?.givenName?(o=e.name?.givenName,s=e.name?.familyName):o=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:o,lastName:s,scimInfo:{...e,isSync:!0},roles:{},status:n?Zn.UserStatus.ACTIVE:Zn.UserStatus.INACTIVE,createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimUser"),gM=a(e=>{let t={equal:{}},r=(0,Jb.parse)(e);function n(o){switch(o.op){case"eq":{let s=o.attrPath,i;switch(s){case"emails.value":i="email";break;default:i=`scimInfo.${s}`}t.equal[i]=o.compValue;break}case"and":for(let s of o.filters)n(s);break;default:console.warn("Filter not handled",{filter:o})}}return a(n,"parseFilters"),n(r),t},"userFilters");var su={};T(su,{fromScimGroup:()=>AM,toScimGroupResponse:()=>hM});var hM=a(e=>({schemas:["urn:ietf:params:scim:schemas:core:2.0:Group"],id:e._id,externalId:e.scimInfo.externalId,meta:{resourceType:"Group",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},displayName:e.name,members:e.users?.map(t=>({value:t._id}))}),"toScimGroupResponse"),yM=a(e=>!!e?.id,"isScimGroup"),AM=a(e=>{let t=yM(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 Ou={};T(Ou,{LLM:()=>Xe,LLMRequest:()=>K,TableGeneration:()=>Cu,agentHistoryTitleSystemPrompt:()=>CM,agentSystemPrompt:()=>xM,aiColumnSchemas:()=>_u,aiTableResponseToTableSchema:()=>Tu,appendAIColumns:()=>Eu,classifyText:()=>cu,cleanData:()=>pu,extractFileData:()=>EM,generateAIColumns:()=>Su,generateCode:()=>_M,generateCronExpression:()=>lu,generateData:()=>wu,generateJs:()=>gu,generateSQL:()=>vM,generateTables:()=>Iu,generationStructure:()=>vu,getLLM:()=>La,getLLMConfig:()=>bu,getLLMOrThrow:()=>pI,normalizeContentType:()=>iu,parseResponseFormat:()=>to,sanitiseToolName:()=>bM,searchWeb:()=>mu,sentimentAnalysis:()=>fu,summarizeText:()=>eo,tableDataStructuredOutput:()=>xu,translate:()=>du});var Ca=require("@budibase/types");function bM(e){if(e.length>64)throw new Error("Tool name must be under 64 characters long");return e.replace(/[^a-zA-Z0-9_-]/g,"_")}a(bM,"sanitiseToolName");function iu(e){return e?e.includes("/")?e:{[Ca.SupportedFileType.PDF]:"application/pdf",[Ca.SupportedFileType.JPG]:"image/jpeg",[Ca.SupportedFileType.JPEG]:"image/jpeg",[Ca.SupportedFileType.PNG]:"image/png"}[e.toLowerCase()]||"application/octet-stream":"application/octet-stream"}a(iu,"normalizeContentType");var so=require("@budibase/types");var Ze=require("@budibase/backend-core"),sI=require("@budibase/types");var ro=U(require("openai"));var St=require("@budibase/types");var eI=require("@budibase/shared-core");var wt=U(require("dd-trace"));function uu(e,t){return t.map(r=>e[r]).join(" ")}a(uu,"extractTextFromColumns");var Xe=class{static{a(this,"LLM")}constructor({model:t,apiKey:r,maxTokens:n}){this._model=t,this._apiKey=r,this._maxTokens=n??parseInt(process.env.BUDIBASE_AI_MAX_PROMPT_TOKENS||"1000")}get model(){return this._model}get apiKey(){return this._apiKey}get maxTokens(){return this._maxTokens}async prompt(t){return await wt.default.trace("prompt",async()=>{let r=typeof t=="string"?new K().addUserMessage(t):t,{messages:n,tokensUsed:o}=await wt.default.trace("chatCompletion",()=>this.chatCompletion(r));return!n||n.length===0?{message:"",tokensUsed:o}:{message:n[n.length-1].content||"",tokensUsed:o}})}async chat(t){return await wt.default.trace("chat",async()=>await this.chatCompletion(t))}async*chatStream(t){yield*this.chatCompletionStream(t)}async summarizeText(t){return wt.default.trace("summarizeText",()=>this.prompt(eo(t)))}async generateCronExpression(t){return wt.default.trace("generateCronExpression",()=>this.prompt(lu(t)))}async operation(t,r){return wt.default.trace("operation",n=>{n.addTags({operation:t.operation,rowId:r.id});let o=this.promptForOperation(t,r);return this.prompt(o)})}promptForOperation(t,r){let{operation:n,column:o,columns:s,language:i,categories:u,prompt:c}=t;switch(n){case St.AIOperationEnum.SUMMARISE_TEXT:return eo(uu(r,s));case St.AIOperationEnum.CLEAN_DATA:return pu(r[o]);case St.AIOperationEnum.TRANSLATE:return du(r[o],i);case St.AIOperationEnum.CATEGORISE_TEXT:if(!u)throw Error("No categories provided for categorise text operation. Please provide categories.");return cu(uu(r,s),u.split(","));case St.AIOperationEnum.SENTIMENT_ANALYSIS:return fu(r[o]);case St.AIOperationEnum.PROMPT:return c;case St.AIOperationEnum.SEARCH_WEB:return mu(uu(r,s));default:throw eI.utils.unreachable(n)}}async generateJs(t,r){return await wt.default.trace("generateJs",async()=>{let{bindings:n=[],snippets:o=[]}=r||{};return await this.prompt(gu(n,o).addUserMessage(t))})}};var rI=require("@budibase/types"),hu=require("openai/helpers/zod");var aI=(n=>(n.GPT_5_MINI="gpt-5-mini",n.GPT_5="gpt-5",n.GPT_5_NANO="gpt-5-nano",n))(aI||{});function to(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}a(to,"parseResponseFormat");function tI(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}a(tI,"calculateBudibaseAICredits");var Pe=class extends Xe{constructor(r){super(r);this.client=this.getClient(r)}static{a(this,"OpenAI")}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new ro.default({apiKey:r.apiKey})}async uploadFile(r,n,o){let s=iu(o);if(rI.ImageContentTypes.includes(s.toLowerCase())){let c;if(Buffer.isBuffer(r))c=r;else{let g=[];for await(let h of r)g.push(new Uint8Array(h));c=Buffer.concat(g)}let m=c.toString("base64");return`data:${s};base64,${m}`}let i=await(0,ro.toFile)(r,n);return(await this.client.files.create({file:i,purpose:"assistants"})).id}async chatCompletion(r){let n={model:this.model,messages:r.messages,max_completion_tokens:this._maxTokens,response_format:to(r.format)};Object.values(aI).includes(this.model)&&(n.verbosity="low",n.reasoning_effort="minimal"),r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(hu.zodFunction));let o=await this.client.chat.completions.create(n),s=o?.choices?.[0]?.message;if(s?.tool_calls){r.addMessage(s);let i=[];for(let u of s.tool_calls){if(u.type!=="function"||!u.function){console.warn(`[OPENAI TOOL WARN] Unsupported tool call type: ${u.type}`);continue}let c=u.function.name,m=r.findTool(c);if(!m)throw new Error(`Tool ${c} not found in prompt tools`);let g=JSON.parse(u.function.arguments);i.push(m.handler(g).then(h=>({role:"tool",tool_call_id:u.id,content:h})).catch(h=>(console.error(`[OPENAI TOOL ERROR] Tool ${c} failed in OpenAI handler:`,h),{role:"tool",tool_call_id:u.id,content:`Error: ${h.message}`})))}return r.addMessages(await Promise.all(i)),this.chatCompletion(r)}else{if(s?.content)return{messages:[...r.messages,{role:s.role,content:s.content}],tokensUsed:tI(o.usage)};throw new Error("No response found")}}async*chatCompletionStream(r){let n={model:this.model,messages:r.messages,max_tokens:this.maxTokens,response_format:to(r.format),stream:!0};r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(hu.zodFunction));try{let o=await this.client.chat.completions.create(n),s=null,i="",u=null;for await(let m of o){let g=m?.choices?.[0]?.delta;if(g){if(g.content&&(i+=g.content,yield{type:"content",content:g.content}),g.tool_calls&&g.tool_calls.length>0){let h=g.tool_calls[0];h.id?(s={id:h.id,name:h.function?.name||"",arguments:h.function?.arguments||""},yield{type:"tool_call_start",toolCall:{id:s.id,name:s.name,arguments:s.arguments}}):s&&h.function?.arguments&&(s.arguments+=h.function.arguments,yield{type:"tool_call_start",toolCall:{id:s.id,name:s.name,arguments:s.arguments}})}m.usage&&(u=m.usage)}}let c=u?tI(u):0;if(s){r.addMessage({role:"assistant",content:"",tool_calls:[{id:s.id,type:"function",function:{name:s.name,arguments:s.arguments}}]});let m=r.findTool(s.name);if(m)try{let g=JSON.parse(s.arguments),h=await m.handler(g);yield{type:"tool_call_result",toolResult:{id:s.id,result:h}},r.addMessage({role:"tool",tool_call_id:s.id,content:h}),yield*this.chatCompletionStream(r);return}catch(g){yield{type:"tool_call_result",toolResult:{id:s.id,result:`Error: ${g.message}`,error:g.message}},r.addMessage({role:"tool",tool_call_id:s.id,content:`Error: ${g.message}`}),yield*this.chatCompletionStream(r);return}else{let g=`Tool '${s.name}' not found`;yield{type:"tool_call_result",toolResult:{id:s.id,result:g,error:g}},r.addMessage({role:"tool",tool_call_id:s.id,content:g}),yield*this.chatCompletionStream(r);return}}i&&r.addMessage({role:"assistant",content:i}),yield{type:"done",messages:r.messages,tokensUsed:c}}catch(o){yield{type:"error",content:o.message}}}};var ee=require("@budibase/backend-core"),nI=require("@budibase/types");var yu=require("dd-trace");var ao=class extends Xe{static{a(this,"BudibaseAI")}async prompt(t){let r=await super.prompt(t);return r.tokensUsed&&await Sn(r.tokensUsed),r}async chat(t){let r=await super.chat(t);return r.tokensUsed&&await Sn(r.tokensUsed),r}async uploadFile(t,r,n){return ee.env.SELF_HOSTED?this.uploadFileSelfHost(t,r,n):this.uploadFileCloud(t,r,n)}async uploadFileCloud(t,r,n){return new Pe({apiKey:ee.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).uploadFile(t,r,n)}async uploadFileSelfHost(t,r,n){let o;if(Buffer.isBuffer(t))o=t;else{let g=[];for await(let h of t)g.push(new Uint8Array(h));o=Buffer.concat(g)}let s=o.toString("base64");if(n&&nI.ImageContentTypes.includes(n.toLowerCase()))return`data:image/jpeg;base64,${s}`;if(!ee.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let g=await dn();if(!g)throw new Error("No license key found");this._apiKey=g}let i=`${ee.env.BUDICLOUD_URL}/api/ai/upload-file`,u={method:"POST",headers:{"Content-Type":"application/json",[ee.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:s,filename:r,contentType:n})};console.debug("[BudibaseAI] uploadFileSelfHost - Making network call",{url:i,method:u.method,headers:u.headers,bodyKeys:["data","filename","contentType"],filename:r,contentType:n});let c=await fetch(i,u);if(console.debug("[BudibaseAI] uploadFileSelfHost - Network response",{url:i,status:c.status,statusText:c.statusText,ok:c.ok}),!c.ok)throw await ee.HTTPError.fromResponse(c);return(await c.json()).fileId}async chatCompletion(t){return ee.env.SELF_HOSTED?this.chatCompletionSelfHost(t):this.chatCompletionCloud(t)}async chatCompletionCloud(t){return await yu.tracer.trace("chatCompletionCloud",async()=>await new Pe({apiKey:ee.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletion(t))}async chatCompletionSelfHost(t){return await yu.tracer.trace("chatCompletionSelfHost",async r=>{if(!ee.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(r.addTags({budicloudUrl:ee.env.BUDICLOUD_URL}),!this._apiKey){let c=await dn();if(!c)throw new Error("No license key found");this._apiKey=c,r.addTags({licenseKey:this._apiKey})}let n={messages:t.messages,format:t.format,useTools:t.tools.length>0},o=`${ee.env.BUDICLOUD_URL}/api/ai/chat`,s={method:"POST",headers:{"Content-Type":"application/json",[ee.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(n)};console.debug("[BudibaseAI] chatCompletionSelfHost - Making network call",{url:o,method:s.method,headers:s.headers,bodyKeys:Object.keys(n),messagesCount:t.messages.length,useTools:n.useTools,format:n.format});let i=await fetch(o,s);if(console.debug("[BudibaseAI] chatCompletionSelfHost - Network response",{url:o,status:i.status,statusText:i.statusText,ok:i.ok}),!i.ok)throw await ee.HTTPError.fromResponse(i);let u=await i.json();return console.debug("[BudibaseAI] chatCompletionSelfHost - Response data",{url:o,tokensUsed:u.tokensUsed,messagesCount:u.messages?.length}),u})}async*chatCompletionStream(t){ee.env.SELF_HOSTED?yield*this.chatCompletionStreamSelfHost(t):yield*this.chatCompletionStreamCloud(t)}async*chatCompletionStreamCloud(t){yield*new Pe({apiKey:ee.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletionStream(t)}async*chatCompletionStreamSelfHost(t){console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Starting streaming (fallback to non-streaming)",{messagesCount:t.messages.length,toolsCount:t.tools.length});try{let r=await this.chatCompletionSelfHost(t);if(console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Yielding response chunks",{responseMessagesCount:r.messages.length,tokensUsed:r.tokensUsed}),r.messages.length>0){let n=r.messages[r.messages.length-1];n.content&&(yield{type:"content",content:n.content})}yield{type:"done",messages:r.messages,tokensUsed:r.tokensUsed}}catch(r){console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Error occurred",{error:r.message}),yield{type:"error",content:r.message}}}};var Oa=require("dd-trace");var Au=U(require("@anthropic-ai/sdk"));function IM(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}a(IM,"calculateBudibaseAICredits");var no=class extends Xe{constructor(r){super(r);this.client=new Au.default({apiKey:r.apiKey})}static{a(this,"Anthropic")}firstTextBlock(r){for(let n of r.content)if(n.type==="text")return n.text}async uploadFile(r,n,o){throw new Error("File upload not supported for this LLM provider")}async chatCompletion(r){try{let n=await this.client.messages.create({model:this.model,messages:r.messages.map(({content:s})=>{if(s==null)return{role:"user",content:""};if(typeof s=="string")return{role:"user",content:s};let i="";for(let u of s)u.type==="text"?i+=u.text:["image_url","input_audio","file"].includes(u.type);return{role:"user",content:i}}),max_tokens:this.maxTokens}),o=this.firstTextBlock(n)||"";return{messages:[...r.messages,{role:"assistant",content:o}],tokensUsed:IM(n.usage)}}catch(n){throw n instanceof Au.default.APIError&&console.error(`Anthropic Prompt failed with error ${n.name} and status: ${n.status}`),n}}async*chatCompletionStream(r){try{let n=await this.chatCompletion(r);if(n.messages.length>0){let o=n.messages[n.messages.length-1];o.content&&(yield{type:"content",content:o.content})}yield{type:"done",messages:n.messages,tokensUsed:n.tokensUsed}}catch(n){yield{type:"error",content:n.message}}}};var iI=require("zod"),uI=require("openai/helpers/zod");var oI=require("openai");var oo=class extends Pe{static{a(this,"AzureOpenAI")}getClient(t){if(!t.apiKey)throw new Error("No Azure OpenAI API key found");if(!t.model)throw new Error("No Azure OpenAI model specified");return new oI.AzureOpenAI({apiKey:t.apiKey,apiVersion:"2024-10-01-preview",baseURL:t.baseUrl})}};var cI="gpt-5-mini",SM={OpenAI:Pe,TogetherAI:Pe,AzureOpenAI:oo,Custom:Pe,Anthropic:no,BudibaseAI:ao};async function wM(){return await Oa.tracer.trace("getAIConfig",async e=>{let t={type:sI.ConfigType.AI,config:{}};if(!Ze.context.isSelfHostUsingCloud()){let n=await Ze.configs.getAIConfig();n&&(t=n)}await bs(t);let r=Object.values(t.config).find(n=>n.active&&n.isDefault);if(!r){e.addTags({enabled:!1,reason:"no provider found"});return}return e.addTags({enabled:!0}),{provider:r.provider,model:r.defaultModel||cI,apiKey:r.apiKey,baseUrl:r.baseUrl}})}a(wM,"getAIConfig");async function TM(){return Oa.tracer.trace("getSelfHostOpenAIKeyConfig",e=>{if(!Ze.env.SELF_HOSTED){e.addTags({enabled:!1,reason:"not self host"});return}if(!Ze.env.OPENAI_API_KEY){e.addTags({enabled:!1,reason:"no OPENAI_API_KEY"});return}return e.addTags({enabled:!0}),{provider:"OpenAI",model:cI,apiKey:Ze.env.OPENAI_API_KEY}})}a(TM,"getSelfHostOpenAIKeyConfig");async function bu(){return Oa.tracer.trace("getLLMConfig",async()=>await wM()||await TM())}a(bu,"getLLMConfig");async function La(e){return await Oa.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:n}=e||{},o=await bu();if(!o){t.addTags({enabled:!1,reason:"no config found"});return}r&&(o.model=r),n&&(o.maxTokens=n);let s=SM[o.provider];if(!s){t.addTags({enabled:!1,reason:"no provider found",provider:o.provider});return}return new s(o)})}a(La,"getLLM");async function pI(){let e=await La();if(!e)throw new Ze.HTTPError("No available LLM configurations",500);return e}a(pI,"getLLMOrThrow");var K=class e{constructor(){this.messages=[];this.tools=[]}static{a(this,"LLMRequest")}addTool(t){return this.tools.push(t),this}addTools(t){return this.tools.push(...t),this}findTool(t){return this.tools.find(r=>r.name===t)}withFormat(t){return t instanceof iI.z.ZodType?this.format=(0,uI.zodResponseFormat)(t,"key"):this.format=t,this}addMessage(t){return this.messages.push(t),this}addMessages(t){return this.messages.push(...t),this}addUserMessage(t){return this.messages.push({role:"user",content:t}),this}addSystemMessage(t){return this.messages.push({role:"system",content:t}),this}static fromRequest(t){let r=new e;return t.messages&&r.addMessages(t.messages),t.format&&r.withFormat(t.format),r}};var ut=require("zod");function eo(e,t){let r=`Summarize this text:
38
+ `;o.write(u)}}),r.on("end",()=>{o.end()}),{promise:n,stream:o}}a(zf,"dump");var Aa=require("@budibase/backend-core"),ba=require("@budibase/string-templates"),On=require("@budibase/types");var sC=Aa.constants.MIN_VALID_DATE.toISOString(),iC=Aa.constants.MAX_VALID_DATE.toISOString();function Ms(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||sC,e.endDate=e.endDate||iC),e}a(Ms,"fillDates");async function Jf(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(n=>Aa.db.getProdWorkspaceID(n)));let t={};function r(n,o){o?.length&&(t.oneOf={...t.oneOf,[n]:o})}return a(r,"addStringParams"),r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=Ms(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}a(Jf,"getSearchFilters");function Gs(e,t,r){let n={_id:e,status:On.AuditLogResourceStatus.DELETED};switch(t){case"app":n.name=r?.appName;break;case"user":n.email=r?.email;break}return n}a(Gs,"deleted");function Fs(e){let t=(0,ba.findHBSBlocks)(e);for(let r of t){let n=` "${r}"`;e=e.replace(e.includes(n)?n:` ${r}`,""),e=(0,ba.processStringSync)(e,{})}return e}a(Fs,"removeTemplateStrings");function Xf(e,t){let r=On.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let n=(0,ba.processStringSync)(r,t);return n.includes('""')&&(n=Fs(r)),n}a(Xf,"getEventFriendlyName");async function uC(e,t,r){if(!await gn()||!ge.utils.isAudited(e))return;let n=Xf(e,t),o=new Date;r?.timestamp&&(o=new Date(r.timestamp));let s={timestamp:o.toISOString(),event:e,name:n,userId:r?.userId||Ln.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){s.appId=ge.db.getProdWorkspaceID(r.appId);let u=await ge.cache.workspace.getWorkspaceMetadata(r.appId);"name"in u&&(i.appName=u.name)}if(r?.userId){let u=await ge.users.getById(r?.userId);i.email=u.email}}catch(u){ge.logging.logAlert("Failed to retrieve fallback information for audit log",u)}return s.fallback=i,await Yf(s)}a(uC,"write");async function cC(e){let t=e.map(u=>u.userId),n=e.filter(u=>u.appId).map(u=>ge.db.getDevWorkspaceID(u.appId)),o=await ge.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),s=await ge.db.getWorkspacesByIDs([...new Set(n)]),i=[];for(let u of e){let c=o.find(h=>h?._id===u.userId),m=s.find(h=>ge.db.isSameWorkspaceID(h?.appId,u.appId)),g={event:u.event,timestamp:u.timestamp,name:u.name,metadata:u.metadata,user:c||Gs(u.userId,"user",u.fallback)};u.appId&&(g.app=m||Gs(u.appId,"app",u.fallback)),i.push(g)}return i}a(cC,"enrich");async function pC(e){if(!await gn())throw new Error("Audit logs not available - license required.");let t=await Jf(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await Bs(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await cC(r.rows)}}a(pC,"fetch");function lC(e){return e=Ms(e),zf(e)}a(lC,"download");function dC(){let e=Object.entries(Ln.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=Fs(r[1]);return t}a(dC,"definitions");var Pn={};T(Pn,{applications:()=>Ks,roles:()=>Qs,users:()=>Ws});var Ws={};T(Ws,{roleCheck:()=>mC});function fC(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}a(fC,"removeRoles");async function mC(e,t){return await rt()||fC(e,t),e}a(mC,"roleCheck");var Qs={};T(Qs,{assign:()=>gC,unAssign:()=>hC});var Ia=require("@budibase/backend-core");async function gC(e,t){if(!await rt())throw new Error("Unable to assign roles - license required.");let r=await Ce.bulkGet(e);for(let n of r){if(t.role&&t.role.roleId){let o=Ia.db.getProdWorkspaceID(t.role.appId);n.roles[o]=t.role.roleId}if(t.appBuilder){let o=Ia.db.getProdWorkspaceID(t.appBuilder.appId),s=n.builder?.apps||[];n.builder={apps:s.concat([o])}}t.builder&&(n.builder={global:!0}),t.admin&&(n.admin={global:!0}),n.roles}await Ce.bulkUpdate(r)}a(gC,"assign");async function hC(e,t){if(!await rt())throw new Error("Unable to un-assign roles - license required.");let r=await Ce.bulkGet(e);for(let n of r){if(t.role){let o=Ia.db.getProdWorkspaceID(t.role?.appId);n.roles[o]===t.role.roleId&&delete n.roles[o]}if(t.appBuilder&&n.builder?.apps){let o=Ia.db.getProdWorkspaceID(t.appBuilder.appId);n.builder.apps=n.builder.apps.filter(s=>s!==o)}t.builder&&n.builder&&delete n.builder,t.admin&&n.admin&&delete n.admin}}a(hC,"unAssign");var Ks={};T(Ks,{buildExportFn:()=>AC,buildImportFn:()=>yC});var $s=require("@budibase/backend-core");function yC(e){return async(t,r)=>{await rt()||t.throw(403,"Endpoint unavailable, license required."),t.request.files?.appExport||t.throw(400,"Must provide app export file for import."),await $s.context.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}a(yC,"buildImportFn");function AC(e){return async(t,r)=>{await rt()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:n,excludeRows:o}=t.request.body;await $s.context.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:n,excludeRows:o},t.query.appId=t.params.appId,await e(t),await r()})}}a(AC,"buildExportFn");var ne=require("@budibase/backend-core"),ae=require("@budibase/types"),tm=U(require("fs")),rm=require("path");var Vs=require("@budibase/backend-core");var Zf;function em(){Zf=new Vs.queue.BudibaseQueue(Vs.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}a(em,"init");function Ut(){return Zf}a(Ut,"getBackupQueue");async function Hs(e,t={}){return _e.storeAppBackupMetadata(e,t)}a(Hs,"storeAppBackupMetadata");function am(e){let t=new Date().toISOString();switch(e){case ae.BackupStatus.COMPLETE:case ae.BackupStatus.FAILED:return{timestamp:t,finishedAt:t};case ae.BackupStatus.STARTED:return{timestamp:t,startedAt:t};case ae.BackupStatus.PENDING:return{timestamp:t,createdAt:t}}}a(am,"getTimestamps");async function bC(e,t,r,n){let o=await Un(e);return await _e.storeAppBackupMetadata({...o,...am(t),contents:r,status:t,type:ae.BackupType.BACKUP},{filename:n,docId:e})}a(bC,"updateBackupStatus");async function IC(e,t,r){let n=await Un(e);return await _e.storeAppBackupMetadata({...n,...am(r),status:r,type:ae.BackupType.RESTORE,trigger:ae.BackupTrigger.MANUAL},{docId:e,docRev:t})}a(IC,"updateRestoreStatus");async function Un(e){return _e.getAppBackupMetadata(e)}a(Un,"getAppBackup");async function SC(e,t){return _e.updateAppBackupMetadata(e,t)}a(SC,"updateAppBackup");async function nm(e){let t=await _e.getAppBackupMetadata(e);return t.filename&&await ne.objectStore.deleteFile(ne.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),_e.deleteAppBackupMetadata(e)}a(nm,"deleteAppBackup");async function wC(e){let t=[];for(let r of e)try{await nm(r),t.push({backupId:r,success:!0})}catch(n){t.push({backupId:r,success:!1,error:n instanceof Error?n.message:"Unknown error"})}return t}a(wC,"deleteAppBackups");async function TC(e,t){return _e.fetchAppBackups(e,t)}a(TC,"fetchAppBackups");async function om(e){let t=await _e.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let{stream:r}=await ne.objectStore.getReadStream(ne.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}a(om,"getBackupDownloadStream");async function EC(e){let{stream:t}=await om(e),r=(0,rm.join)(ne.objectStore.budibaseTempDir(),ne.utils.newid()),n=tm.default.createWriteStream(r);return new Promise((o,s)=>{t.on("error",s),n.on("error",s),t.pipe(n).on("close",()=>o(r))})}a(EC,"downloadAppBackup");async function RC(e,t,r={}){let n;try{n=await Hs({appId:e,trigger:t,timestamp:new Date().toISOString(),status:ae.BackupStatus.PENDING,type:ae.BackupType.BACKUP,...r})}catch(o){if(o.status===409)return;throw o}return await Ut().add({docId:n.id,docRev:n.rev,appId:e,export:{trigger:t,...r}}),await ne.events.backup.appBackupTriggered(e,n.id,ae.BackupType.BACKUP,t,r?.name),n.id}a(RC,"triggerAppBackup");async function vC(e,t,r,n){let o=await Un(t),s;try{s=await Hs({appId:e,timestamp:new Date().toISOString(),status:ae.BackupStatus.PENDING,type:ae.BackupType.RESTORE,createdBy:n})}catch(i){if(i?.status===409)return;throw i}return await Ut().add({appId:e,docId:s.id,docRev:s.rev,import:{nameForBackup:r,backupId:t,createdBy:n}}),{restoreId:s.id,metadata:o}}a(vC,"triggerAppRestore");async function _C(e,t,r){let n=ne.db.getProdWorkspaceID(e);await ne.context.doInWorkspaceContext(n,async()=>{let o=ne.context.getProdWorkspaceDB();if(!await o.exists())return;let i=await o.tryGet(ae.DocumentType.WORKSPACE_METADATA);i&&(i.backupErrors||(i.backupErrors={}),i.backupErrors[t]||(i.backupErrors[t]=[]),i.backupErrors[t].push(r),await o.put(i),await ne.cache.workspace.invalidateWorkspaceMetadata(i.appId,i))})}a(_C,"trackBackupError");var xC={isEnabled:ms,triggerAppRestore:le(vC),triggerAppBackup:le(RC),getBackupDownloadStream:le(om),downloadAppBackup:le(EC),fetchAppBackups:le(TC),storeAppBackupMetadata:le(Hs),updateBackupStatus:le(bC),updateRestoreStatus:le(IC),getAppBackup:le(Un),updateAppBackup:le(SC),deleteAppBackup:le(nm),deleteAppBackups:le(wC),trackBackupError:le(_C)},Oe=xC;var zs={};T(zs,{init:()=>Ys});var $=require("@budibase/backend-core"),Ge=require("@budibase/types"),lr=U(require("fs"));async function Ys(e){Ut().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),LC(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),OC(t,e)}catch(n){$.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,n)}})}a(Ys,"init");async function CC(e){await $.db.getDB(e,{skip_setup:!0}).destroy()}a(CC,"removeExistingApp");async function sm(e,t,r,n){let o=$.db.getDevWorkspaceID(r),s=$.db.getProdWorkspaceID(r),i=new Date().toISOString(),u=a(async(c,m)=>{n?.doc?await Oe.updateBackupStatus(n.doc.id,c,m?.contents,m?.filename):await Oe.storeAppBackupMetadata({appId:s,timestamp:i,trigger:e,status:c,name:n?.name,type:Ge.BackupType.BACKUP,contents:m?.contents,createdBy:n?.createdBy},{filename:m?.filename})},"updateMetadata");try{let c=await n.processing.exportAppFn(o,{tar:!0}),m=await n.processing.statsFn(o),g=`${s}/backup-${i}.tar.gz`,h=$.objectStore.ObjectStoreBuckets.BACKUPS,y=lr.default.createReadStream(c);await $.objectStore.streamUpload({bucket:h,filename:g,stream:y,extra:{type:"application/gzip",metadata:{name:n?.name,trigger:e,timestamp:i,appId:s}}}),await u(Ge.BackupStatus.COMPLETE,{filename:g,contents:m}),lr.default.existsSync(c)&&lr.default.rmSync(c)}catch(c){$.logging.logAlert("App backup error",c),await u(Ge.BackupStatus.FAILED);let m=n?.doc?.id||`backup-${i}`,g=c instanceof Error?c.message:String(c);await Oe.trackBackupError(s,m,`Backup export failed: ${g}`)}}a(sm,"runBackup");async function OC(e,t){let r=e.data,n=r.appId,o=r.import.backupId,s=r.import.nameForBackup,i=r.import.createdBy,u=$.tenancy.getTenantIDFromWorkspaceID(n);return $.tenancy.doInTenant(u,async()=>{let c=$.db.getDevWorkspaceID(n),m=`${c}_temp_${Date.now()}`,{rev:g}=await Oe.updateRestoreStatus(r.docId,r.docRev,Ge.BackupStatus.STARTED);await sm(Ge.BackupTrigger.RESTORING,u,n,{processing:t,createdBy:i,name:s});let h=await Oe.downloadAppBackup(o),y=Ge.BackupStatus.COMPLETE;try{await t.importAppFn(m,$.db.getDB(m),{file:{type:"application/gzip",path:h},key:h}),await CC(c),await new $.db.Replication({source:m,target:c}).replicate()}catch(S){$.logging.logAlert("App restore error",S),y=Ge.BackupStatus.FAILED;let O=S instanceof Error?S.message:String(S);await Oe.trackBackupError(n,o,`Backup restore failed: ${O}`)}finally{try{await $.db.getDB(m,{skip_setup:!0}).destroy()}catch{}}await Oe.updateRestoreStatus(r.docId,g,y),lr.default.existsSync(h)&&lr.default.rmSync(h,{force:!0})})}a(OC,"importProcessor");async function LC(e,t){let r=e.data,n=r.appId,o=r.export.trigger,s=r.export.name,i=$.tenancy.getTenantIDFromWorkspaceID(n);await $.tenancy.doInTenant(i,async()=>{try{let{rev:u}=await Oe.updateBackupStatus(r.docId,Ge.BackupStatus.STARTED);return sm(o,i,n,{processing:t,doc:{id:r.docId,rev:u},name:s})}catch(u){$.logging.logAlert("App backup error",u);let c=u instanceof Error?u.message:String(u);await Oe.trackBackupError(n,r.docId,`Backup export failed: ${c}`)}})}a(LC,"exportProcessor");var PC=a(async e=>{em(),await Ys(e.processing)},"init"),we={...Oe,processing:zs,init:PC,getBackupQueue:Ut};var im=a(async e=>{e.backups&&await we.init(e.backups)},"init");var ye={};T(ye,{create:()=>RB,find:()=>EB,get:()=>TB,remove:()=>_B,update:()=>vB});var CA=U(Qi()),ot=require("@budibase/backend-core");var OA=require("@budibase/types");async function TB(e){let t=ot.tenancy.getGlobalDB(),r=new ot.db.QueryBuilder(t.name,OA.SearchIndex.USER);r.setIndexBuilder(ot.db.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[o,s]of Object.entries(e.filters?.equal??{}))r.addEqual(o,s);r.setSort("_id"),r.setSkip(e.skip);let n=await r.run();return{users:n.rows,total:n.totalRows}}a(TB,"get");async function EB(e){return await ot.users.getById(e)}a(EB,"find");async function RB(e){let t=await Ce.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new ot.HTTPError("User is already synched",409);e={...t,scimInfo:(0,CA.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Ce.save(e,{requirePassword:!1})}a(RB,"create");async function vB(e,t){return await Ce.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}a(vB,"update");async function _B(e){return await Ce.destroy(e)}a(_B,"remove");var yr={};T(yr,{create:()=>xB});var LA=U(Qi());var PA=require("@budibase/backend-core");async function xB(e){let t=await bo(e.name),r;if(!t)r=(await Q.save(e)).id;else{if(t.scimInfo?.isSync)throw new PA.HTTPError("Group is already synched",409);r=t._id,t.users&&(await Q.removeUsers(r,t.users.map(o=>o._id)),delete t.users),t.scimInfo=(0,LA.default)(t.scimInfo,e.scimInfo),await Q.save(t)}return await Q.get(r)}a(xB,"create");var kt={};T(kt,{logRequest:()=>CB,logResponse:()=>OB});var $i=require("@budibase/backend-core");async function CB(e){$i.logging.logWarn("SCIM request log",e)}a(CB,"logRequest");async function OB(e){$i.logging.logWarn("SCIM response error",e)}a(OB,"logResponse");var Xi={};T(Xi,{doInScimContext:()=>Vi,feature:()=>oe,internalGroupOnly:()=>Ra,licenseAuth:()=>Ji,licensing:()=>UA,requireSCIM:()=>Hi,scimGroupOnly:()=>Ea,scimUserOnly:()=>Ta});var It=require("@budibase/backend-core");var Kn=require("@budibase/types");var LB=a((e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(It.env.SELF_HOSTED&&It.env.DEFAULT_LICENSE)return t.user.license=Io,r();t.user.license=await $e.cache.getCachedLicense(t,{populateLicense:e.populateLicense,populateFreeLicense:e.populateFreeLicense}),e.checkUsersLimit&&(It.utils.isServingApp(t)||It.utils.isServingBuilder(t)||It.utils.isServingBuilderPreview(t)||It.utils.isPublicApiRequest(t))&&await Ye.usageLimitIsExceeded({name:Kn.StaticQuotaName.USERS,type:Kn.QuotaUsageType.STATIC,usageChange:0})}return r()},"licensing"),UA=LB;var oe={};T(oe,{requireFeature:()=>PB,requireFeatures:()=>UB});var PB=a(e=>async(t,r)=>{await mn(e),await r()},"requireFeature"),UB=a((...e)=>async(t,r)=>{await fs(e),await r()},"requireFeatures");var Vn=require("@budibase/backend-core");var Vi=a(async(e,t)=>(Vn.env.DISABLE_SCIM_CALLS||await kt.logRequest({...e.request.toJSON(),body:e.request.body}),await Vn.context.doInScimContext(async()=>{let r=await t();return await kt.logResponse({...e.response.toJSON(),body:e.response.body}),r})),"doInScimContext");var Hi=a(async(e,t)=>{await As(),await t()},"requireSCIM");var qA=require("@budibase/backend-core");var Ta=a(e=>Yi(qA.users.getById,e,!0),"scimUserOnly"),Ea=a(e=>Yi(M.get,e,!0),"scimGroupOnly"),Ra=a(e=>Yi(M.get,e,!1),"internalGroupOnly");function Yi(e,t,r){return async(n,o)=>{let s=n.params[t];return typeof s!="string"&&n.throw(404),!!(await e(s)).scimInfo?.isSync!==r&&n.throw(404),o()}}a(Yi,"scimSyncChecks");var va=require("@budibase/backend-core");var zi=require("dd-trace");async function Ji(e,t){await zi.tracer.trace("licenseAuth",async r=>{let n=e.request.headers[va.constants.Header.LICENSE_KEY];Array.isArray(n)&&(n=n[0]),r.addTags({licenseKey:n}),n||e.throw(403,"License key not provided");let o=await cs(n);o||(r.addTags({licenseFound:!1}),e.throw(403,"License not found or invalid")),o.tenantId||e.throw(403,"License does not have a tenant ID"),zi.tracer.setUser({id:"anonymous",tenantId:o.tenantId}),await va.context.doInSelfHostTenantUsingCloud(o.tenantId,async()=>{await va.context.doInLicenseContext(o,async()=>{await t()})})})}a(Ji,"default");var nu={};T(nu,{appBackups:()=>QA,auditLogs:()=>XA,environmentVariables:()=>ib,groups:()=>Ib,scim:()=>zb});var st=require("@budibase/backend-core"),Yn=require("@budibase/types"),WA=U(require("@koa/router")),Nt=U(require("joi"));var Hn=require("@budibase/backend-core"),Zi=require("@budibase/types");async function Dt(e,t){t||e.throw(400,"App ID missing"),await Kt.workspaceExists(t)||e.throw(400,`Provided app ID: ${t} - is invalid.`)}a(Dt,"checkAppID");async function kA(e){let t=e.params.appId;await Dt(e,t);let{body:r}=e.request,n=e.user?._id,o=await we.triggerAppBackup(t,Zi.BackupTrigger.MANUAL,{name:r.name,createdBy:n});o||e.throw(500,"Unable to start backup."),e.body={backupId:o,message:"Backup triggered - process starting."}}a(kA,"manualBackup");async function DA(e){let t=e.params.appId;await Dt(e,t);let r=e.params.backupId,n=e.request.body.name,o=await we.triggerAppRestore(t,r,n,e.user?._id);o||e.throw(500,"Unable to start restore."),await Hn.events.backup.appBackupRestored(o.metadata),e.body={restoreId:o?.restoreId,message:"Restore triggered - process starting."}}a(DA,"importBackup");async function NA(e){let t=e.params.appId;await Dt(e,t);let r=e.params.backupId;await we.deleteAppBackup(r),e.body={message:"Backup deleted successfully."}}a(NA,"deleteBackup");async function BA(e){let t=Hn.context.getWorkspaceId();await Dt(e,t);let{backupIds:r}=e.request.body;(!Array.isArray(r)||r.length===0)&&e.throw(400,"backupIds must be a non-empty array");let n=await we.deleteAppBackups(r),o=n.filter(i=>i.success).length,s=n.length-o;e.body={message:`${o} backups deleted successfully${s>0?`, ${s} failed`:""}.`,results:n,successCount:o,failureCount:s}}a(BA,"deleteBackups");async function MA(e){let t=e.params.appId;await Dt(e,t);let r=e.request.body;r?.trigger&&(r.trigger=r.trigger.toLowerCase(),Object.values(Zi.BackupTrigger).includes(r.trigger)||e.throw(400,"Provided trigger is not a valid option.")),e.body=await we.fetchAppBackups(t,{paginate:!0,...r})}a(MA,"fetchBackups");async function GA(e){let t=e.params.appId;await Dt(e,t);let r=e.params.backupId,n=e.request.body;e.body=await we.updateAppBackup(r,n.name)}a(GA,"updateBackup");async function FA(e){let t=e.params.appId;await Dt(e,t);let r=e.params.backupId,{metadata:n,stream:o}=await we.getBackupDownloadStream(r);e.attachment(`backup-${n.timestamp}.tar.gz`),e.body=o}a(FA,"downloadBackup");var jA=new WA.default;function kB(){return st.auth.joiValidator.body(Nt.default.object({trigger:Nt.default.string().valid(...Object.values(Yn.BackupTrigger)),type:Nt.default.string().valid(...Object.values(Yn.BackupType)),startDate:Nt.default.date(),endDate:Nt.default.date(),page:Nt.default.string()}))}a(kB,"validateBackupSearch");jA.post("/api/apps/:appId/backups",st.auth.builderOrAdmin,kA).post("/api/apps/:appId/backups/search",st.auth.builderOrAdmin,kB(),MA).get("/api/apps/:appId/backups/:backupId/file",st.auth.builderOrAdmin,FA).patch("/api/apps/:appId/backups/:backupId",st.auth.builderOrAdmin,GA).delete("/api/apps/:appId/backups/:backupId",st.auth.builderOrAdmin,NA).delete("/api/apps/:appId/backups",st.auth.builderOrAdmin,BA).post("/api/apps/:appId/backups/:backupId/import",st.auth.builderOrAdmin,DA);var QA=jA;var eu=require("@budibase/backend-core");async function $A(e){let t=e.request.body,r=await bt.fetch(t);await eu.events.auditLog.filtered(t),e.body=r}a($A,"search");async function KA(e){let t=e.request.body,{stream:r}=bt.download(t);await eu.events.auditLog.downloaded(t),e.attachment(`audit-logs-${Date.now()}.log`),e.body=r}a(KA,"download");async function VA(e){e.body={events:bt.definitions()}}a(VA,"definitions");var YA=require("@budibase/types"),Bt=require("@budibase/backend-core"),zA=U(require("@koa/router")),Le=U(require("joi"));function HA(){return Bt.auth.joiValidator.body(Le.default.object({userIds:Le.default.array().items(Le.default.string()).optional(),appIds:Le.default.array().items(Le.default.string()).optional(),events:Le.default.array().items(Le.default.string().valid(...Object.values(YA.Event))).optional(),startDate:Le.default.string().optional().allow(""),endDate:Le.default.string().optional().allow(""),fullSearch:Le.default.string().optional().allow(""),bookmark:Le.default.number()}))}a(HA,"buildAuditLogSearchValidator");var JA=new zA.default;JA.post("/api/global/auditlogs/search",Bt.auth.adminOnly,HA(),$A).get("/api/global/auditlogs/download",Bt.auth.adminOnly,Bt.middleware.querystringToBody,HA(),KA).get("/api/global/auditlogs/definitions",Bt.auth.adminOnly,VA);var XA=JA;var ru=require("@budibase/backend-core"),tu=require("@budibase/types");async function ZA(e){e.body={encryptionKeyAvailable:ze.isEncryptionKeyAvailable()}}a(ZA,"status");async function eb(e){e.body={variables:await ze.fetch()}}a(eb,"fetch");async function tb(e){let{name:t,production:r,development:n}=e.request.body;await ze.update(t,{production:r,development:n});let o=[tu.Environment.PRODUCTION];r!==n&&o.push(tu.Environment.DEVELOPMENT),await ru.events.environmentVariable.created(t,o),e.body={message:`Environment variable "${t}" created.`}}a(tb,"create");async function rb(e){let{production:t,development:r}=e.request.body,n=e.params.varName;await ze.update(n,{production:t,development:r}),e.body={message:`Environment variable "${n}" updated.`}}a(rb,"update");async function ab(e){let t=e.params.varName;await ze.remove(t),await ru.events.environmentVariable.deleted(t),e.body={message:`Environment variable "${t}" deleted.`}}a(ab,"destroy");var Mt=require("@budibase/backend-core"),ob=U(require("@koa/router")),_a=U(require("joi"));var sb=new ob.default;function nb(){return Mt.auth.joiValidator.body(_a.default.object({name:_a.default.string().optional(),production:_a.default.string().required(),development:_a.default.string().required()}))}a(nb,"buildEnvVarUpdateValidator");sb.get("/api/env/variables/status",Mt.auth.builderOrAdmin,ZA).get("/api/env/variables",Mt.auth.builderOrAdmin,eb).post("/api/env/variables",Mt.auth.builderOrAdmin,nb(),tb).patch("/api/env/variables/:varName",Mt.auth.builderOrAdmin,nb(),rb).delete("/api/env/variables/:varName",Mt.auth.builderOrAdmin,ab);var ib=sb;var Je=require("@budibase/backend-core"),it=require("@budibase/types"),Ab=U(require("@koa/router")),de=U(require("joi"));var ub=require("@budibase/backend-core");async function cb(e){let t=e.request.body;if(t.name=t.name.trim(),delete t.roles,t._id){let n=await pr(t._id);t.roles=n.roles,t.scimInfo=n.scimInfo}let r=await Tn(t);e.body={_id:r.id,_rev:r.rev}}a(cb,"save");async function pb(e){let t=e.params.groupId,r=e.request.body.add,n=e.request.body.remove;(r&&!Array.isArray(r)||n&&!Array.isArray(n))&&e.throw(400,"Must supply a list of users to add or to remove");let o,s;r&&(o=await En(t,r)),n&&(s=await xs(t,n)),e.body={added:o,removed:s}}a(pb,"updateGroupUsers");async function lb(e){let t=e.params.groupId,r=e.request.body.add,n=e.request.body.remove;(r&&!Array.isArray(r)||n&&!Array.isArray(n))&&e.throw(400,"Must supply a list of objects, with appId and roleId to add or remove"),e.body=await Cs(t,{appsToAdd:r,appsToRemove:n})}a(lb,"updateGroupApps");async function fb(e){e.body={data:await ha()}}a(fb,"fetch");async function mb(e){let{groupId:t,rev:r}=e.params;try{await _s(t,r),e.body={message:"Group deleted successfully"}}catch(n){e.throw(n.status,n)}}a(mb,"destroy");async function gb(e){try{e.body=await pr(e.params.groupId)}catch(t){e.throw(t.status,t)}}a(gb,"find");async function hb(e){let{pageSize:t=10,bookmark:r,emailSearch:n}=e.request.query,o=e.params.groupId,s={limit:t+1},i=await Fa(o,{...s,emailSearch:n,bookmark:r}),u=n?i[t]?.email:i[t]?._id,c=!!u;e.body={users:i.slice(0,t),bookmark:u,hasNextPage:c}}a(hb,"searchUsers");async function yb(e){let{groupId:t}=e.params,{csvContent:r}=e.request.body;(r===void 0||r.trim().length===0)&&e.throw(400,"CSV is empty");let n=await ub.csv.jsonFromCsvString(r,{allowSingleColumn:!0});(!n||n.length===0)&&e.throw(400,"CSV file is invalid");let s=Object.keys(n[0]).find(h=>/^(email|e-mail|email address|mail|e_mail)$/i.test(h.trim()));s||e.throw(400,"CSV file must contain an email column");let i=Array.from(new Set(n.map(h=>h[s]).filter(h=>h&&typeof h=="string"&&h.trim().length>0).map(h=>h.trim())));i.length===0&&e.throw(400,"No valid email addresses found in CSV");try{await pr(t)}catch(h){if(h.status===404)e.throw(404,"Group not found");else throw h}let u=[],c=[],m=[],g=await Promise.all(i.map(h=>Ce.getUserByEmail(h)));for(let h of i){let y=g.find(S=>S?.email===h);y?(u.push({_id:y._id,email:y.email}),m.push(y._id)):c.push({email:h,reason:"User not found"})}m.length>0&&await En(t,m),e.body={added:u,skipped:c}}a(yb,"bulkAddUsersFromCsv");var bb=new Ab.default;function MB(){return Je.auth.joiValidator.body(de.default.object({_id:de.default.string().optional(),_rev:de.default.string().optional(),color:de.default.string().required(),icon:de.default.string().required(),name:de.default.string().trim().required().max(50),role:de.default.string().optional(),users:de.default.array().optional(),apps:de.default.array().optional(),roles:de.default.object().optional(),createdAt:de.default.string().optional(),updatedAt:de.default.string().optional()}).required())}a(MB,"buildGroupSaveValidation");bb.post("/api/global/groups",Je.auth.adminOnly,oe.requireFeature(it.Feature.USER_GROUPS),MB(),cb).get("/api/global/groups",oe.requireFeature(it.Feature.USER_GROUPS),fb).delete("/api/global/groups/:groupId/:rev",oe.requireFeature(it.Feature.USER_GROUPS),Je.auth.adminOnly,Ra("groupId"),mb).get("/api/global/groups/:groupId",oe.requireFeature(it.Feature.USER_GROUPS),Je.auth.builderOrAdmin,gb).get("/api/global/groups/:groupId/users",oe.requireFeature(it.Feature.USER_GROUPS),Je.auth.builderOrAdmin,hb).post("/api/global/groups/:groupId/users",Je.auth.adminOnly,oe.requireFeature(it.Feature.USER_GROUPS),Ra("groupId"),pb).post("/api/global/groups/:groupId/users/bulk",Je.auth.adminOnly,oe.requireFeature(it.Feature.USER_GROUPS),Ra("groupId"),Je.auth.joiValidator.body(de.default.object({csvContent:de.default.string().required()}).required()),yb).post("/api/global/groups/:groupId/apps",Je.auth.builderOrAdmin,oe.requireFeature(it.Feature.USER_GROUPS),lb);var Ib=bb;var Yb=U(require("@koa/router"));var zn=require("scim-patch");var wb=require("@budibase/backend-core");function Sb(e,t){let r=e.request.query[t];if(r!==void 0)return+r}a(Sb,"tryGetQueryAsNumber");var Tb=a(async e=>{let t=Sb(e,"pageSize")??20,r=Sb(e,"startIndex"),n;e.request.query.filter&&(n=H.user.userFilters(e.request.query.filter));let o=await ye.get({pageSize:t,skip:r,filters:n});e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:o.total,Resources:o.users.map(H.user.toScimUserResponse),startIndex:(r||0)+1,itemsPerPage:t}},"get"),Eb=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404);let r=await ye.find(t);e.body=H.user.toScimUserResponse(r)},"find"),Rb=a(async e=>{let t=H.user.fromScimUser(e.request.body);try{let r=await ye.create(t);e.body=H.user.toScimUserResponse(r)}catch(r){throw r instanceof wb.EmailUnavailableError&&e.throw(409,"Email already in use"),r}},"create");function GB(e){let t=e.Operations.find(r=>(r.op==="Replace"||r.op==="replace")&&r.path==="active");return t?t.value===!1||t.value?.toLowerCase?.()==="false":!1}a(GB,"isDeactivation");var vb=a(async e=>{let t=await ye.find(e.params.id);t||e.throw(404);let r=H.user.toScimUserResponse(t),n=e.request.body;try{(0,zn.patchBodyValidation)(n)}catch{}if(GB(n))return au(e);let o;try{o=(0,zn.scimPatch)(r,n.Operations)}catch{}o||e.throw(500);let s=H.user.fromScimUser(o);await ye.update(s,{allowChangingEmail:!0}),e.body=H.user.toScimUserResponse(s)},"update"),au=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404),await ye.remove(t),e.status=204},"remove");var Fb=U(Gb()),Wb=require("@budibase/shared-core"),Jn=require("scim-patch");var Xn=require("scim2-parse-filter");function jb(e,t){for(let r of t.split(","))delete e[r]}a(jb,"cleanResponse");var Qb=a(async e=>{let r=(await Q.fetch()).filter(s=>s.scimInfo?.isSync).map(H.group.toScimGroupResponse),{filter:n,excludedAttributes:o}=e.request.query;if(n){let s=(0,Xn.filter)((0,Xn.parse)(n));r=r.filter(s)}o&&r.forEach(s=>{jb(s,o)}),e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:r.length,Resources:r,startIndex:1,itemsPerPage:r.length}},"get"),$b=a(async e=>{let t=H.group.fromScimGroup(e.request.body),r=await yr.create(t);e.body=H.group.toScimGroupResponse(r)},"create"),Kb=a(async e=>{let{id:t}=e.params,r=await Q.get(t),n=H.group.toScimGroupResponse(r),{excludedAttributes:o}=e.request.query;o&&jb(n,o),e.body=n},"find"),Vb=a(async e=>{let{id:t}=e.params,r=await Q.get(t);await Q.remove(t,r._rev),e.status=204},"remove"),Hb=a(async e=>{let{id:t}=e.params,r=await Q.get(t),n=H.group.toScimGroupResponse(r),o=e.request.body;try{(0,Jn.patchBodyValidation)(o)}catch{e.throw(400)}let{true:s,false:i}=(0,Fb.default)(o.Operations,u=>u.path==="members");if(i?.length){let u=(0,Jn.scimPatch)(n,i);u||e.throw(500);let c={...H.group.fromScimGroup(u),_rev:r._rev};await Q.save(c)}if(s?.length){let u=[],c=[];for(let{op:m,value:g}of s)switch(m){case"add":case"Add":for(let h of g)u.push(await ye.find(h.value));break;case"remove":case"Remove":for(let h of g)c.push(await ye.find(h.value));break;case"replace":case"Replace":throw new Error("Replacing members is not allowed");default:Wb.utils.unreachable(m)}u.length&&await Q.addUsers(t,u.map(m=>m._id)),c.length&&await Q.removeUsers(t,c.map(m=>m._id))}e.body=H.group.toScimGroupResponse(await Q.get(t))},"update");var xa=require("@budibase/types"),Te=new Yb.default({prefix:"/api/global/scim/v2"});Te.use(Hi);Te.use(Vi);Te.get("/users",Tb);Te.get("/users/:id",Ta("id"),Eb);Te.post("/users",Rb);Te.patch("/users/:id",Ta("id"),vb);Te.delete("/users/:id",Ta("id"),au);Te.get("/groups",Qb);Te.post("/groups",oe.requireFeature(xa.Feature.USER_GROUPS),$b);Te.get("/groups/:id",oe.requireFeature(xa.Feature.USER_GROUPS),Ea("id"),Kb);Te.delete("/groups/:id",oe.requireFeature(xa.Feature.USER_GROUPS),Ea("id"),Vb);Te.patch("/groups/:id",oe.requireFeature(xa.Feature.USER_GROUPS),Ea("id"),Hb);var zb=Te;var H={};T(H,{group:()=>su,user:()=>ou});var ou={};T(ou,{fromScimUser:()=>mM,toScimUserResponse:()=>lM,userFilters:()=>gM});var Zn=require("@budibase/types"),Jb=require("scim2-parse-filter"),Xb=require("@budibase/backend-core"),Zb=require("@budibase/shared-core");var{unreachable:pM}=Zb.utils,lM=a(e=>{let{isSync:t,roles:r,...n}=e.scimInfo||{},o={...n,schemas:["urn:ietf:params:scim:schemas:core:2.0:User"],id:e._id,meta:{resourceType:"User",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},active:e.status===Zn.UserStatus.ACTIVE};return(e.firstName||e.lastName)&&(o.name={formatted:[e.firstName,e.lastName].filter(s=>s).join(" "),familyName:e.lastName,givenName:e.firstName}),o},"toScimUserResponse"),dM=a(e=>!!e?.id,"isScimUserResponse");function fM(e){if(Xb.utils.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}a(fM,"tryGetEmail");var mM=a(e=>{let t=dM(e)?e:void 0,r=fM(e);if(!r)throw new Error("Email is required");let n;switch(e.active){case"True":case"true":case!0:n=!0;break;case"False":case"false":case!1:n=!1;break;default:pM(e.active)}let o,s;return e.name?.givenName?(o=e.name?.givenName,s=e.name?.familyName):o=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:o,lastName:s,scimInfo:{...e,isSync:!0},roles:{},status:n?Zn.UserStatus.ACTIVE:Zn.UserStatus.INACTIVE,createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimUser"),gM=a(e=>{let t={equal:{}},r=(0,Jb.parse)(e);function n(o){switch(o.op){case"eq":{let s=o.attrPath,i;switch(s){case"emails.value":i="email";break;default:i=`scimInfo.${s}`}t.equal[i]=o.compValue;break}case"and":for(let s of o.filters)n(s);break;default:console.warn("Filter not handled",{filter:o})}}return a(n,"parseFilters"),n(r),t},"userFilters");var su={};T(su,{fromScimGroup:()=>AM,toScimGroupResponse:()=>hM});var hM=a(e=>({schemas:["urn:ietf:params:scim:schemas:core:2.0:Group"],id:e._id,externalId:e.scimInfo.externalId,meta:{resourceType:"Group",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},displayName:e.name,members:e.users?.map(t=>({value:t._id}))}),"toScimGroupResponse"),yM=a(e=>!!e?.id,"isScimGroup"),AM=a(e=>{let t=yM(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 Ou={};T(Ou,{LLM:()=>Xe,LLMRequest:()=>K,TableGeneration:()=>Cu,agentHistoryTitleSystemPrompt:()=>CM,agentSystemPrompt:()=>xM,aiColumnSchemas:()=>_u,aiTableResponseToTableSchema:()=>Tu,appendAIColumns:()=>Eu,classifyText:()=>cu,cleanData:()=>pu,extractFileData:()=>EM,generateAIColumns:()=>Su,generateCode:()=>_M,generateCronExpression:()=>lu,generateData:()=>wu,generateJs:()=>gu,generateSQL:()=>vM,generateTables:()=>Iu,generationStructure:()=>vu,getLLM:()=>La,getLLMConfig:()=>bu,getLLMOrThrow:()=>pI,normalizeContentType:()=>iu,parseResponseFormat:()=>to,sanitiseToolName:()=>bM,searchWeb:()=>mu,sentimentAnalysis:()=>fu,summarizeText:()=>eo,tableDataStructuredOutput:()=>xu,translate:()=>du});var Ca=require("@budibase/types");function bM(e){if(e.length>64)throw new Error("Tool name must be under 64 characters long");return e.replace(/[^a-zA-Z0-9_-]/g,"_")}a(bM,"sanitiseToolName");function iu(e){return e?e.includes("/")?e:{[Ca.SupportedFileType.PDF]:"application/pdf",[Ca.SupportedFileType.JPG]:"image/jpeg",[Ca.SupportedFileType.JPEG]:"image/jpeg",[Ca.SupportedFileType.PNG]:"image/png"}[e.toLowerCase()]||"application/octet-stream":"application/octet-stream"}a(iu,"normalizeContentType");var so=require("@budibase/types");var Ze=require("@budibase/backend-core"),sI=require("@budibase/types");var ro=U(require("openai"));var St=require("@budibase/types");var eI=require("@budibase/shared-core");var wt=U(require("dd-trace"));function uu(e,t){return t.map(r=>e[r]).join(" ")}a(uu,"extractTextFromColumns");var Xe=class{static{a(this,"LLM")}constructor({model:t,apiKey:r,maxTokens:n}){this._model=t,this._apiKey=r,this._maxTokens=n??parseInt(process.env.BUDIBASE_AI_MAX_PROMPT_TOKENS||"1000")}get model(){return this._model}get apiKey(){return this._apiKey}get maxTokens(){return this._maxTokens}async prompt(t){return await wt.default.trace("prompt",async()=>{let r=typeof t=="string"?new K().addUserMessage(t):t,{messages:n,tokensUsed:o}=await wt.default.trace("chatCompletion",()=>this.chatCompletion(r));return!n||n.length===0?{message:"",tokensUsed:o}:{message:n[n.length-1].content||"",tokensUsed:o}})}async chat(t){return await wt.default.trace("chat",async()=>await this.chatCompletion(t))}async*chatStream(t){yield*this.chatCompletionStream(t)}async summarizeText(t){return wt.default.trace("summarizeText",()=>this.prompt(eo(t)))}async generateCronExpression(t){return wt.default.trace("generateCronExpression",()=>this.prompt(lu(t)))}async operation(t,r){return wt.default.trace("operation",n=>{n.addTags({operation:t.operation,rowId:r.id});let o=this.promptForOperation(t,r);return this.prompt(o)})}promptForOperation(t,r){let{operation:n,column:o,columns:s,language:i,categories:u,prompt:c}=t;switch(n){case St.AIOperationEnum.SUMMARISE_TEXT:return eo(uu(r,s));case St.AIOperationEnum.CLEAN_DATA:return pu(r[o]);case St.AIOperationEnum.TRANSLATE:return du(r[o],i);case St.AIOperationEnum.CATEGORISE_TEXT:if(!u)throw Error("No categories provided for categorise text operation. Please provide categories.");return cu(uu(r,s),u.split(","));case St.AIOperationEnum.SENTIMENT_ANALYSIS:return fu(r[o]);case St.AIOperationEnum.PROMPT:return c;case St.AIOperationEnum.SEARCH_WEB:return mu(uu(r,s));default:throw eI.utils.unreachable(n)}}async generateJs(t,r){return await wt.default.trace("generateJs",async()=>{let{bindings:n=[],snippets:o=[]}=r||{};return await this.prompt(gu(n,o).addUserMessage(t))})}};var rI=require("@budibase/types"),hu=require("openai/helpers/zod");var aI=(n=>(n.GPT_5_MINI="gpt-5-mini",n.GPT_5="gpt-5",n.GPT_5_NANO="gpt-5-nano",n))(aI||{});function to(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}a(to,"parseResponseFormat");function tI(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}a(tI,"calculateBudibaseAICredits");var Pe=class extends Xe{constructor(r){super(r);this.client=this.getClient(r)}static{a(this,"OpenAI")}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new ro.default({apiKey:r.apiKey})}async uploadFile(r,n,o){let s=iu(o);if(rI.ImageContentTypes.includes(s.toLowerCase())){let c;if(Buffer.isBuffer(r))c=r;else{let g=[];for await(let h of r)g.push(new Uint8Array(h));c=Buffer.concat(g)}let m=c.toString("base64");return`data:${s};base64,${m}`}let i=await(0,ro.toFile)(r,n);return(await this.client.files.create({file:i,purpose:"assistants"})).id}async chatCompletion(r){let n={model:this.model,messages:r.messages,max_completion_tokens:this._maxTokens,response_format:to(r.format)};Object.values(aI).includes(this.model)&&(n.verbosity="low",n.reasoning_effort="minimal"),r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(hu.zodFunction));let o=await this.client.chat.completions.create(n),s=o?.choices?.[0]?.message;if(s?.tool_calls){r.addMessage(s);let i=[];for(let u of s.tool_calls){if(u.type!=="function"||!u.function){console.warn(`[OPENAI TOOL WARN] Unsupported tool call type: ${u.type}`);continue}let c=u.function.name,m=r.findTool(c);if(!m)throw new Error(`Tool ${c} not found in prompt tools`);let g=JSON.parse(u.function.arguments);i.push(m.handler(g).then(h=>({role:"tool",tool_call_id:u.id,content:h})).catch(h=>(console.error(`[OPENAI TOOL ERROR] Tool ${c} failed in OpenAI handler:`,h),{role:"tool",tool_call_id:u.id,content:`Error: ${h.message}`})))}return r.addMessages(await Promise.all(i)),this.chatCompletion(r)}else{if(s?.content)return{messages:[...r.messages,{role:s.role,content:s.content}],tokensUsed:tI(o.usage)};throw new Error("No response found")}}async*chatCompletionStream(r){let n={model:this.model,messages:r.messages,max_tokens:this.maxTokens,response_format:to(r.format),stream:!0};r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(hu.zodFunction));try{let o=await this.client.chat.completions.create(n),s=null,i="",u=null;for await(let m of o){let g=m?.choices?.[0]?.delta;if(g){if(g.content&&(i+=g.content,yield{type:"content",content:g.content}),g.tool_calls&&g.tool_calls.length>0){let h=g.tool_calls[0];h.id?(s={id:h.id,name:h.function?.name||"",arguments:h.function?.arguments||""},yield{type:"tool_call_start",toolCall:{id:s.id,name:s.name,arguments:s.arguments}}):s&&h.function?.arguments&&(s.arguments+=h.function.arguments,yield{type:"tool_call_start",toolCall:{id:s.id,name:s.name,arguments:s.arguments}})}m.usage&&(u=m.usage)}}let c=u?tI(u):0;if(s){r.addMessage({role:"assistant",content:"",tool_calls:[{id:s.id,type:"function",function:{name:s.name,arguments:s.arguments}}]});let m=r.findTool(s.name);if(m)try{let g=JSON.parse(s.arguments),h=await m.handler(g);yield{type:"tool_call_result",toolResult:{id:s.id,result:h}},r.addMessage({role:"tool",tool_call_id:s.id,content:h}),yield*this.chatCompletionStream(r);return}catch(g){yield{type:"tool_call_result",toolResult:{id:s.id,result:`Error: ${g.message}`,error:g.message}},r.addMessage({role:"tool",tool_call_id:s.id,content:`Error: ${g.message}`}),yield*this.chatCompletionStream(r);return}else{let g=`Tool '${s.name}' not found`;yield{type:"tool_call_result",toolResult:{id:s.id,result:g,error:g}},r.addMessage({role:"tool",tool_call_id:s.id,content:g}),yield*this.chatCompletionStream(r);return}}i&&r.addMessage({role:"assistant",content:i}),yield{type:"done",messages:r.messages,tokensUsed:c}}catch(o){yield{type:"error",content:o.message}}}};var ee=require("@budibase/backend-core"),nI=require("@budibase/types");var yu=require("dd-trace");var ao=class extends Xe{static{a(this,"BudibaseAI")}async prompt(t){let r=await super.prompt(t);return r.tokensUsed&&await Sn(r.tokensUsed),r}async chat(t){let r=await super.chat(t);return r.tokensUsed&&await Sn(r.tokensUsed),r}async uploadFile(t,r,n){return ee.env.SELF_HOSTED?this.uploadFileSelfHost(t,r,n):this.uploadFileCloud(t,r,n)}async uploadFileCloud(t,r,n){return new Pe({apiKey:ee.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).uploadFile(t,r,n)}async uploadFileSelfHost(t,r,n){let o;if(Buffer.isBuffer(t))o=t;else{let g=[];for await(let h of t)g.push(new Uint8Array(h));o=Buffer.concat(g)}let s=o.toString("base64");if(n&&nI.ImageContentTypes.includes(n.toLowerCase()))return`data:image/jpeg;base64,${s}`;if(!ee.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let g=await dn();if(!g)throw new Error("No license key found");this._apiKey=g}let i=`${ee.env.BUDICLOUD_URL}/api/ai/upload-file`,u={method:"POST",headers:{"Content-Type":"application/json",[ee.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:s,filename:r,contentType:n})};console.debug("[BudibaseAI] uploadFileSelfHost - Making network call",{url:i,method:u.method,headers:u.headers,bodyKeys:["data","filename","contentType"],filename:r,contentType:n});let c=await fetch(i,u);if(console.debug("[BudibaseAI] uploadFileSelfHost - Network response",{url:i,status:c.status,statusText:c.statusText,ok:c.ok}),!c.ok)throw await ee.HTTPError.fromResponse(c);return(await c.json()).fileId}async chatCompletion(t){return ee.env.SELF_HOSTED?this.chatCompletionSelfHost(t):this.chatCompletionCloud(t)}async chatCompletionCloud(t){return await yu.tracer.trace("chatCompletionCloud",async()=>await new Pe({apiKey:ee.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletion(t))}async chatCompletionSelfHost(t){return await yu.tracer.trace("chatCompletionSelfHost",async r=>{if(!ee.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(r.addTags({budicloudUrl:ee.env.BUDICLOUD_URL}),!this._apiKey){let c=await dn();if(!c)throw new Error("No license key found");this._apiKey=c,r.addTags({licenseKey:this._apiKey})}let n={messages:t.messages,format:t.format,useTools:t.tools.length>0},o=`${ee.env.BUDICLOUD_URL}/api/ai/chat`,s={method:"POST",headers:{"Content-Type":"application/json",[ee.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(n)};console.debug("[BudibaseAI] chatCompletionSelfHost - Making network call",{url:o,method:s.method,headers:s.headers,bodyKeys:Object.keys(n),messagesCount:t.messages.length,useTools:n.useTools,format:n.format});let i=await fetch(o,s);if(console.debug("[BudibaseAI] chatCompletionSelfHost - Network response",{url:o,status:i.status,statusText:i.statusText,ok:i.ok}),!i.ok)throw await ee.HTTPError.fromResponse(i);let u=await i.json();return console.debug("[BudibaseAI] chatCompletionSelfHost - Response data",{url:o,tokensUsed:u.tokensUsed,messagesCount:u.messages?.length}),u})}async*chatCompletionStream(t){ee.env.SELF_HOSTED?yield*this.chatCompletionStreamSelfHost(t):yield*this.chatCompletionStreamCloud(t)}async*chatCompletionStreamCloud(t){yield*new Pe({apiKey:ee.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletionStream(t)}async*chatCompletionStreamSelfHost(t){console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Starting streaming (fallback to non-streaming)",{messagesCount:t.messages.length,toolsCount:t.tools.length});try{let r=await this.chatCompletionSelfHost(t);if(console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Yielding response chunks",{responseMessagesCount:r.messages.length,tokensUsed:r.tokensUsed}),r.messages.length>0){let n=r.messages[r.messages.length-1];n.content&&(yield{type:"content",content:n.content})}yield{type:"done",messages:r.messages,tokensUsed:r.tokensUsed}}catch(r){console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Error occurred",{error:r.message}),yield{type:"error",content:r.message}}}};var Oa=require("dd-trace");var Au=U(require("@anthropic-ai/sdk"));function IM(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}a(IM,"calculateBudibaseAICredits");var no=class extends Xe{constructor(r){super(r);this.client=new Au.default({apiKey:r.apiKey})}static{a(this,"Anthropic")}firstTextBlock(r){for(let n of r.content)if(n.type==="text")return n.text}async uploadFile(r,n,o){throw new Error("File upload not supported for this LLM provider")}async chatCompletion(r){try{let n=await this.client.messages.create({model:this.model,messages:r.messages.map(({content:s})=>{if(s==null)return{role:"user",content:""};if(typeof s=="string")return{role:"user",content:s};let i="";for(let u of s)u.type==="text"?i+=u.text:["image_url","input_audio","file"].includes(u.type);return{role:"user",content:i}}),max_tokens:this.maxTokens}),o=this.firstTextBlock(n)||"";return{messages:[...r.messages,{role:"assistant",content:o}],tokensUsed:IM(n.usage)}}catch(n){throw n instanceof Au.default.APIError&&console.error(`Anthropic Prompt failed with error ${n.name} and status: ${n.status}`),n}}async*chatCompletionStream(r){try{let n=await this.chatCompletion(r);if(n.messages.length>0){let o=n.messages[n.messages.length-1];o.content&&(yield{type:"content",content:o.content})}yield{type:"done",messages:n.messages,tokensUsed:n.tokensUsed}}catch(n){yield{type:"error",content:n.message}}}};var iI=require("zod"),uI=require("openai/helpers/zod");var oI=require("openai");var oo=class extends Pe{static{a(this,"AzureOpenAI")}getClient(t){if(!t.apiKey)throw new Error("No Azure OpenAI API key found");if(!t.model)throw new Error("No Azure OpenAI model specified");return new oI.AzureOpenAI({apiKey:t.apiKey,apiVersion:"2024-10-01-preview",baseURL:t.baseUrl})}};var cI="gpt-5-mini",SM={OpenAI:Pe,TogetherAI:Pe,AzureOpenAI:oo,Custom:Pe,Anthropic:no,BudibaseAI:ao};async function wM(){return await Oa.tracer.trace("getAIConfig",async e=>{let t={type:sI.ConfigType.AI,config:{}};if(!Ze.context.isSelfHostUsingCloud()){let n=await Ze.configs.getAIConfig();n&&(t=n)}await bs(t);let r=Object.values(t.config).find(n=>n.active&&n.isDefault);if(!r){e.addTags({enabled:!1,reason:"no provider found"});return}return e.addTags({enabled:!0}),{provider:r.provider,model:r.defaultModel||cI,apiKey:r.apiKey,baseUrl:r.baseUrl}})}a(wM,"getAIConfig");async function TM(){return Oa.tracer.trace("getSelfHostOpenAIKeyConfig",e=>{if(!Ze.env.SELF_HOSTED){e.addTags({enabled:!1,reason:"not self host"});return}if(!Ze.env.OPENAI_API_KEY){e.addTags({enabled:!1,reason:"no OPENAI_API_KEY"});return}return e.addTags({enabled:!0}),{provider:"OpenAI",model:cI,apiKey:Ze.env.OPENAI_API_KEY}})}a(TM,"getSelfHostOpenAIKeyConfig");async function bu(){return Oa.tracer.trace("getLLMConfig",async()=>await wM()||await TM())}a(bu,"getLLMConfig");async function La(e){return await Oa.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:n}=e||{},o=await bu();if(!o){t.addTags({enabled:!1,reason:"no config found"});return}r&&(o.model=r),n&&(o.maxTokens=n);let s=SM[o.provider];if(!s){t.addTags({enabled:!1,reason:"no provider found",provider:o.provider});return}return new s(o)})}a(La,"getLLM");async function pI(){let e=await La();if(!e)throw new Ze.HTTPError("No available LLM configurations",500);return e}a(pI,"getLLMOrThrow");var K=class e{constructor(){this.messages=[];this.tools=[]}static{a(this,"LLMRequest")}addTool(t){return this.tools.push(t),this}addTools(t){return this.tools.push(...t),this}findTool(t){return this.tools.find(r=>r.name===t)}withFormat(t){return t instanceof iI.z.ZodType?this.format=(0,uI.zodResponseFormat)(t,"key"):this.format=t,this}addMessage(t){return this.messages.push(t),this}addMessages(t){return this.messages.push(...t),this}addUserMessage(t){return this.messages.push({role:"user",content:t}),this}addSystemMessage(t){return this.messages.push({role:"system",content:t}),this}static fromRequest(t){let r=new e;return t.messages&&r.addMessages(t.messages),t.format&&r.withFormat(t.format),r}};var ut=require("zod");function eo(e,t){let r=`Summarize this text:
39
39
  ${e}`,n="";if(t)switch(t){case so.SummariseLength.SHORT:n="In 1-2 concise sentences, ";break;case so.SummariseLength.MEDIUM:n="In 2-3 paragraphs, ";break;case so.SummariseLength.LONG:n="In multiple detailed paragraphs, ";break}return new K().addUserMessage(`${n}${r}.
40
40
  Only return the summary.`)}a(eo,"summarizeText");function EM(e,t){let r=["You are a data extraction assistant.","Extract data from the attached document/image that matches the provided schema.","The schema defines the structure where values like 'string', 'number', 'boolean' indicate the expected data types.","Extract all items that match the schema from the document.","Return the data in json format","If no matching data is found, return an empty data array."].join(`
41
41
 
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "dist"
5
5
  ],
6
6
  "license": "UNLICENSED",
7
- "version": "3.19.0",
7
+ "version": "3.19.1",
8
8
  "description": "Budibase Pro (Backend)",
9
9
  "main": "dist/index.js",
10
10
  "types": "dist/index.d.ts",
@@ -70,5 +70,5 @@
70
70
  }
71
71
  }
72
72
  },
73
- "gitHead": "72863c719173848d3128cbef9556a0af09708c20"
73
+ "gitHead": "46f5ca09bb21f040008e247b6047d17dc91259be"
74
74
  }