@budibase/pro 3.27.3 → 3.27.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11,10 +11,10 @@ export declare class LiteLLMAI extends OpenAI {
11
11
  protected getClient(opts: LLMConfigOptions): OpenAIClient;
12
12
  }
13
13
  export declare const getLiteLLMProvider: (modelId: string) => string;
14
- export declare const getLiteLLMProviderOptions: () => {
14
+ export declare const getLiteLLMProviderOptions: (hasTools: boolean) => {
15
15
  openai: {
16
16
  parallelToolCalls: boolean;
17
17
  };
18
- };
18
+ } | undefined;
19
19
  export declare const createLiteLLMOpenAI: (config: LiteLLMOpenAIConfig) => import("@ai-sdk/openai").OpenAIProvider;
20
20
  export {};
package/dist/index.js CHANGED
@@ -35,7 +35,7 @@ d/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR
35
35
  mwIDAQAB
36
36
  -----END PUBLIC KEY-----
37
37
  `;function un(e){return Ko.default.verify(e,Pw,{algorithms:["RS256"]})}n(un,"verifyLicenseToken");function qw(e,t){return Ko.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}n(qw,"sign");var la={};_(la,{getOfflineFeatures:()=>Ho});var h=require("@budibase/types");var Uw={[h.PlanType.FREE]:[...Qe.SELF_FREE_LICENSE.features],[h.PlanType.PREMIUM]:[h.Feature.WORKSPACE_BACKUPS,h.Feature.BRANDING,h.Feature.APP_BUILDERS,h.Feature.VIEW_PERMISSIONS,h.Feature.PDF],[h.PlanType.PREMIUM_PLUS]:[h.Feature.WORKSPACE_BACKUPS,h.Feature.BRANDING,h.Feature.SYNC_AUTOMATIONS,h.Feature.APP_BUILDERS,h.Feature.VIEW_PERMISSIONS,h.Feature.TRIGGER_AUTOMATION_RUN,h.Feature.VIEW_READONLY_COLUMNS,h.Feature.AI_CUSTOM_CONFIGS,h.Feature.PDF,h.Feature.BUDIBASE_AI],[h.PlanType.PREMIUM_PLUS_TRIAL]:[h.Feature.WORKSPACE_BACKUPS,h.Feature.BRANDING,h.Feature.SYNC_AUTOMATIONS,h.Feature.APP_BUILDERS,h.Feature.VIEW_PERMISSIONS,h.Feature.TRIGGER_AUTOMATION_RUN,h.Feature.VIEW_READONLY_COLUMNS,h.Feature.AI_CUSTOM_CONFIGS,h.Feature.PDF,h.Feature.BUDIBASE_AI],[h.PlanType.PRO]:[h.Feature.USER_GROUPS,h.Feature.WORKSPACE_BACKUPS],[h.PlanType.TEAM]:[h.Feature.USER_GROUPS,h.Feature.WORKSPACE_BACKUPS],[h.PlanType.BUSINESS]:[h.Feature.USER_GROUPS,h.Feature.WORKSPACE_BACKUPS,h.Feature.ENVIRONMENT_VARIABLES,h.Feature.AUDIT_LOGS,h.Feature.BRANDING,h.Feature.SYNC_AUTOMATIONS,h.Feature.APP_BUILDERS,h.Feature.EXPANDED_PUBLIC_API,h.Feature.VIEW_PERMISSIONS,h.Feature.PDF,h.Feature.BUDIBASE_AI],[h.PlanType.ENTERPRISE_BASIC]:[h.Feature.USER_GROUPS,h.Feature.WORKSPACE_BACKUPS,h.Feature.ENVIRONMENT_VARIABLES,h.Feature.ENFORCEABLE_SSO,h.Feature.AUDIT_LOGS,h.Feature.BRANDING,h.Feature.SYNC_AUTOMATIONS,h.Feature.OFFLINE,h.Feature.APP_BUILDERS,h.Feature.EXPANDED_PUBLIC_API,h.Feature.VIEW_PERMISSIONS,h.Feature.TRIGGER_AUTOMATION_RUN,h.Feature.SCIM,h.Feature.VIEW_READONLY_COLUMNS,h.Feature.AI_CUSTOM_CONFIGS,h.Feature.PWA,h.Feature.CUSTOM_APP_SCRIPTS,h.Feature.PDF,h.Feature.BUDIBASE_AI,h.Feature.RECAPTCHA,h.Feature.PKCE_OIDC,h.Feature.TRANSLATIONS],[h.PlanType.ENTERPRISE_BASIC_TRIAL]:[h.Feature.USER_GROUPS,h.Feature.WORKSPACE_BACKUPS,h.Feature.ENVIRONMENT_VARIABLES,h.Feature.ENFORCEABLE_SSO,h.Feature.BRANDING,h.Feature.SYNC_AUTOMATIONS,h.Feature.APP_BUILDERS,h.Feature.EXPANDED_PUBLIC_API,h.Feature.VIEW_PERMISSIONS,h.Feature.TRIGGER_AUTOMATION_RUN,h.Feature.SCIM,h.Feature.VIEW_READONLY_COLUMNS,h.Feature.AI_CUSTOM_CONFIGS,h.Feature.PWA,h.Feature.CUSTOM_APP_SCRIPTS,h.Feature.PDF,h.Feature.BUDIBASE_AI,h.Feature.RECAPTCHA,h.Feature.PKCE_OIDC,h.Feature.TRANSLATIONS],[h.PlanType.ENTERPRISE]:[h.Feature.USER_GROUPS,h.Feature.WORKSPACE_BACKUPS,h.Feature.ENVIRONMENT_VARIABLES,h.Feature.ENFORCEABLE_SSO,h.Feature.AUDIT_LOGS,h.Feature.BRANDING,h.Feature.SYNC_AUTOMATIONS,h.Feature.OFFLINE,h.Feature.APP_BUILDERS,h.Feature.EXPANDED_PUBLIC_API,h.Feature.VIEW_PERMISSIONS,h.Feature.TRIGGER_AUTOMATION_RUN,h.Feature.SCIM,h.Feature.VIEW_READONLY_COLUMNS,h.Feature.AI_CUSTOM_CONFIGS,h.Feature.PWA,h.Feature.CUSTOM_APP_SCRIPTS,h.Feature.PDF,h.Feature.BUDIBASE_AI,h.Feature.RECAPTCHA,h.Feature.PKCE_OIDC,h.Feature.TRANSLATIONS]};function Ho(e){function t(r){let a=r[e];if(!a)throw new Error(`Features do not exist for planType=${e}`);return a}return n(t,"readFeatures"),t(Uw)}n(Ho,"getOfflineFeatures");var da={};_(da,{UNLIMITED:()=>f,getQuotas:()=>Yo});var X=require("@budibase/types");var l=bt,Nc=Qe,f=-1,pn=n(e=>e*1e6,"millions"),kw={[X.PlanType.FREE]:{...Nc.CLOUD_FREE_LICENSE.quotas},[X.PlanType.PREMIUM]:{usage:{monthly:{...l.queries(f),...l.automations(1e3),...l.budibaseAICredits(0),...l.actions(f)},static:{...l.rows(1e4),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(0),...l.plugins(f),...l.customAIConfigurations(0)}},constant:{...l.automationLogRetentionDays(7),...l.appBackupRetentionDays(7)}},[X.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...l.queries(f),...l.automations(5e3),...l.budibaseAICredits(pn(2)),...l.actions(f)},static:{...l.rows(25e3),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(0),...l.plugins(f),...l.customAIConfigurations(1)}},constant:{...l.automationLogRetentionDays(30),...l.appBackupRetentionDays(30)}},[X.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...l.queries(f),...l.automations(5e3),...l.budibaseAICredits(pn(2)),...l.actions(f)},static:{...l.rows(25e3),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(0),...l.plugins(f),...l.customAIConfigurations(1)}},constant:{...l.automationLogRetentionDays(30),...l.appBackupRetentionDays(30)}},[X.PlanType.PRO]:{usage:{monthly:{...l.queries(f),...l.automations(1e3),...l.budibaseAICredits(0),...l.actions(f)},static:{...l.rows(f),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(5),...l.plugins(f),...l.customAIConfigurations(0)}},constant:{...l.automationLogRetentionDays(7),...l.appBackupRetentionDays(7)}},[X.PlanType.TEAM]:{usage:{monthly:{...l.queries(f),...l.automations(5e3),...l.budibaseAICredits(0),...l.actions(f)},static:{...l.rows(f),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(10),...l.plugins(f),...l.customAIConfigurations(0)}},constant:{...l.automationLogRetentionDays(30),...l.appBackupRetentionDays(90)}},[X.PlanType.BUSINESS]:{usage:{monthly:{...l.queries(f),...l.automations(1e4),...l.budibaseAICredits(0),...l.actions(f)},static:{...l.rows(5e4),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(50),...l.plugins(f),...l.customAIConfigurations(0)}},constant:{...l.automationLogRetentionDays(365),...l.appBackupRetentionDays(365)}},[X.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...l.queries(f),...l.automations(f),...l.budibaseAICredits(pn(4)),...l.actions(f)},static:{...l.rows(f),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(f),...l.plugins(f),...l.customAIConfigurations(f)}},constant:{...l.automationLogRetentionDays(f),...l.appBackupRetentionDays(f)}},[X.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...l.queries(f),...l.automations(f),...l.budibaseAICredits(pn(4)),...l.actions(f)},static:{...l.rows(f),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(f),...l.plugins(f),...l.customAIConfigurations(f)}},constant:{...l.automationLogRetentionDays(15),...l.appBackupRetentionDays(15)}},[X.PlanType.ENTERPRISE]:{usage:{monthly:{...l.queries(f),...l.automations(f),...l.budibaseAICredits(pn(4)),...l.actions(f)},static:{...l.rows(f),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(f),...l.plugins(f),...l.customAIConfigurations(f)}},constant:{...l.automationLogRetentionDays(f),...l.appBackupRetentionDays(f)}}},Dw={[X.PlanType.FREE]:{...Nc.SELF_FREE_LICENSE.quotas},[X.PlanType.PREMIUM]:void 0,[X.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...l.queries(f),...l.automations(f),...l.budibaseAICredits(0),...l.actions(f)},static:{...l.rows(f),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(0),...l.plugins(f),...l.customAIConfigurations(1)}},constant:{...l.automationLogRetentionDays(30),...l.appBackupRetentionDays(30)}},[X.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...l.queries(f),...l.automations(f),...l.budibaseAICredits(0),...l.actions(f)},static:{...l.rows(f),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(0),...l.plugins(f),...l.customAIConfigurations(1)}},constant:{...l.automationLogRetentionDays(30),...l.appBackupRetentionDays(30)}},[X.PlanType.PRO]:{usage:{monthly:{...l.queries(f),...l.automations(f),...l.budibaseAICredits(0),...l.actions(f)},static:{...l.rows(f),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(5),...l.plugins(f),...l.customAIConfigurations(0)}},constant:{...l.automationLogRetentionDays(7),...l.appBackupRetentionDays(7)}},[X.PlanType.TEAM]:{usage:{monthly:{...l.queries(f),...l.automations(f),...l.budibaseAICredits(0),...l.actions(f)},static:{...l.rows(f),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(10),...l.plugins(f),...l.customAIConfigurations(0)}},constant:{...l.automationLogRetentionDays(30),...l.appBackupRetentionDays(90)}},[X.PlanType.BUSINESS]:{usage:{monthly:{...l.queries(f),...l.automations(f),...l.budibaseAICredits(0),...l.actions(f)},static:{...l.rows(f),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(50),...l.plugins(f),...l.customAIConfigurations(0)}},constant:{...l.automationLogRetentionDays(90),...l.appBackupRetentionDays(365)}},[X.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...l.queries(f),...l.automations(f),...l.budibaseAICredits(0),...l.actions(f)},static:{...l.rows(f),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(f),...l.plugins(f),...l.customAIConfigurations(f)}},constant:{...l.automationLogRetentionDays(f),...l.appBackupRetentionDays(f)}},[X.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...l.queries(f),...l.automations(f),...l.budibaseAICredits(0),...l.actions(f)},static:{...l.rows(f),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(f),...l.plugins(f),...l.customAIConfigurations(f)}},constant:{...l.automationLogRetentionDays(15),...l.appBackupRetentionDays(15)}},[X.PlanType.ENTERPRISE]:{usage:{monthly:{...l.queries(f),...l.automations(f),...l.budibaseAICredits(0),...l.actions(f)},static:{...l.rows(f),...l.apps(f),...l.users(f),...l.creators(f),...l.userGroups(f),...l.plugins(f),...l.customAIConfigurations(f)}},constant:{...l.automationLogRetentionDays(f),...l.appBackupRetentionDays(f)}}};function Yo(e,t){let r;function a(o){let s=o[t];if(!s)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return s}switch(n(a,"readQuotas"),e){case X.Hosting.SELF:r=a(Dw);break;case X.Hosting.CLOUD:r=a(kw);break}return JSON.parse(JSON.stringify(r))}n(Yo,"getQuotas");var cr={};_(cr,{encoding:()=>ur,workspaceExists:()=>Mw});var Gc=require("@budibase/backend-core");async function Mw(e){return(await Gc.db.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}n(Mw,"workspaceExists");var ur={};_(ur,{base64ToObject:()=>Nw,objectToBase64:()=>Bw});function Bw(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}n(Bw,"objectToBase64");function Nw(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}n(Nw,"base64ToObject");var Tf=require("@budibase/types"),Sr=require("@budibase/backend-core"),xf=G(rd()),Rf=G(Ss());async function m_(e){await je.save({offlineLicenseToken:e}),await Kt()}n(m_,"activateOfflineLicenseToken");async function g_(){await je.save({offlineLicenseToken:void 0}),await Kt()}n(g_,"deleteOfflineLicenseToken");async function Ef(){return(await je.get()).offlineLicenseToken}n(Ef,"getOfflineLicenseToken");async function vs(){let t=(await Sr.installation.getInstall()).installId,r=Sr.context.getTenantId(),a=await Sr.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:a}}n(vs,"getIdentifier");async function h_(){let e=await vs();return ur.objectToBase64(e)}n(h_,"getIdentifierBase64");function y_(e){return ur.base64ToObject(e)}n(y_,"getIdentifierFromBase64");function _f(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}n(_f,"verifyExpiry");async function Cf(e){let t=await vs();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}n(Cf,"verifyInstallation");function Of(e){let t=e.plan.type,r=Tf.Hosting.SELF,a=Ho(t),o=Yo(r,t);return e.features=(0,xf.default)(e.features,a),e.quotas=(0,Rf.default)(e.quotas,o),e}n(Of,"enrichLicense");async function Ts(){try{let e=await Ef();if(e){let t=await un(e);return _f(t),await Cf(t),Of(t)}}catch(e){console.error("Error retrieving offline license",e)}}n(Ts,"getOfflineLicense");var Cn={};_(Cn,{deleteDevLicense:()=>S_,getOfflineLicense:()=>I_,writeDevLicenseToDisk:()=>w_});var Lf=require("@budibase/backend-core"),Rs=require("path"),Pf=require("os"),Ht=G(require("fs"));var b_=Lf.env.isTest()?".budibase-test":".budibase",xs=(0,Rs.join)((0,Pf.tmpdir)(),b_),A_="dev_license.txt",_n=(0,Rs.join)(xs,A_);if(!Ht.default.existsSync(xs))try{Ht.default.mkdirSync(xs)}catch{}function I_(){try{if(Ht.default.existsSync(_n)){let e=Ht.default.readFileSync(_n,{encoding:"utf-8"});return un(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}n(I_,"getOfflineLicense");function w_(e){console.log(`Writing license to: ${_n}`),Ht.default.writeFileSync(_n,e,{encoding:"utf-8"})}n(w_,"writeDevLicenseToDisk");function S_(){Ht.default.rmSync(_n,{force:!0})}n(S_,"deleteDevLicense");var qf=require("dd-trace");var _s=n(async()=>await qf.tracer.trace("getLicense",async e=>{if(Es.env.OFFLINE_MODE)return e.addTags({offline:!0}),Ts();let t=await ir();return t||(e.addTags({offlineFallback:!0}),t=Cn.getOfflineLicense()),t}),"getLicense"),Cs=n(e=>jo(e),"getLicenseFromKey"),Os=n(()=>Es.env.SELF_HOSTED?Qe.SELF_FREE_LICENSE:Qe.CLOUD_FREE_LICENSE,"getFreeLicense");var Ps={};_(Ps,{activateLicenseKey:()=>v_,deleteLicenseKey:()=>T_,getLicenseKey:()=>_a});var Ls=G(require("dd-trace"));async function v_(e){await Qo(e),await je.save({licenseKey:e}),await Kt()}n(v_,"activateLicenseKey");async function _a(){return await Ls.default.trace("getLicenseKey",async e=>{let t=await je.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}n(_a,"getLicenseKey");async function T_(){return await Ls.default.trace("deleteLicenseKey",async()=>{await je.save({licenseKey:void 0}),await Kt()})}n(T_,"deleteLicenseKey");var Ca=require("@budibase/backend-core");var On,R_=n(async()=>{On=await Ca.RedisClient.init(Ca.redis.utils.Databases.LICENSES)},"init"),E_=n(async()=>{On&&await On.finish()},"shutdown");process.on("exit",async()=>{await E_()});var Oa=n(async()=>(On||await R_(),On),"getClient");var kf=require("@budibase/shared-core");var Us=Me.Duration.fromHours(1).toSeconds(),Df=Me.Duration.fromHours(1).toSeconds(),C_=Us+Df,Kt=n(async()=>{await Nf(),await Bf()},"refresh"),Uf=n(async e=>{let{result:t}=await Me.locks.doWithLock({type:Pa.LockType.DEFAULT,name:Pa.LockName.SYNC_ACCOUNT_LICENSE,resource:e,ttl:Me.Duration.fromSeconds(10).toMs()},async()=>{let r=await Oa(),a=await r.get(e);if(a&&!Mf(a))return a;let o=await La.default.trace("populateLicense",async()=>await _s());return o||(o=La.default.trace("populateFreeLicense",()=>Os())),o.refreshedAt=new Date().toISOString(),await r.store(e,o,C_),o});return t},"populateAndStoreLicense"),Mf=n(e=>{let t=e.refreshedAt?Date.parse(e.refreshedAt):0;return Date.now()-t>=Us*1e3},"shouldRefreshLicense"),qs=n(async()=>await La.default.trace("getCachedLicense",async e=>{let t=Me.context.getLicense();if(t)return e.addTags({foundInContext:!0,features:t.features,plan:t.plan,quotas:t.quotas}),t;let r=Me.tenancy.getTenantId(),o=await(await Oa()).get(r);return e.addTags({tenantId:r,foundInCache:!!o}),o?(e.addTags({foundInCache:!0,refreshedAt:o.refreshedAt,features:o.features,plan:o.plan,quotas:o.quotas}),Mf(o)&&Uf(r).catch(()=>{}),o):(o=await kf.helpers.retry(()=>Uf(r)),e.addTags({refreshedAt:o.refreshedAt,features:o.features,plan:o.plan,quotas:o.quotas,expirySeconds:Us,staleGraceSeconds:Df}),o)}),"_getCachedLicense");Me.env.isJest()&&(qs=jest.fn().mockImplementation(qs));var Bf=qs,Nf=n(async()=>{let e=Me.tenancy.getTenantId();await(await Oa()).delete(e)},"invalidate");async function he(e,t){Array.isArray(e)||(e=[e]),t||(t=await Ze.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}n(he,"areFeaturesEnabled");async function qa(e,t){if(!await he(e,t))throw new At.FeatureDisabledWarning(e)}n(qa,"checkFeature");async function ks(e,t){if(!await he(e,t)){let r=e.join(", ");throw new At.FeatureDisabledWarning(r)}}n(ks,"checkFeatures");function _e(e){return async(...t)=>(await qa(ge.Feature.WORKSPACE_BACKUPS),e(...t))}n(_e,"checkBackups");async function Ds(){return he(ge.Feature.WORKSPACE_BACKUPS)}n(Ds,"isBackupsEnabled");async function Ms(){return he(ge.Feature.BRANDING)}n(Ms,"isBrandingEnabled");async function Gf(){return he(ge.Feature.ENFORCEABLE_SSO)}n(Gf,"isEnforceableSSO");async function O_(){return he(ge.Feature.SYNC_AUTOMATIONS)}n(O_,"isSyncAutomationsEnabled");async function L_(){return he(ge.Feature.TRIGGER_AUTOMATION_RUN)}n(L_,"isTriggerAutomationRunEnabled");async function Bs(){return he(ge.Feature.APP_BUILDERS)}n(Bs,"isAppBuildersEnabled");async function Ua(){return he(ge.Feature.AUDIT_LOGS)}n(Ua,"isAuditLogsEnabled");async function Ns(){return he(ge.Feature.USER_GROUPS)}n(Ns,"isUserGroupsEnabled");function P_(){return he(ge.Feature.PWA)}n(P_,"isPWAEnabled");function q_(){return he(ge.Feature.RECAPTCHA)}n(q_,"isRecaptchaEnabled");var U_=n(()=>he(ge.Feature.PKCE_OIDC),"isPkceOidcEnabled");async function k_(){return he(ge.Feature.TRANSLATIONS)}n(k_,"isTranslationsEnabled");async function It(){return he(ge.Feature.EXPANDED_PUBLIC_API)}n(It,"isExpandedPublicApiEnabled");async function D_(e){if(At.env.ENABLE_SSO_MAINTENANCE_MODE||!await Gf())return!1;let r;return e?.config?r=e.config:r=await At.configs.getSettingsConfig(),!!r.isSSOEnforced}n(D_,"isSSOEnforced");var Gs=n(async()=>{let e=ge.Feature.SCIM,t=await he(e),r=await At.configs.getSCIMConfig();if(!t||!r?.enabled)throw new At.FeatureDisabledWarning(e);return!0},"checkSCIM");async function M_(){return he(ge.Feature.VIEW_PERMISSIONS)}n(M_,"isViewPermissionEnabled");async function B_(){return he(ge.Feature.VIEW_READONLY_COLUMNS)}n(B_,"isViewReadonlyColumnsEnabled");var N_={faviconUrl:void 0,faviconUrlEtag:void 0,emailBrandingEnabled:!0,platformTitle:void 0,loginHeading:void 0,loginButton:void 0,metaDescription:void 0,metaImageUrl:void 0,metaTitle:void 0};async function G_(e){return await Ms()?{faviconUrl:e.faviconUrl,faviconUrlEtag:e.faviconUrlEtag,emailBrandingEnabled:e.emailBrandingEnabled,platformTitle:e.platformTitle,loginHeading:e.loginHeading,loginButton:e.loginButton,metaDescription:e.metaDescription,metaImageUrl:e.metaImageUrl,metaTitle:e.metaTitle}:N_}n(G_,"getBrandingConfig");var Ws={};_(Ws,{enrichAIConfig:()=>Fs});var Ff=require("@budibase/backend-core");var F_="budibase_ai";async function Fs(e){if(Ff.env.SELF_HOSTED)return e;for(let t of Object.values(e.config))if(t.provider==="BudibaseAI")return e;return e.config[F_]={provider:"BudibaseAI",active:!0,isDefault:Object.keys(e.config).every(t=>!e.config[t].isDefault),defaultModel:process.env.BUDIBASE_AI_DEFAULT_MODEL||"gpt-5-mini",name:"Budibase AI"},e}n(Fs,"enrichAIConfig");var ft={};_(ft,{addAction:()=>K_,addApp:()=>H_,addAutomation:()=>Z_,addGroup:()=>Qs,addPlugin:()=>Hs,addRow:()=>V_,addRows:()=>J_,addUsers:()=>Ba,bustCache:()=>ko,decrement:()=>wt,decrementMany:()=>Ln,getCurrentUsageValues:()=>fc,getLicensedQuota:()=>$f,getQuotaUsage:()=>Ft,increment:()=>Be,incrementBudibaseAICredits:()=>Ga,incrementMany:()=>Vt,removeApp:()=>Y_,removeGroup:()=>Ks,removePlugin:()=>Ys,removeRow:()=>z_,removeRows:()=>X_,removeUsers:()=>Rr,set:()=>$s,setAllUsage:()=>Mo,setAppUsageValue:()=>Do,setUsage:()=>pc,setUsagePerApp:()=>lc,updatePluginCount:()=>Vs,updateUsage:()=>vr,usageLimitIsExceeded:()=>Q_,utils:()=>Gr});var Da=require("@budibase/types");var rt=require("@budibase/backend-core"),de=require("@budibase/types"),Yt=require("dd-trace");var Be=n(async(e,t,r)=>await Yt.tracer.trace("quotas.increment",async a=>(a.addTags({name:e,type:t}),await Wf({change:1,name:e,type:t,opts:r}))),"increment"),Vt=n(e=>Yt.tracer.trace("quotas.incrementMany",async()=>Wf(e)),"incrementMany"),Wf=n(async e=>await Yt.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await vr(r.map(o=>({usageChange:o.change,name:o.name,type:o.type,opts:{dryRun:!0,suppressErrorLog:o.opts?.suppressErrorLog,id:o.opts?.id}})));let a=[];for(let o of r)await Yt.tracer.trace("quotas.incrementMany.fn",async s=>{s.addTags({actionName:o.name,actionType:o.type,actionChange:o.change});let i=o.opts?.fn;i&&a.push(await i())});return await vr(r.map(o=>({usageChange:o.change,name:o.name,type:o.type,opts:{dryRun:!1,valueFn:o.opts?.valueFn,suppressErrorLog:o.opts?.suppressErrorLog,id:o.opts?.id}}))),a[0]}),"tryIncrement"),wt=n((e,t,r={})=>vr({usageChange:-1,name:e,type:t,opts:r}),"decrement"),Ln=n(e=>{let t=Array.isArray(e)?e:[e];return vr(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),$s=n(async(e,t,r)=>Je.setUsage(r,e,t),"set"),W_=n((e,t,r)=>{if(e==de.QuotaUsageType.STATIC){let a=r.usageQuota.triggers;return a?a[t]||{}:{}}else{let a=Je.utils.getCurrentMonthString(),o=r.monthly[a].triggers;return o?o[t]||{}:{}}},"getExistingTriggers"),$_=n(async(e,t,r,a)=>{try{await rt.locks.doWithLock({type:de.LockType.TRY_ONCE,name:de.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let o={percentage:r,name:t.name};a&&(o.resetDate=a),await Lt.triggerQuota(o)})}catch(o){rt.logging.logAlert("Error triggering quota",o)}},"triggerQuota"),j_=n(async(e,t,r,a)=>{let o=await Ft(),s=e===de.QuotaUsageType.MONTHLY?o.quotaReset:void 0,i=await W_(e,t,o),u=a.triggers,c=r/a.value*100;c>100&&(c=100);for(let[d,m]of u.entries())if(c>=m&&a.value!==bt.UNLIMITED){if(!i[m]){i[m]=new Date().toISOString();let g=u[d+1]||100;(!(c>=g)||c===m)&&await $_(t,a,c,s)}}else i[m]=void 0;return i},"checkTriggers"),vr=n(async e=>{await Yt.tracer.trace("quotas.updateUsage",async t=>{let r=rt.tenancy.getTenantId(),a=Array.isArray(e)?e:[e];t.addTags({numActions:a.length,tenantId:r});let o,s,i=[],u={},c={},d={},m={};for(let g of a)await Yt.tracer.trace("quotas.updateUsage.action",async T=>{T.addTags({actionName:g.name,actionType:g.type,actionUsageChange:g.usageChange});try{o=rt.context.getWorkspaceId()}catch{}if(de.APP_QUOTA_NAMES.includes(g.name)&&!o)throw new Error("App context required for quota update");try{s=await $f(de.QuotaType.USAGE,g.name,g.type),i.push(s);let{total:D,app:k,breakdown:C}=await Je.getCurrentUsageValues(g.type,g.name,g.opts?.id);D+=g.usageChange,k!=null&&(k+=g.usageChange),C!=null&&(C+=g.usageChange);let W={};if(g.opts?.dryRun||(W=await j_(g.type,g.name,D,s),m={...m,[g.name]:W}),s.value!==bt.UNLIMITED&&D>s.value&&g.usageChange>0)throw new rt.UsageLimitWarning(`${g.name}`);if(D=Math.max(0,D),k&&(k=Math.max(0,k)),C&&(C=Math.max(0,C),d={...d,[g.name]:C}),!g.opts?.dryRun){let Ae=g.opts?.valueFn;Ae&&(D=await Ae(),k=D),u={...u,[g.name]:D},c={...c,[g.name]:k}}}catch(D){throw g.opts?.suppressErrorLog||console.error(`Error updating usage quotas for ${g.name}`,D),D}});let y=a.filter(g=>!g.opts?.dryRun).map(g=>({name:g.name,type:g.type,values:{total:u[g.name],app:c[g.name],breakdown:d[g.name],triggers:m[g.name]},opts:{...g.opts,tenantId:r}}));y.length>0&&await Je.setAllUsage(y)})},"updateUsage"),$f=n(async(e,t,r)=>{let a=await Ze.getCachedLicense();if(!a){let o=rt.tenancy.getTenantId();throw new Error("License not found for tenant id "+o)}if(r&&(0,de.isStaticQuota)(e,r,t))return a.quotas[e][r][t];if(r&&(0,de.isMonthlyQuota)(e,r,t))return a.quotas[e][r][t];if((0,de.isConstantQuota)(e,t))return a.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),Q_=n(async({name:e,type:t,usageChange:r})=>{try{return await vr({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(a){if(a.code===de.APIWarningCode.USAGE_LIMIT_EXCEEDED)return!0;throw a}},"usageLimitIsExceeded");var K_=n(async e=>Be(Da.MonthlyQuotaName.ACTIONS,Da.QuotaUsageType.MONTHLY,{fn:e}),"addAction");var jf=require("@budibase/backend-core"),Tr=require("@budibase/types");var Qf=n(async()=>{let e=await jf.db.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),H_=n(async(e,{appId:t}={})=>Be(Tr.StaticQuotaName.WORKSPACES,Tr.QuotaUsageType.STATIC,{fn:e,valueFn:Qf,id:t}),"addApp"),Y_=n(async({appId:e}={})=>wt(Tr.StaticQuotaName.WORKSPACES,Tr.QuotaUsageType.STATIC,{valueFn:Qf,id:e}),"removeApp");var lt=require("@budibase/types");var V_=n(async(e,{tableId:t}={})=>Be(lt.StaticQuotaName.ROWS,lt.QuotaUsageType.STATIC,{fn:e,id:t}),"addRow"),z_=n(async({tableId:e}={})=>wt(lt.StaticQuotaName.ROWS,lt.QuotaUsageType.STATIC,{id:e}),"removeRow"),J_=n(async(e,t,{tableId:r}={})=>Vt({change:e,name:lt.StaticQuotaName.ROWS,type:lt.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),"addRows"),X_=n(async(e,{tableId:t}={})=>Ln({change:e,name:lt.StaticQuotaName.ROWS,type:lt.QuotaUsageType.STATIC,opts:{id:t}}),"removeRows");var Ma=require("@budibase/types");var Z_=n(async(e,{automationId:t}={})=>Be(Ma.MonthlyQuotaName.AUTOMATIONS,Ma.QuotaUsageType.MONTHLY,{fn:e,id:t}),"addAutomation");var xr=require("@budibase/types");var Qs=n(async e=>Be(xr.StaticQuotaName.USER_GROUPS,xr.QuotaUsageType.STATIC,{fn:e}),"addGroup"),Ks=n(async()=>wt(xr.StaticQuotaName.USER_GROUPS,xr.QuotaUsageType.STATIC),"removeGroup");var kt=require("@budibase/types");var Hs=n(async e=>Be(kt.StaticQuotaName.PLUGINS,kt.QuotaUsageType.STATIC,{fn:e}),"addPlugin"),Ys=n(async()=>wt(kt.StaticQuotaName.PLUGINS,kt.QuotaUsageType.STATIC),"removePlugin"),Vs=n(async e=>$s(kt.StaticQuotaName.PLUGINS,kt.QuotaUsageType.STATIC,e),"updatePluginCount");var dt=require("@budibase/types"),Pn=require("@budibase/backend-core");var Ba=n(async(e,t,r)=>{let a=[{change:e,name:dt.StaticQuotaName.USERS,type:dt.QuotaUsageType.STATIC,opts:{fn:r,valueFn:Pn.users.getUserCount}}];t>0&&a.push({change:t,name:dt.StaticQuotaName.CREATORS,type:dt.QuotaUsageType.STATIC,opts:{valueFn:Pn.users.getCreatorCount}});let o=await Vt(a);return await ir(),o},"addUsers"),Rr=n(async(e,t)=>{let r=[{change:e,name:dt.StaticQuotaName.USERS,type:dt.QuotaUsageType.STATIC,opts:{valueFn:Pn.users.getUserCount}}];t>0&&r.push({change:t,name:dt.StaticQuotaName.CREATORS,type:dt.QuotaUsageType.STATIC,opts:{valueFn:Pn.users.getCreatorCount}}),await Ln(r),await ir()},"removeUsers");var Na=require("@budibase/types");var Ga=n(async e=>Vt({change:e,name:Na.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:Na.QuotaUsageType.MONTHLY}),"incrementBudibaseAICredits");var ja={};_(ja,{db:()=>Ne});var ei=require("@budibase/backend-core");var re={};_(re,{addUsers:()=>$a,adjustGroupCreatorsQuotas:()=>nC,cleanupApp:()=>rC,enrichUserRolesFromGroups:()=>tC,fetch:()=>qn,get:()=>Er,getBulk:()=>Jf,getGroupBuilderAppIds:()=>zf,getGroupRoleId:()=>eC,remove:()=>Js,removeUsers:()=>Xs,save:()=>Wa,updateGroupApps:()=>Zs});var M=require("@budibase/backend-core");var Kf=require("@budibase/backend-core");var Fa=class extends Kf.HTTPError{static{n(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}};async function zs(e,t){try{let r=[];for(let u of e)if(u.roles){let c=u.roles[M.db.getProdWorkspaceID(t)];c&&r.push(c)}let a=await Promise.all(r.map(async u=>({[u]:await M.roles.roleToNumber(u)}))),o,s,i={};a.forEach(u=>{let[c,d]=Object.entries(u)[0];i[c]={roleId:c,roleNum:d}});for(let{roleId:u,roleNum:c}of Object.values(i))(s===void 0||c>s)&&(s=c,o=u);return o}catch(r){throw M.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}n(zs,"findHighestRole");async function Vf(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await z.getBulk(e,{enriched:!1}),t}n(Vf,"groupList");async function zf(e,t){if(!e.userGroups)return[];let r=await Vf(e.userGroups,t?.groups),a=t?.appId?M.db.getProdWorkspaceID(t?.appId):null,o=[];for(let s of r){let i=s.builder?.apps;a&&i?.includes(a)?o.push(a):a||(o=o.concat(i||[]))}return[...new Set(o)]}n(zf,"getGroupBuilderAppIds");async function eC(e,t,r){if(!e.userGroups)return null;let a=await Vf(e.userGroups,r?.groups),o=M.db.getProdWorkspaceID(t);return e.roles?.[o]?e.roles[o]:(a=a.filter(u=>u?.roles?Object.keys(u.roles).includes(o):!1),M.context.getCurrentContext()?.appId===t?zs(a,t):await M.context.doInWorkspaceContext(t,async()=>zs(a,t)))}n(eC,"getGroupRoleId");async function tC(e){if(!e||!e.userGroups)return e;let t=await Jf(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 M.context.doInWorkspaceContext(o,async()=>{if(e.roles[o])return;let s=await zs(t,o);s&&(e.roles[o]=s)});let a=await zf(e,{groups:t});if(a.length&&!e.builder?.global){let o=e.builder?.apps||[];e.builder={...e.builder,apps:o.concat(a)}}return e}n(tC,"enrichUserRolesFromGroups");async function qn(){return await z.fetch()}n(qn,"fetch");async function Er(e){return await z.get(e)}n(Er,"get");async function Jf(e,t={enriched:!0}){return z.getBulk(e,t)}n(Jf,"getBulk");async function Hf(e){if(await z.getByName(e))throw new Fa(e)}n(Hf,"guardNameAvailability");async function Yf(e){let t=await z.getGroupUsers(e._id);if(!t.length)return 0;let a=await M.tenancy.getGlobalDB().getMultiple(t.map(s=>s._id));return(await M.userUtils.creatorsInList(a)).filter(s=>s).length}n(Yf,"getCreatorsCountInGroup");async function Wa(e){let t=[],r=!e._id,a=0;if(!e._id)e._id=z.generateUserGroupID(),await Hf(e.name),t.push(M.events.group.created(e));else{let u=await z.get(e._id);if(u.name!==e.name&&await Hf(e.name),t.push(M.events.group.updated(e)),JSON.stringify(u.roles)!==JSON.stringify(e.roles)){let c=u.users?.length||0,d=0;c>0&&(d=await Yf(u)),Object.values(e.roles).includes("CREATOR")?a=c-d:a=-c,t.push(M.events.group.permissionsEdited(e))}}await Promise.all(t);let{users:o,...s}=e,i=n(()=>z.save(s),"saveGroup");if(r)return await Qs(i);{let u=await i();if(a>0)await Ba(0,a);else if(a<0){let c=await Yf(e),d=Math.abs(a)-c;d>0&&await Rr(0,d)}return u}}n(Wa,"save");async function Js(e,t){let r;try{r=await z.get(e)}catch{throw new Error("Group not found")}let a=Object.values(r.roles||{}).includes("CREATOR"),o=n(()=>{},"recalculateCreatorsQuotasFn");if(a){let i=M.tenancy.getGlobalDB(),u=await z.getGroupUsers(e),d=(await Promise.all(u.map(T=>i.get(T._id)))).map(T=>({...T,userGroups:T.userGroups.filter(B=>B!==e)})),y=(await M.userUtils.creatorsInList(d)).filter(T=>T).length,g=u.length-y;g&&(o=n(()=>Rr(0,g),"recalculateCreatorsQuotasFn"))}let s=await z.destroy(e,t);return await M.events.group.deleted(r),await Ks(),await o(),s}n(Js,"remove");async function $a(e,t){let r=await z.get(e),a=await M.users.bulkGetGlobalUsersById(t),o=[];for(let c of a)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 M.users.bulkUpdateGlobalUsers(s),Object.values(r.roles||{}).includes("CREATOR")){let d=(await M.userUtils.creatorsInList(o)).filter(y=>y).length,m=o.length-d;m&&await Ba(0,m)}let u=[];for(let c of t)u.push(M.cache.user.invalidateUser(c));return await Promise.all(u),await M.events.group.usersAdded(s.length,r,t),s}n($a,"addUsers");async function Xs(e,t){let r=await z.get(e),a=await M.users.bulkGetGlobalUsersById(t),o=[];for(let u of a){if(!u.userGroups||!u.userGroups.includes(e))continue;let c=u.userGroups.indexOf(e);u.userGroups.splice(c,1),o.push(u)}if(await M.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes("CREATOR")){let c=(await M.userUtils.creatorsInList(o)).filter(m=>m).length,d=o.length-c;d&&await Rr(0,d)}let i=[];for(let u of t)i.push(M.cache.user.invalidateUser(u));return await Promise.all(i),o.length&&await M.events.group.usersDeleted(o.length,r,t),o}n(Xs,"removeUsers");async function Zs(e,t){let r=await Er(e);if(r.roles||(r.roles={}),t.appsToAdd)for(let a of t.appsToAdd)r.roles[a.appId]=a.roleId;if(t.appsToRemove)for(let a of t.appsToRemove)delete r.roles[a.appId];if(r.builder={apps:Object.entries(r.roles).filter(([a,o])=>o==="CREATOR").map(([a])=>a)},r.builder.apps.length&&!Bs())throw new M.HTTPError("Feature not enabled, please check license",400);return await Wa(r)}n(Zs,"updateGroupApps");async function rC(e){let t=await qn(),r=[];for(let a of t)!a.roles||!a.roles[e]||(delete a.roles[e],r.push(a));return await z.bulkSave(r)}n(rC,"cleanupApp");async function nC(){if(!await Ns()){let e=M.tenancy.getGlobalDB(),r=(await qn()||[]).filter(a=>Object.values(a?.roles||{}).includes("CREATOR"));for(let a of r){let o=await z.getGroupUsers(a._id),i=(await Promise.all(o.map(m=>e.get(m._id)))).map(m=>({...m,userGroups:m.userGroups.filter(y=>y!==a._id)})),c=(await M.userUtils.creatorsInList(i)).filter(m=>m).length,d=o.length-c;await z.save({...a,roles:{}}),d&&await Rr(0,d)}}}n(nC,"adjustGroupCreatorsQuotas");ei.users.UserDB.init(ft,re,tt);var Ne=ei.users.UserDB;var Ya={};_(Ya,{logs:()=>ii});var ii={};_(ii,{logSearch:()=>dC,oldestLogDate:()=>am,storeLog:()=>fC});var Ha=require("@budibase/backend-core"),nm=require("@budibase/types");var ye=require("@budibase/backend-core"),Ka=require("@budibase/types");var Xf=require("@budibase/backend-core");async function Zf(e,t){let r,a=5,o=!1,s,i=!0;for(;a>0;a--)try{i?s=await e():s=await exports.randomDelay(e),o=!0;break}catch(u){r=u}return o||Xf.logging.logWarn(`Failed to backoff: ${t}`,r),s}n(Zf,"backOff");var{SEPARATOR:St,UNICODE_MAX:aC,DocumentType:em,AutomationViewMode:ti,ViewName:oC,getQueryIndex:sC}=ye.db,iC=new Date(0).toISOString(),uC=100,Qa=10,ri=n(async()=>ia(Ka.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS),"oldestLogDate");function tm(e,t,{status:r,automationId:a}={},o={}){let s=a?`${a}${St}`:"",i=r?`${r}${St}`:"",u;return r&&a?u=`${ti.ALL}${St}${i}${s}`:r?u=`${ti.STATUS}${St}${i}`:a?u=`${ti.AUTOMATION}${St}${s}`:u=`${em.AUTOMATION_LOG}${St}`,{...o,descending:!0,startkey:`${u}${t}${aC}`,endkey:`${u}${e}`}}n(tm,"getAutomationLogParams");function cC(e,t,r){return`${em.AUTOMATION_LOG}${St}${e}${St}${r}${St}${t}`}n(cC,"generateAutomationLogID");async function ni(e,t,r={docs:!0}){let a=ye.context.getProdWorkspaceDB();await a.exists()||(a=ye.context.getDevWorkspaceDB());let o={status:r.status},s=r?.limit?r.limit:r?.paginate?Qa+1:void 0,i=tm(e,t,o,{include_docs:r.docs,limit:s});r?.page&&(i.startkey=r.page);let u=await a.allDocs(i),c=on(u,{paginate:r?.paginate,pageSize:Qa});return{...c,totalLogs:c.totalRows}}n(ni,"getAllLogs");async function ai(e,t,r={}){let a=ye.context.getProdWorkspaceDB();await a.exists()||(a=ye.context.getDevWorkspaceDB());let o;try{let i={automationId:r?.automationId,status:r?.status},u=tm(e,t,i,{include_docs:!0,limit:Qa+1});r?.page&&(u.startkey=r.page),o=await a.query(sC(oC.AUTOMATION_LOGS),u)}catch(i){if(i!=null&&(i.name==="not_found"||i.error==="not_found"))return await _c(),ai(e,t,r);throw i}let s=on(o,{paginate:!0,pageSize:Qa});return{...s,totalLogs:s.totalRows/3}}n(ai,"getLogsByView");async function rm(e,t){let r=ye.context.getProdWorkspaceDB(),a=e._id,o=e.name,s=new Date().toISOString(),i=cC(s,t.status,a),u={...t,automationId:a,status:t.status,automationName:o,createdAt:s,_id:i};return await r.put(u),i}n(rm,"writeLog");async function oi(e,{clearing:t}={clearing:!1}){let r=ye.context.getProdWorkspaceDB();await Zf(async()=>{let a=await r.get(ye.db.DocumentType.WORKSPACE_METADATA);for(let o of e){let s=o.split(ye.db.SEPARATOR),i=`${s[s.length-3]}${ye.db.SEPARATOR}${s[s.length-2]}`,u={};a.automationErrors&&(u=a.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],a.automationErrors=u}await r.put(a),await ye.cache.workspace.invalidateWorkspaceMetadata(a.appId,a)},"Failed to update app metadata with automation log error")}n(oi,"updateAppMetadataWithErrors");async function pC(){let e=await ri();try{return await ni(iC,e,{docs:!1,paginate:!1,limit:uC})}catch{return{data:[],hasNextPage:!1,totalLogs:0}}}n(pC,"getExpiredLogs");async function si(){let e=ye.context.getProdWorkspaceDB();try{let t=await pC();if(!t.data||t.data.length===0)return;let r=t.data.map(o=>({_id:o.id,_rev:o.value.rev,_deleted:!0})),a=t.data.filter(o=>{let s=o.id.split(ye.db.SEPARATOR);return s[s.length-1]===Ka.AutomationStatus.ERROR}).map(o=>o.id);await e.bulkDocs(r),a.length&&await oi(a,{clearing:!0})}catch(t){ye.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}n(si,"clearOldHistory");var am=ri;async function lC(e,t,r,a){let o,s=new Date().toISOString(),i=await am();return(!e||e<i)&&(e=i),r||t?o=await ai(e,s,{automationId:r,status:t,page:a}):o=await ni(e,s,{status:t,page:a,docs:!0,paginate:!0}),o}n(lC,"getLogs");async function dC(e){return await si(),await lC(e.startDate,e.status,e.automationId,e.page)}n(dC,"logSearch");async function fC(e,t){if(!Ha.db.isProdWorkspaceID(Ha.context.getWorkspaceId()))return;let r=await rm(e,t);t.status===nm.AutomationStatus.ERROR&&await oi([r]),await si()}n(fC,"storeLog");var Va={};_(Va,{checkPluginQuotas:()=>hC,deletePlugin:()=>gC,storePlugin:()=>mC});var um=require("@budibase/types"),fe=require("@budibase/backend-core");var om=G(require("fs")),sm=require("path");function im(e,t){return om.default.readFileSync((0,sm.join)(e,t),"utf8")}n(im,"loadJSFile");async function mC(metadata,directory,source,origin){let db=fe.tenancy.getGlobalDB(),version=metadata.package.version,name=metadata.package.name,description=metadata.package.description,hash=metadata.schema.hash,bucketPath=fe.objectStore.getPluginS3Dir(name),files=await fe.objectStore.uploadDirectory(fe.objectStore.ObjectStoreBuckets.PLUGINS,directory,bucketPath),jsFile=files.find(e=>e.name.endsWith(".js")),iconFile=files.find(e=>e.name.endsWith(".svg"));if(!jsFile)throw new Error("Plugin missing .js file.");if(metadata.schema.type===um.PluginType.DATASOURCE){let js=im(directory,jsFile.name);try{eval(js)}catch(e){let t=e?.message?e.message:JSON.stringify(e);throw new Error(`JS invalid: ${t}`)}}let iconFileName=iconFile?iconFile.name:null,pluginId=fe.db.generatePluginID(name),rev;try{rev=(await db.get(pluginId))._rev}catch(e){rev=void 0}let doc={_id:pluginId,_rev:rev,...metadata,name,version,hash,description,source};iconFileName&&(doc.iconFileName=iconFileName),source&&(doc={...doc,source}),origin&&origin.source==="github"&&(doc.origin=origin);let write=n(async()=>{let e=await db.put(doc);return await fe.events.plugin.imported(doc),{...doc,_rev:e.rev}},"write");return rev?await write():await Hs(write)}n(mC,"storePlugin");async function gC(e){let t=fe.tenancy.getGlobalDB();try{let r=await t.get(e),a=fe.objectStore.getPluginS3Dir(r.name);await fe.objectStore.deleteFolder(fe.objectStore.ObjectStoreBuckets.PLUGINS,a),await t.remove(e,r._rev),await fe.events.plugin.deleted(r),await Ys()}catch(r){let a=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${a}`)}}n(gC,"deletePlugin");async function hC(){let e=fe.tenancy.getGlobalDB();try{let r=(await e.allDocs(fe.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await Vs(r)}catch(t){fe.logging.logAlert("Unable to retrieve plugins for quota check",t)}}n(hC,"checkPluginQuotas");var mt={};_(mt,{fetch:()=>bC,fetchValues:()=>AC,isEncryptionKeyAvailable:()=>yC,isValid:()=>lm,remove:()=>wC,update:()=>IC});var cm=require("@budibase/backend-core"),Un=require("@budibase/types");function yC(){return!!cm.env.ENCRYPTION_KEY}n(yC,"isEncryptionKeyAvailable");async function bC(){let e=await jt.get();return Object.keys(e.variables)}n(bC,"fetch");async function AC(e){let r=(await jt.get()).variables,a={};for(let[o,s]of Object.entries(r))switch(e){case Un.Environment.DEVELOPMENT:a[o]=s.development;break;case Un.Environment.PRODUCTION:default:a[o]=s.production;break}return a}n(AC,"fetchValues");async function pm(e){if(!(await ct.cache.getCachedLicense()).features.includes(Un.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await jt.get();r.variables=e(r.variables),await jt.update(r)}n(pm,"changeValues");async function IC(e,t){if(lm(e))await pm(a=>(a[e]=t,a));else throw new Error("Variable name has characters that are not allowed")}n(IC,"update");async function wC(e){await pm(t=>(delete t[e],t))}n(wC,"remove");function lm(e){return/^[a-zA-Z0-9-_]+$/.test(e)}n(lm,"isValid");var Dt={};_(Dt,{definitions:()=>PC,download:()=>LC,fetch:()=>OC,write:()=>_C});var Pe=require("@budibase/backend-core"),Ja=require("@budibase/types");var ue=require("@budibase/backend-core"),nt=require("@budibase/types");var dm=require("memorystream"),fm=new ue.sql.Sql(nt.SqlClient.SQL_LITE);async function SC(e,t,r){let a={operation:nt.Operation.READ,table:ar.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:nt.SortOrder.DESCENDING,type:nt.SortType.STRING}}},o=fm._query(a);if(Array.isArray(o))throw new Error("Cannot execute multiple queries for audit log search");return{sql:o.sql,bindings:o.bindings}}n(SC,"getAuditLogSqlQuery");function vC(e){return`${ue.DocumentType.AUDIT_LOG}${ue.SEPARATOR}${e}${ue.SEPARATOR}${ue.utils.newid()}`}n(vC,"generateAuditLogID");async function mm(e){e._id||(e._id=vC(e.timestamp)),e.type||(e.type=nt.AUDIT_LOG_TYPE);try{let r=await ue.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){ue.logging.logAlert("Failed to write audit log",t)}}n(mm,"save");async function ui(e,t,r){t||(t=1);let a=ue.context.getAuditLogsDB();try{let o=9+1,s=await SC(e,t,o),i=ar.searchTable(),u=fm.convertJsonStringColumns(i,await a.sql(s.sql,s.bindings)),c;u.length>o&&(c=u.pop());let d={rows:u,hasNextPage:!!c};return d.hasNextPage&&(d.bookmark=t+1),d}catch(o){if(o.status===404&&!r?.isRetry)return await TC(),await mc(),await ui(e,t,{isRetry:!0});throw o}}n(ui,"searchSQL");async function TC(){let e=ue.context.getAuditLogsDB(),r=(await e.allDocs(ue.db.getDocParams(ue.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(a=>a.doc).filter(a=>a&&!a.type).map(a=>({...a,type:nt.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}n(TC,"migrate");function gm(e){let t=ue.context.getAuditLogsDB(),r=new dm,a=t.dump(r,{filter:s=>{let i=s;if(!i._id?.startsWith(ue.DocumentType.AUDIT_LOG))return!1;let u=!0,c=n((d,m)=>{!d||d.length===0||(u=!!(u&&m&&d.includes(m)))},"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 d=JSON.stringify(s);u=u&&d.includes(e.fullSearch)}return u}}),o=new dm;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:a,stream:o}}n(gm,"dump");var kn=require("@budibase/backend-core"),Dn=require("@budibase/string-templates"),za=require("@budibase/types");var RC=kn.constants.MIN_VALID_DATE.toISOString(),EC=kn.constants.MAX_VALID_DATE.toISOString();function ci(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||RC,e.endDate=e.endDate||EC),e}n(ci,"fillDates");async function hm(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(a=>kn.db.getProdWorkspaceID(a)));let t={};function r(a,o){o?.length&&(t.oneOf={...t.oneOf,[a]:o})}return n(r,"addStringParams"),r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=ci(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}n(hm,"getSearchFilters");function pi(e,t,r){let a={_id:e,status:za.AuditLogResourceStatus.DELETED};switch(t){case"app":a.name=r?.appName;break;case"user":a.email=r?.email;break}return a}n(pi,"deleted");function li(e){let t=(0,Dn.findHBSBlocks)(e);for(let r of t){let a=` "${r}"`;e=e.replace(e.includes(a)?a:` ${r}`,""),e=(0,Dn.processStringSync)(e,{})}return e}n(li,"removeTemplateStrings");function ym(e,t){let r=za.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let a=(0,Dn.processStringSync)(r,t);return a.includes('""')&&(a=li(r)),a}n(ym,"getEventFriendlyName");async function _C(e,t,r){if(!await Ua()||!Pe.utils.isAudited(e))return;let a=ym(e,t),o=new Date;r?.timestamp&&(o=new Date(r.timestamp));let s={timestamp:o.toISOString(),event:e,name:a,userId:r?.userId||Ja.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){s.appId=Pe.db.getProdWorkspaceID(r.appId);let u=await Pe.cache.workspace.getWorkspaceMetadata(r.appId);"name"in u&&(i.appName=u.name)}if(r?.userId){let u=await Pe.users.getById(r?.userId);i.email=u.email}}catch(u){Pe.logging.logAlert("Failed to retrieve fallback information for audit log",u)}return s.fallback=i,await mm(s)}n(_C,"write");async function CC(e){let t=e.map(u=>u.userId),a=e.filter(u=>u.appId).map(u=>Pe.db.getDevWorkspaceID(u.appId)),o=await Pe.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),s=await Pe.db.getWorkspacesByIDs([...new Set(a)]),i=[];for(let u of e){let c=o.find(y=>y?._id===u.userId),d=s.find(y=>Pe.db.isSameWorkspaceID(y?.appId,u.appId)),m={event:u.event,timestamp:u.timestamp,name:u.name,metadata:u.metadata,user:c||pi(u.userId,"user",u.fallback)};u.appId&&(m.app=d||pi(u.appId,"app",u.fallback)),i.push(m)}return i}n(CC,"enrich");async function OC(e){if(!await Ua())throw new Error("Audit logs not available - license required.");let t=await hm(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await ui(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await CC(r.rows)}}n(OC,"fetch");function LC(e){return e=ci(e),gm(e)}n(LC,"download");function PC(){let e=Object.entries(Ja.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=li(r[1]);return t}n(PC,"definitions");var Xa={};_(Xa,{applications:()=>gi,roles:()=>fi,users:()=>di});var di={};_(di,{roleCheck:()=>UC});function qC(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}n(qC,"removeRoles");async function UC(e,t){return await It()||qC(e,t),e}n(UC,"roleCheck");var fi={};_(fi,{assign:()=>kC,unAssign:()=>DC});var Mn=require("@budibase/backend-core");async function kC(e,t){if(!await It())throw new Error("Unable to assign roles - license required.");let r=await Ne.bulkGet(e);for(let a of r){if(t.role&&t.role.roleId){let o=Mn.db.getProdWorkspaceID(t.role.appId);a.roles[o]=t.role.roleId}if(t.appBuilder){let o=Mn.db.getProdWorkspaceID(t.appBuilder.appId),s=a.builder?.apps||[];a.builder={apps:s.concat([o])}}t.builder&&(a.builder={global:!0}),t.admin&&(a.admin={global:!0}),a.roles}await Ne.bulkUpdate(r)}n(kC,"assign");async function DC(e,t){if(!await It())throw new Error("Unable to un-assign roles - license required.");let r=await Ne.bulkGet(e);for(let a of r){if(t.role){let o=Mn.db.getProdWorkspaceID(t.role?.appId);a.roles[o]===t.role.roleId&&delete a.roles[o]}if(t.appBuilder&&a.builder?.apps){let o=Mn.db.getProdWorkspaceID(t.appBuilder.appId);a.builder.apps=a.builder.apps.filter(s=>s!==o)}t.builder&&a.builder&&delete a.builder,t.admin&&a.admin&&delete a.admin}await Ne.bulkUpdate(r)}n(DC,"unAssign");var gi={};_(gi,{buildExportFn:()=>NC,buildImportFn:()=>BC});var mi=require("@budibase/backend-core");var MC=n(e=>{if(e){if(e.appExport)return e.appExport;if(e.file)return e.file}},"ensureAppExportFile");function BC(e){return async(t,r)=>{await It()||t.throw(403,"Endpoint unavailable, license required."),MC(t.request.files)||t.throw(400,"Must provide app export file for import."),await mi.context.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}n(BC,"buildImportFn");function NC(e){return async(t,r)=>{await It()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:a,excludeRows:o}=t.request.body;await mi.context.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:a,excludeRows:o},t.query.appId=t.params.appId,await e(t),await r()})}}n(NC,"buildExportFn");var we=require("@budibase/backend-core"),Ie=require("@budibase/types"),Im=G(require("fs")),wm=require("path");var hi=require("@budibase/backend-core");var bm;function Am(){bm=new hi.queue.BudibaseQueue(hi.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}n(Am,"init");function zt(){return bm}n(zt,"getBackupQueue");async function yi(e,t={}){return Ke.storeAppBackupMetadata(e,t)}n(yi,"storeAppBackupMetadata");function Sm(e){let t=new Date().toISOString();switch(e){case Ie.BackupStatus.COMPLETE:case Ie.BackupStatus.FAILED:return{timestamp:t,finishedAt:t};case Ie.BackupStatus.STARTED:return{timestamp:t,startedAt:t};case Ie.BackupStatus.PENDING:return{timestamp:t,createdAt:t}}}n(Sm,"getTimestamps");async function GC(e,t,r,a){let o=await Za(e);return await Ke.storeAppBackupMetadata({...o,...Sm(t),contents:r,status:t,type:Ie.BackupType.BACKUP},{filename:a,docId:e})}n(GC,"updateBackupStatus");async function FC(e,t,r){let a=await Za(e);return await Ke.storeAppBackupMetadata({...a,...Sm(r),status:r,type:Ie.BackupType.RESTORE,trigger:Ie.BackupTrigger.MANUAL},{docId:e,docRev:t})}n(FC,"updateRestoreStatus");async function Za(e){return Ke.getAppBackupMetadata(e)}n(Za,"getAppBackup");async function WC(e,t){return Ke.updateAppBackupMetadata(e,t)}n(WC,"updateAppBackup");async function vm(e){let t=await Ke.getAppBackupMetadata(e);return t.filename&&await we.objectStore.deleteFile(we.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),Ke.deleteAppBackupMetadata(e)}n(vm,"deleteAppBackup");async function $C(e){let t=[];for(let r of e)try{await vm(r),t.push({backupId:r,success:!0})}catch(a){t.push({backupId:r,success:!1,error:a instanceof Error?a.message:"Unknown error"})}return t}n($C,"deleteAppBackups");async function jC(e,t){return Ke.fetchAppBackups(e,t)}n(jC,"fetchAppBackups");async function Tm(e){let t=await Ke.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let{stream:r}=await we.objectStore.getReadStream(we.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}n(Tm,"getBackupDownloadStream");async function QC(e){let{stream:t}=await Tm(e),r=(0,wm.join)(we.objectStore.budibaseTempDir(),we.utils.newid()),a=Im.default.createWriteStream(r);return new Promise((o,s)=>{t.on("error",s),a.on("error",s),t.pipe(a).on("close",()=>o(r))})}n(QC,"downloadAppBackup");async function KC(e,t,r={}){let a;try{a=await yi({appId:e,trigger:t,timestamp:new Date().toISOString(),status:Ie.BackupStatus.PENDING,type:Ie.BackupType.BACKUP,...r})}catch(o){if(o.status===409)return;throw o}return await zt().add({docId:a.id,docRev:a.rev,appId:e,export:{trigger:t,...r}}),await we.events.backup.appBackupTriggered(e,a.id,Ie.BackupType.BACKUP,t,r?.name),a.id}n(KC,"triggerAppBackup");async function HC(e,t,r,a){let o=await Za(t),s;try{s=await yi({appId:e,timestamp:new Date().toISOString(),status:Ie.BackupStatus.PENDING,type:Ie.BackupType.RESTORE,createdBy:a})}catch(i){if(i?.status===409)return;throw i}return await zt().add({appId:e,docId:s.id,docRev:s.rev,import:{nameForBackup:r,backupId:t,createdBy:a}}),{restoreId:s.id,metadata:o}}n(HC,"triggerAppRestore");async function YC(e,t,r){let a=we.db.getProdWorkspaceID(e);await we.context.doInWorkspaceContext(a,async()=>{let o=we.context.getProdWorkspaceDB();if(!await o.exists())return;let i=await o.tryGet(Ie.DocumentType.WORKSPACE_METADATA);i&&(i.backupErrors||(i.backupErrors={}),i.backupErrors[t]||(i.backupErrors[t]=[]),i.backupErrors[t].push(r),await o.put(i),await we.cache.workspace.invalidateWorkspaceMetadata(i.appId,i))})}n(YC,"trackBackupError");var VC={isEnabled:Ds,triggerAppRestore:_e(HC),triggerAppBackup:_e(KC),getBackupDownloadStream:_e(Tm),downloadAppBackup:_e(QC),fetchAppBackups:_e(jC),storeAppBackupMetadata:_e(yi),updateBackupStatus:_e(GC),updateRestoreStatus:_e(FC),getAppBackup:_e(Za),updateAppBackup:_e(WC),deleteAppBackup:_e(vm),deleteAppBackups:_e($C),trackBackupError:_e(YC)},Ye=VC;var Ai={};_(Ai,{init:()=>bi});var ne=require("@budibase/backend-core"),at=require("@budibase/types"),_r=G(require("fs"));async function bi(e){zt().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),XC(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),JC(t,e)}catch(a){ne.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,a)}})}n(bi,"init");async function zC(e){await ne.db.getDB(e,{skip_setup:!0}).destroy()}n(zC,"removeExistingApp");async function xm(e,t,r,a){let o=ne.db.getDevWorkspaceID(r),s=ne.db.getProdWorkspaceID(r),i=new Date().toISOString(),u=n(async(c,d)=>{a?.doc?await Ye.updateBackupStatus(a.doc.id,c,d?.contents,d?.filename):await Ye.storeAppBackupMetadata({appId:s,timestamp:i,trigger:e,status:c,name:a?.name,type:at.BackupType.BACKUP,contents:d?.contents,createdBy:a?.createdBy},{filename:d?.filename})},"updateMetadata");try{let c=await a.processing.exportAppFn(o,{tar:!0}),d=await a.processing.statsFn(o),m=`${s}/backup-${i}.tar.gz`,y=ne.objectStore.ObjectStoreBuckets.BACKUPS,g=_r.default.createReadStream(c);await ne.objectStore.streamUpload({bucket:y,filename:m,stream:g,extra:{type:"application/gzip",metadata:{name:a?.name,trigger:e,timestamp:i,appId:s}}}),await u(at.BackupStatus.COMPLETE,{filename:m,contents:d}),_r.default.existsSync(c)&&_r.default.rmSync(c)}catch(c){ne.logging.logAlert("App backup error",c),await u(at.BackupStatus.FAILED);let d=a?.doc?.id||`backup-${i}`,m=c instanceof Error?c.message:String(c);await Ye.trackBackupError(s,d,`Backup export failed: ${m}`)}}n(xm,"runBackup");async function JC(e,t){let r=e.data,a=r.appId,o=r.import.backupId,s=r.import.nameForBackup,i=r.import.createdBy,u=ne.tenancy.getTenantIDFromWorkspaceID(a);return ne.tenancy.doInTenant(u,async()=>{let c=ne.db.getDevWorkspaceID(a),d=`${c}_temp_${Date.now()}`,{rev:m}=await Ye.updateRestoreStatus(r.docId,r.docRev,at.BackupStatus.STARTED);await xm(at.BackupTrigger.RESTORING,u,a,{processing:t,createdBy:i,name:s});let y=await Ye.downloadAppBackup(o),g=at.BackupStatus.COMPLETE;try{await t.importAppFn(d,ne.db.getDB(d),{file:{type:"application/gzip",path:y},key:y}),await zC(c),await new ne.db.Replication({source:d,target:c}).replicate()}catch(T){ne.logging.logAlert("App restore error",T),g=at.BackupStatus.FAILED;let B=T instanceof Error?T.message:String(T);await Ye.trackBackupError(a,o,`Backup restore failed: ${B}`)}finally{try{await ne.db.getDB(d,{skip_setup:!0}).destroy()}catch{}}await Ye.updateRestoreStatus(r.docId,m,g),_r.default.existsSync(y)&&_r.default.rmSync(y,{force:!0})})}n(JC,"importProcessor");async function XC(e,t){let r=e.data,a=r.appId,o=r.export.trigger,s=r.export.name,i=ne.tenancy.getTenantIDFromWorkspaceID(a);await ne.tenancy.doInTenant(i,async()=>{try{let{rev:u}=await Ye.updateBackupStatus(r.docId,at.BackupStatus.STARTED);return xm(o,i,a,{processing:t,doc:{id:r.docId,rev:u},name:s})}catch(u){ne.logging.logAlert("App backup error",u);let c=u instanceof Error?u.message:String(u);await Ye.trackBackupError(a,r.docId,`Backup export failed: ${c}`)}})}n(XC,"exportProcessor");var ZC=n(async e=>{Am(),await bi(e.processing)},"init"),Ge={...Ye,processing:Ai,init:ZC,getBackupQueue:zt};var Rm=n(async e=>{e.backups&&await Ge.init(e.backups)},"init");var Ue={};_(Ue,{create:()=>KB,find:()=>QB,get:()=>jB,remove:()=>YB,update:()=>HB});var Vb=G(fu()),vt=require("@budibase/backend-core");var zb=require("@budibase/types");async function jB(e){let t=vt.tenancy.getGlobalDB(),r=new vt.db.QueryBuilder(t.name,zb.SearchIndex.USER);r.setIndexBuilder(vt.db.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[o,s]of Object.entries(e.filters?.equal??{}))r.addEqual(o,s);r.setSort("_id"),r.setSkip(e.skip);let a=await r.run();return{users:a.rows,total:a.totalRows}}n(jB,"get");async function QB(e){return await vt.users.getById(e)}n(QB,"find");async function KB(e){let t=await Ne.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new vt.HTTPError("User is already synched",409);e={...t,scimInfo:(0,Vb.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Ne.save(e,{requirePassword:!1})}n(KB,"create");async function HB(e,t){return await Ne.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}n(HB,"update");async function YB(e){return await Ne.destroy(e)}n(YB,"remove");var Ur={};_(Ur,{create:()=>VB});var Jb=G(fu());var Xb=require("@budibase/backend-core");async function VB(e){let t=await No(e.name),r;if(!t)r=(await re.save(e)).id;else{if(t.scimInfo?.isSync)throw new Xb.HTTPError("Group is already synched",409);r=t._id,t.users.length&&await re.removeUsers(r,t.users.map(o=>o._id)),t.scimInfo=(0,Jb.default)(t.scimInfo,e.scimInfo),await re.save(t)}return await re.get(r)}n(VB,"create");var Xt={};_(Xt,{logRequest:()=>XB,logResponse:()=>ZB});var ot=require("@budibase/backend-core"),eA=G(Zb());var{DocWritethrough:zB}=ot.cache.docWritethrough;function JB(){return`${ot.db.DocumentType.SCIM_LOG}${ot.db.SEPARATOR}${(0,eA.default)().format("YYYYMMDD")}`}n(JB,"getLogDocId");var tA=n(()=>{let e=ot.context.getScimDBName();return new zB(ot.db.getDB(e),JB())},"getDB");async function XB(e){ot.logging.logWarn("SCIM request log",e);let t=Date.now().toString();return await tA().patch({[`${t}_request`]:{ts:new Date().toISOString(),...e}}),t}n(XB,"logRequest");async function ZB(e,t){ot.logging.logWarn("SCIM response",t),await tA().patch({[`${e}_response`]:{ts:new Date().toISOString(),...t}})}n(ZB,"logResponse");var Su={};_(Su,{doInScimContext:()=>yu,feature:()=>Se,internalGroupOnly:()=>Wn,licenseAuth:()=>wu,licensing:()=>rA,requireSCIM:()=>bu,scimGroupOnly:()=>Fn,scimUserOnly:()=>Gn});var Mt=require("@budibase/backend-core");var fo=require("@budibase/types");var eN=n((e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(Mt.env.SELF_HOSTED&&Mt.env.DEFAULT_LICENSE)return t.user.license=Go,r();t.user.license=await ct.cache.getCachedLicense(),e.checkUsersLimit&&(Mt.utils.isServingApp(t)||Mt.utils.isServingBuilder(t)||Mt.utils.isServingBuilderPreview(t)||Mt.utils.isPublicApiRequest(t))&&await ft.usageLimitIsExceeded({name:fo.StaticQuotaName.USERS,type:fo.QuotaUsageType.STATIC,usageChange:0})}return r()},"licensing"),rA=eN;var Se={};_(Se,{requireFeature:()=>tN,requireFeatures:()=>rN});var tN=n(e=>async(t,r)=>{await qa(e),await r()},"requireFeature"),rN=n((...e)=>async(t,r)=>{await ks(e),await r()},"requireFeatures");var mo=require("@budibase/backend-core");var yu=n(async(e,t)=>{let r;return mo.env.ENABLE_SCIM_LOGGER&&(r=await Xt.logRequest({...e.request.toJSON(),body:e.request.body})),await mo.context.doInScimContext(async()=>{let a=await t();return r&&await Xt.logResponse(r,{...e.response.toJSON(),body:e.response.body}),a})},"doInScimContext");var bu=n(async(e,t)=>{await Gs(),await t()},"requireSCIM");var nA=require("@budibase/backend-core");var Gn=n(e=>Au(nA.users.getById,e,!0),"scimUserOnly"),Fn=n(e=>Au(z.get,e,!0),"scimGroupOnly"),Wn=n(e=>Au(z.get,e,!1),"internalGroupOnly");function Au(e,t,r){return async(a,o)=>{let s=a.params[t];return typeof s!="string"&&a.throw(404),!!(await e(s)).scimInfo?.isSync!==r&&a.throw(404),o()}}n(Au,"scimSyncChecks");var $n=require("@budibase/backend-core");var Iu=require("dd-trace");async function wu(e,t){await Iu.tracer.trace("licenseAuth",async r=>{let a=e.request.headers[$n.constants.Header.LICENSE_KEY];Array.isArray(a)&&(a=a[0]),r.addTags({licenseKey:a}),a||e.throw(403,"License key not provided");let o=await Cs(a);o||(r.addTags({licenseFound:!1}),e.throw(403,"License not found or invalid")),o.tenantId||e.throw(403,"License does not have a tenant ID"),Iu.tracer.setUser({id:"anonymous",tenantId:o.tenantId}),await $n.context.doInSelfHostTenantUsingCloud(o.tenantId,async()=>{await $n.context.doInLicenseContext(o,async()=>{await t()})})})}n(wu,"default");var _u={};_(_u,{appBackups:()=>fA,auditLogs:()=>wA,environmentVariables:()=>OA,groups:()=>WA,scim:()=>bI});var Tt=require("@budibase/backend-core"),ho=require("@budibase/types"),lA=G(require("@koa/router")),er=G(require("joi"));var go=require("@budibase/backend-core"),vu=require("@budibase/types");async function Zt(e,t){t||e.throw(400,"App ID missing"),await cr.workspaceExists(t)||e.throw(400,`Provided app ID: ${t} - is invalid.`)}n(Zt,"checkAppID");async function aA(e){let t=e.params.appId;await Zt(e,t);let{body:r}=e.request,a=e.user?._id,o=await Ge.triggerAppBackup(t,vu.BackupTrigger.MANUAL,{name:r.name,createdBy:a});o||e.throw(500,"Unable to start backup."),e.body={backupId:o,message:"Backup triggered - process starting."}}n(aA,"manualBackup");async function oA(e){let t=e.params.appId;await Zt(e,t);let r=e.params.backupId,a=e.request.body.name,o=await Ge.triggerAppRestore(t,r,a,e.user?._id);o||e.throw(500,"Unable to start restore."),await go.events.backup.appBackupRestored(o.metadata),e.body={restoreId:o?.restoreId,message:"Restore triggered - process starting."}}n(oA,"importBackup");async function sA(e){let t=e.params.appId;await Zt(e,t);let r=e.params.backupId;await Ge.deleteAppBackup(r),e.body={message:"Backup deleted successfully."}}n(sA,"deleteBackup");async function iA(e){let t=go.context.getWorkspaceId();await Zt(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 a=await Ge.deleteAppBackups(r),o=a.filter(i=>i.success).length,s=a.length-o;e.body={message:`${o} backups deleted successfully${s>0?`, ${s} failed`:""}.`,results:a,successCount:o,failureCount:s}}n(iA,"deleteBackups");async function uA(e){let t=e.params.appId;await Zt(e,t);let r=e.request.body;r?.trigger&&(r.trigger=r.trigger.toLowerCase(),Object.values(vu.BackupTrigger).includes(r.trigger)||e.throw(400,"Provided trigger is not a valid option.")),e.body=await Ge.fetchAppBackups(t,{paginate:!0,...r})}n(uA,"fetchBackups");async function cA(e){let t=e.params.appId;await Zt(e,t);let r=e.params.backupId,a=e.request.body;e.body=await Ge.updateAppBackup(r,a.name)}n(cA,"updateBackup");async function pA(e){let t=e.params.appId;await Zt(e,t);let r=e.params.backupId,{metadata:a,stream:o}=await Ge.getBackupDownloadStream(r);e.attachment(`backup-${a.timestamp}.tar.gz`),e.body=o}n(pA,"downloadBackup");var dA=new lA.default;function aN(){return Tt.auth.joiValidator.body(er.default.object({trigger:er.default.string().valid(...Object.values(ho.BackupTrigger)),type:er.default.string().valid(...Object.values(ho.BackupType)),startDate:er.default.date(),endDate:er.default.date(),page:er.default.string()}))}n(aN,"validateBackupSearch");dA.post("/api/apps/:appId/backups",Tt.auth.builderOrAdmin,aA).post("/api/apps/:appId/backups/search",Tt.auth.builderOrAdmin,aN(),uA).get("/api/apps/:appId/backups/:backupId/file",Tt.auth.builderOrAdmin,pA).patch("/api/apps/:appId/backups/:backupId",Tt.auth.builderOrAdmin,cA).delete("/api/apps/:appId/backups/:backupId",Tt.auth.builderOrAdmin,sA).delete("/api/apps/:appId/backups",Tt.auth.builderOrAdmin,iA).post("/api/apps/:appId/backups/:backupId/import",Tt.auth.builderOrAdmin,oA);var fA=dA;var Tu=require("@budibase/backend-core");async function mA(e){let t=e.request.body,r=await Dt.fetch(t);await Tu.events.auditLog.filtered(t),e.body=r}n(mA,"search");async function gA(e){let t=e.request.body,{stream:r}=Dt.download(t);await Tu.events.auditLog.downloaded(t),e.attachment(`audit-logs-${Date.now()}.log`),e.body=r}n(gA,"download");async function hA(e){e.body={events:Dt.definitions()}}n(hA,"definitions");var bA=require("@budibase/types"),tr=require("@budibase/backend-core"),AA=G(require("@koa/router")),Ve=G(require("joi"));function yA(){return tr.auth.joiValidator.body(Ve.default.object({userIds:Ve.default.array().items(Ve.default.string()).optional(),appIds:Ve.default.array().items(Ve.default.string()).optional(),events:Ve.default.array().items(Ve.default.string().valid(...Object.values(bA.Event))).optional(),startDate:Ve.default.string().optional().allow(""),endDate:Ve.default.string().optional().allow(""),fullSearch:Ve.default.string().optional().allow(""),bookmark:Ve.default.number()}))}n(yA,"buildAuditLogSearchValidator");var IA=new AA.default;IA.post("/api/global/auditlogs/search",tr.auth.adminOnly,yA(),mA).get("/api/global/auditlogs/download",tr.auth.adminOnly,tr.middleware.querystringToBody,yA(),gA).get("/api/global/auditlogs/definitions",tr.auth.adminOnly,hA);var wA=IA;var Ru=require("@budibase/backend-core"),xu=require("@budibase/types");async function SA(e){e.body={encryptionKeyAvailable:mt.isEncryptionKeyAvailable()}}n(SA,"status");async function vA(e){e.body={variables:await mt.fetch()}}n(vA,"fetch");async function TA(e){let{name:t,production:r,development:a}=e.request.body;await mt.update(t,{production:r,development:a});let o=[xu.Environment.PRODUCTION];r!==a&&o.push(xu.Environment.DEVELOPMENT),await Ru.events.environmentVariable.created(t,o),e.body={message:`Environment variable "${t}" created.`}}n(TA,"create");async function xA(e){let{production:t,development:r}=e.request.body,a=e.params.varName;await mt.update(a,{production:t,development:r}),e.body={message:`Environment variable "${a}" updated.`}}n(xA,"update");async function RA(e){let t=e.params.varName;await mt.remove(t),await Ru.events.environmentVariable.deleted(t),e.body={message:`Environment variable "${t}" deleted.`}}n(RA,"destroy");var rr=require("@budibase/backend-core"),_A=G(require("@koa/router")),jn=G(require("joi"));var CA=new _A.default;function EA(){return rr.auth.joiValidator.body(jn.default.object({name:jn.default.string().optional(),production:jn.default.string().required(),development:jn.default.string().required()}))}n(EA,"buildEnvVarUpdateValidator");CA.get("/api/env/variables/status",rr.auth.builderOrAdmin,SA).get("/api/env/variables",rr.auth.builderOrAdmin,vA).post("/api/env/variables",rr.auth.builderOrAdmin,EA(),TA).patch("/api/env/variables/:varName",rr.auth.builderOrAdmin,EA(),xA).delete("/api/env/variables/:varName",rr.auth.builderOrAdmin,RA);var OA=CA;var gt=require("@budibase/backend-core"),xt=require("@budibase/types"),GA=G(require("@koa/router")),Ce=G(require("joi"));var LA=require("@budibase/backend-core");async function PA(e){let t=e.request.body;if(t.name=t.name.trim(),delete t.roles,t._id){let a=await Er(t._id);t.roles=a.roles,t.scimInfo=a.scimInfo}let r=await Wa(t);e.body={_id:r.id,_rev:r.rev}}n(PA,"save");async function qA(e){let t=e.params.groupId,r=e.request.body.add,a=e.request.body.remove;(r&&!Array.isArray(r)||a&&!Array.isArray(a))&&e.throw(400,"Must supply a list of users to add or to remove");let o,s;r&&(o=await $a(t,r)),a&&(s=await Xs(t,a)),e.body={added:o,removed:s}}n(qA,"updateGroupUsers");async function UA(e){let t=e.params.groupId,r=e.request.body.add,a=e.request.body.remove;(r&&!Array.isArray(r)||a&&!Array.isArray(a))&&e.throw(400,"Must supply a list of objects, with appId and roleId to add or remove"),e.body=await Zs(t,{appsToAdd:r,appsToRemove:a})}n(UA,"updateGroupApps");async function kA(e){e.body={data:await qn()}}n(kA,"fetch");async function DA(e){let{groupId:t,rev:r}=e.params;try{await Js(t,r),e.body={message:"Group deleted successfully"}}catch(a){e.throw(a.status,a)}}n(DA,"destroy");async function MA(e){try{e.body=await Er(e.params.groupId)}catch(t){e.throw(t.status,t)}}n(MA,"find");async function BA(e){let{pageSize:t=10,bookmark:r,emailSearch:a}=e.request.query,o=e.params.groupId,s={limit:t+1},i=await oa(o,{...s,emailSearch:a,bookmark:r}),u=a?i[t]?.email:i[t]?._id,c=!!u;e.body={users:i.slice(0,t),bookmark:u,hasNextPage:c}}n(BA,"searchUsers");async function NA(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 a=await LA.csv.jsonFromCsvString(r,{allowSingleColumn:!0});(!a||a.length===0)&&e.throw(400,"CSV file is invalid");let s=Object.keys(a[0]).find(y=>/^(email|e-mail|email address|mail|e_mail)$/i.test(y.trim()));s||e.throw(400,"CSV file must contain an email column");let i=Array.from(new Set(a.map(y=>y[s]).filter(y=>y&&typeof y=="string"&&y.trim().length>0).map(y=>y.trim())));i.length===0&&e.throw(400,"No valid email addresses found in CSV");try{await Er(t)}catch(y){if(y.status===404)e.throw(404,"Group not found");else throw y}let u=[],c=[],d=[],m=await Promise.all(i.map(y=>Ne.getUserByEmail(y)));for(let y of i){let g=m.find(T=>T?.email===y);g?(u.push({_id:g._id,email:g.email}),d.push(g._id)):c.push({email:y,reason:"User not found"})}d.length>0&&await $a(t,d),e.body={added:u,skipped:c}}n(NA,"bulkAddUsersFromCsv");var FA=new GA.default;function uN(){return gt.auth.joiValidator.body(Ce.default.object({_id:Ce.default.string().optional(),_rev:Ce.default.string().optional(),color:Ce.default.string().required(),icon:Ce.default.string().required(),name:Ce.default.string().trim().required().max(50),role:Ce.default.string().optional(),users:Ce.default.array().optional(),apps:Ce.default.array().optional(),roles:Ce.default.object().optional(),createdAt:Ce.default.string().optional(),updatedAt:Ce.default.string().optional()}).required())}n(uN,"buildGroupSaveValidation");FA.post("/api/global/groups",gt.auth.adminOnly,Se.requireFeature(xt.Feature.USER_GROUPS),uN(),PA).get("/api/global/groups",Se.requireFeature(xt.Feature.USER_GROUPS),kA).delete("/api/global/groups/:groupId/:rev",Se.requireFeature(xt.Feature.USER_GROUPS),gt.auth.adminOnly,Wn("groupId"),DA).get("/api/global/groups/:groupId",Se.requireFeature(xt.Feature.USER_GROUPS),gt.auth.builderOrAdmin,MA).get("/api/global/groups/:groupId/users",Se.requireFeature(xt.Feature.USER_GROUPS),gt.auth.builderOrAdmin,BA).post("/api/global/groups/:groupId/users",gt.auth.adminOnly,Se.requireFeature(xt.Feature.USER_GROUPS),Wn("groupId"),qA).post("/api/global/groups/:groupId/users/bulk",gt.auth.adminOnly,Se.requireFeature(xt.Feature.USER_GROUPS),Wn("groupId"),gt.auth.joiValidator.body(Ce.default.object({csvContent:Ce.default.string().required()}).required()),NA).post("/api/global/groups/:groupId/apps",gt.auth.builderOrAdmin,Se.requireFeature(xt.Feature.USER_GROUPS),UA);var WA=FA;var yI=G(require("@koa/router"));var yo=require("scim-patch");var jA=require("@budibase/backend-core");function $A(e,t){let r=e.request.query[t];if(r!==void 0)return+r}n($A,"tryGetQueryAsNumber");var QA=n(async e=>{let t=$A(e,"pageSize")??20,r=$A(e,"startIndex"),a;e.request.query.filter&&(a=ce.user.userFilters(e.request.query.filter));let o=await Ue.get({pageSize:t,skip:r,filters:a});e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:o.total,Resources:o.users.map(ce.user.toScimUserResponse),startIndex:(r||0)+1,itemsPerPage:t}},"get"),KA=n(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404);let r=await Ue.find(t);e.body=ce.user.toScimUserResponse(r)},"find"),HA=n(async e=>{let t=ce.user.fromScimUser(e.request.body);try{let r=await Ue.create(t);e.body=ce.user.toScimUserResponse(r)}catch(r){throw r instanceof jA.EmailUnavailableError&&e.throw(409,"Email already in use"),r}},"create");function cN(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}n(cN,"isDeactivation");var YA=n(async e=>{let t=await Ue.find(e.params.id);t||e.throw(404);let r=ce.user.toScimUserResponse(t),a=e.request.body;try{(0,yo.patchBodyValidation)(a)}catch{}if(cN(a))return Eu(e);let o;try{o=(0,yo.scimPatch)(r,a.Operations)}catch{}o||e.throw(500);let s=ce.user.fromScimUser(o);await Ue.update(s,{allowChangingEmail:!0}),e.body=ce.user.toScimUserResponse(s)},"update"),Eu=n(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404),await Ue.remove(t),e.status=204},"remove");var cI=G(uI()),pI=require("@budibase/shared-core"),bo=require("scim-patch");var Ao=require("scim2-parse-filter");function lI(e,t){for(let r of t.split(","))delete e[r]}n(lI,"cleanResponse");var dI=n(async e=>{let r=(await re.fetch()).filter(s=>s.scimInfo?.isSync).map(ce.group.toScimGroupResponse),{filter:a,excludedAttributes:o}=e.request.query;if(a){let s=(0,Ao.filter)((0,Ao.parse)(a));r=r.filter(s)}o&&r.forEach(s=>{lI(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"),fI=n(async e=>{let t=ce.group.fromScimGroup(e.request.body),r=await Ur.create(t);e.body=ce.group.toScimGroupResponse(r)},"create"),mI=n(async e=>{let{id:t}=e.params,r=await re.get(t),a=ce.group.toScimGroupResponse(r),{excludedAttributes:o}=e.request.query;o&&lI(a,o),e.body=a},"find"),gI=n(async e=>{let{id:t}=e.params,r=await re.get(t);await re.remove(t,r._rev),e.status=204},"remove"),hI=n(async e=>{let{id:t}=e.params,r=await re.get(t),a=ce.group.toScimGroupResponse(r),o=e.request.body;try{(0,bo.patchBodyValidation)(o)}catch{e.throw(400)}let{true:s,false:i}=(0,cI.default)(o.Operations,u=>u.path==="members");if(i?.length){let u=(0,bo.scimPatch)(a,i);u||e.throw(500);let c={...ce.group.fromScimGroup(u),_rev:r._rev};await re.save(c)}if(s?.length){let u=[],c=[];for(let{op:d,value:m}of s)switch(d){case"add":case"Add":for(let y of m)u.push(await Ue.find(y.value));break;case"remove":case"Remove":for(let y of m)try{c.push(await Ue.find(y.value))}catch(g){if(g.status!==404)throw g}break;case"replace":case"Replace":throw new Error("Replacing members is not allowed");default:pI.utils.unreachable(d)}u.length&&await re.addUsers(t,u.map(d=>d._id)),c.length&&await re.removeUsers(t,c.map(d=>d._id))}e.body=ce.group.toScimGroupResponse(await re.get(t))},"update");var Qn=require("@budibase/types"),Fe=new yI.default({prefix:"/api/global/scim/v2"});Fe.use(bu);Fe.use(yu);Fe.get("/users",QA);Fe.get("/users/:id",Gn("id"),KA);Fe.post("/users",HA);Fe.patch("/users/:id",Gn("id"),YA);Fe.delete("/users/:id",Gn("id"),Eu);Fe.get("/groups",dI);Fe.post("/groups",Se.requireFeature(Qn.Feature.USER_GROUPS),fI);Fe.get("/groups/:id",Se.requireFeature(Qn.Feature.USER_GROUPS),Fn("id"),mI);Fe.delete("/groups/:id",Se.requireFeature(Qn.Feature.USER_GROUPS),Fn("id"),gI);Fe.patch("/groups/:id",Se.requireFeature(Qn.Feature.USER_GROUPS),Fn("id"),hI);var bI=Fe;var ce={};_(ce,{group:()=>Ou,user:()=>Cu});var Cu={};_(Cu,{fromScimUser:()=>MN,toScimUserResponse:()=>UN,userFilters:()=>BN});var AI=require("@budibase/backend-core"),II=require("@budibase/shared-core"),Io=require("@budibase/types"),wI=require("scim2-parse-filter");var{unreachable:qN}=II.utils,UN=n(e=>{let{isSync:t,roles:r,...a}=e.scimInfo||{},o={...a,schemas:["urn:ietf:params:scim:schemas:core:2.0:User"],id:e._id,meta:{resourceType:"User",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},active:e.status===Io.UserStatus.ACTIVE};(e.firstName||e.lastName)&&(o.name={formatted:[e.firstName,e.lastName].filter(i=>i).join(" "),familyName:e.lastName,givenName:e.firstName});let s="urn:ietf:params:scim:schemas:extension:enterprise:2.0:User";if(o[s]?.manager){let i=o[s].manager;typeof i=="string"&&(o[s].manager={value:i})}return o},"toScimUserResponse"),kN=n(e=>!!e?.id,"isScimUserResponse");function DN(e){if(AI.utils.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}n(DN,"tryGetEmail");var MN=n(e=>{let t=kN(e)?e:void 0,r=DN(e);if(!r)throw new Error("Email is required");let a;switch(e.active){case"True":case"true":case!0:a=!0;break;case"False":case"false":case!1:a=!1;break;default:qN(e.active)}let o,s;return e.name?.givenName?(o=e.name?.givenName,s=e.name?.familyName):o=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:o,lastName:s,scimInfo:{...e,isSync:!0},roles:{},status:a?Io.UserStatus.ACTIVE:Io.UserStatus.INACTIVE,createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimUser"),BN=n(e=>{let t={equal:{}},r=(0,wI.parse)(e);function a(o){switch(o.op){case"eq":{let s=o.attrPath,i;switch(s){case"emails.value":i="email";break;default:i=`scimInfo.${s}`}t.equal[i]=o.compValue;break}case"and":for(let s of o.filters)a(s);break;default:console.warn("Filter not handled",{filter:o})}}return n(a,"parseFilters"),a(r),t},"userFilters");var Ou={};_(Ou,{fromScimGroup:()=>FN,toScimGroupResponse:()=>NN});var NN=n(e=>({schemas:["urn:ietf:params:scim:schemas:core:2.0:Group"],id:e._id,externalId:e.scimInfo.externalId,meta:{resourceType:"Group",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},displayName:e.name,members:e.users?.map(t=>({value:t._id}))}),"toScimGroupResponse"),GN=n(e=>!!e?.id,"isScimGroup"),FN=n(e=>{let t=GN(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 Zu={};_(Zu,{LLM:()=>ht,LLMRequest:()=>se,TableGeneration:()=>Xu,agentHistoryTitleSystemPrompt:()=>e0,agentSystemPrompt:()=>ZN,aiColumnSchemas:()=>zu,aiTableResponseToTableSchema:()=>Ku,appendAIColumns:()=>Hu,classifyText:()=>qu,cleanData:()=>Uu,composeAutomationAgentSystemPrompt:()=>JN,composeAutomationAgentToolGuidelines:()=>XN,createLiteLLMOpenAI:()=>LI,extractFileData:()=>HN,generateAIColumns:()=>ju,generateCode:()=>zN,generateCronExpression:()=>ku,generateData:()=>Qu,generateJs:()=>Nu,generateSQL:()=>VN,generateTables:()=>$u,generationStructure:()=>Vu,getChatLLM:()=>DI,getLLM:()=>Yn,getLLMConfig:()=>Wu,getLLMOrThrow:()=>kI,getLiteLLMProvider:()=>CI,getLiteLLMProviderOptions:()=>OI,normalizeContentType:()=>Lu,parseResponseFormat:()=>So,sanitiseToolName:()=>WN,searchWeb:()=>Bu,sentimentAnalysis:()=>Mu,summarizeText:()=>wo,tableDataStructuredOutput:()=>Ju,translate:()=>Du});var Kn=require("@budibase/types");function WN(e){if(e.length>64)throw new Error("Tool name must be under 64 characters long");return e.replace(/[^a-zA-Z0-9_-]/g,"_")}n(WN,"sanitiseToolName");function Lu(e){return e?e.includes("/")?e:{[Kn.SupportedFileType.PDF]:"application/pdf",[Kn.SupportedFileType.JPG]:"image/jpeg",[Kn.SupportedFileType.JPEG]:"image/jpeg",[Kn.SupportedFileType.PNG]:"image/png"}[e.toLowerCase()]||"application/octet-stream":"application/octet-stream"}n(Lu,"normalizeContentType");var _o=require("@budibase/types");var yt=require("@budibase/backend-core"),PI=require("@budibase/types"),kr=require("dd-trace"),qI=require("zod");var TI=require("@budibase/types"),vo=G(require("openai"));var SI=require("@budibase/shared-core"),Bt=require("@budibase/types"),Nt=G(require("dd-trace"));function Pu(e,t){return t.map(r=>e[r]).join(" ")}n(Pu,"extractTextFromColumns");var ht=class{static{n(this,"LLM")}constructor({model:t,apiKey:r,maxTokens:a}){this._model=t,this._apiKey=r,this._maxTokens=a??parseInt(process.env.BUDIBASE_AI_MAX_PROMPT_TOKENS||"1000")}get model(){return this._model}get apiKey(){return this._apiKey}get maxTokens(){return this._maxTokens}async prompt(t){return await Nt.default.trace("prompt",async()=>{let r=typeof t=="string"?new se().addUserMessage(t):t,{messages:a,tokensUsed:o}=await Nt.default.trace("chatCompletion",()=>this.chatCompletion(r));return!a||a.length===0?{message:"",tokensUsed:o}:{message:a[a.length-1].content||"",tokensUsed:o}})}async chat(t){return await Nt.default.trace("chat",async()=>await this.chatCompletion(t))}async*chatStream(t){yield*this.chatCompletionStream(t)}async summarizeText(t){return Nt.default.trace("summarizeText",()=>this.prompt(wo(t)))}async generateCronExpression(t){return Nt.default.trace("generateCronExpression",()=>this.prompt(ku(t)))}async operation(t,r){return Nt.default.trace("operation",a=>{a.addTags({operation:t.operation,rowId:r.id});let o=this.promptForOperation(t,r);return this.prompt(o)})}promptForOperation(t,r){let{operation:a,column:o,columns:s,language:i,categories:u,prompt:c}=t;switch(a){case Bt.AIOperationEnum.SUMMARISE_TEXT:return wo(Pu(r,s));case Bt.AIOperationEnum.CLEAN_DATA:return Uu(r[o]);case Bt.AIOperationEnum.TRANSLATE:return Du(r[o],i);case Bt.AIOperationEnum.CATEGORISE_TEXT:if(!u)throw Error("No categories provided for categorise text operation. Please provide categories.");return qu(Pu(r,s),u.split(","));case Bt.AIOperationEnum.SENTIMENT_ANALYSIS:return Mu(r[o]);case Bt.AIOperationEnum.PROMPT:return c;case Bt.AIOperationEnum.SEARCH_WEB:return Bu(Pu(r,s));default:throw SI.utils.unreachable(a)}}async generateJs(t,r){return await Nt.default.trace("generateJs",async()=>{let{bindings:a=[],snippets:o=[]}=r||{};return await this.prompt(Nu(a,o).addUserMessage(t))})}};var Hn=(a=>(a.GPT_5_MINI="gpt-5-mini",a.GPT_5="gpt-5",a.GPT_5_NANO="gpt-5-nano",a))(Hn||{});function So(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}n(So,"parseResponseFormat");function vI(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}n(vI,"calculateBudibaseAICredits");var ke=class extends ht{constructor(r){super(r);this.client=this.getClient(r)}static{n(this,"OpenAI")}getVerbosityForModel(){if(Object.values(Hn).includes(this.model))return"low"}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new vo.default({apiKey:r.apiKey})}async uploadFile(r,a,o){let s=Lu(o);if(TI.ImageContentTypes.includes(s.toLowerCase())){let c;if(Buffer.isBuffer(r))c=r;else{let m=[];for await(let y of r)m.push(new Uint8Array(y));c=Buffer.concat(m)}let d=c.toString("base64");return`data:${s};base64,${d}`}let i=await(0,vo.toFile)(r,a);return(await this.client.files.create({file:i,purpose:"assistants"})).id}async chatCompletion(r){let a={model:this.model,messages:r.messages,max_completion_tokens:this._maxTokens,response_format:So(r.format)};if(Object.values(Hn).includes(this.model)){let i=this.getVerbosityForModel();i&&(a.verbosity=i),a.reasoning_effort="minimal"}let o=await this.client.chat.completions.create(a),s=o?.choices?.[0]?.message;if(s?.content)return{messages:[...r.messages,{role:s.role,content:s.content}],tokensUsed:vI(o.usage)};throw new Error("No response found")}async*chatCompletionStream(r){let a={model:this.model,messages:r.messages,max_tokens:this.maxTokens,response_format:So(r.format),stream:!0};try{let o=await this.client.chat.completions.create(a),s="",i=null;for await(let c of o){let d=c?.choices?.[0]?.delta;d&&(d.content&&(s+=d.content,yield{type:"content",content:d.content}),c.usage&&(i=c.usage))}let u=i?vI(i):0;s&&r.addMessage({role:"assistant",content:s}),yield{type:"done",messages:r.messages,tokensUsed:u}}catch(o){yield{type:"error",content:o.message}}}};var Gu=G(require("@anthropic-ai/sdk"));function $N(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}n($N,"calculateBudibaseAICredits");var To=class extends ht{constructor(r){super(r);this.client=new Gu.default({apiKey:r.apiKey})}static{n(this,"Anthropic")}firstTextBlock(r){for(let a of r.content)if(a.type==="text")return a.text}async uploadFile(r,a,o){throw new Error("File upload not supported for this LLM provider")}async chatCompletion(r){try{let a=await this.client.messages.create({model:this.model,messages:r.messages.map(({content:s})=>{if(s==null)return{role:"user",content:""};if(typeof s=="string")return{role:"user",content:s};let i="";for(let u of s)u.type==="text"?i+=u.text:["image_url","input_audio","file"].includes(u.type);return{role:"user",content:i}}),max_tokens:this.maxTokens}),o=this.firstTextBlock(a)||"";return{messages:[...r.messages,{role:"assistant",content:o}],tokensUsed:$N(a.usage)}}catch(a){throw a instanceof Gu.default.APIError&&console.error(`Anthropic Prompt failed with error ${a.name} and status: ${a.status}`),a}}async*chatCompletionStream(r){try{let a=await this.chatCompletion(r);if(a.messages.length>0){let o=a.messages[a.messages.length-1];o.content&&(yield{type:"content",content:o.content})}yield{type:"done",messages:a.messages,tokensUsed:a.tokensUsed}}catch(a){yield{type:"error",content:a.message}}}};var xI=require("openai");var xo=class extends ke{static{n(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 xI.AzureOpenAI({apiKey:t.apiKey,apiVersion:"2024-10-01-preview",baseURL:t.baseUrl})}getVerbosityForModel(){return Object.values(Hn).includes(this.model)?"medium":void 0}};var be=require("@budibase/backend-core"),RI=require("@budibase/types"),Fu=require("dd-trace");var Ro=class extends ht{static{n(this,"BudibaseAI")}async prompt(t){let r=await super.prompt(t);return r.tokensUsed&&await Ga(r.tokensUsed),r}async chat(t){let r=await super.chat(t);return r.tokensUsed&&await Ga(r.tokensUsed),r}async uploadFile(t,r,a){return be.env.SELF_HOSTED?this.uploadFileSelfHost(t,r,a):this.uploadFileCloud(t,r,a)}async uploadFileCloud(t,r,a){return new ke({apiKey:be.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).uploadFile(t,r,a)}async uploadFileSelfHost(t,r,a){let o;if(Buffer.isBuffer(t))o=t;else{let m=[];for await(let y of t)m.push(new Uint8Array(y));o=Buffer.concat(m)}let s=o.toString("base64");if(a&&RI.ImageContentTypes.includes(a.toLowerCase()))return`data:image/jpeg;base64,${s}`;if(!be.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let m=await _a();if(!m)throw new Error("No license key found");this._apiKey=m}let i=`${be.env.BUDICLOUD_URL}/api/ai/upload-file`,u={method:"POST",headers:{"Content-Type":"application/json",[be.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:s,filename:r,contentType:a})};console.debug("[BudibaseAI] uploadFileSelfHost - Making network call",{url:i,method:u.method,headers:u.headers,bodyKeys:["data","filename","contentType"],filename:r,contentType:a});let c=await Xn(i,u);if(console.debug("[BudibaseAI] uploadFileSelfHost - Network response",{url:i,status:c.status,statusText:c.statusText,ok:c.ok}),!c.ok)throw await be.HTTPError.fromResponse(c);return(await c.json()).fileId}async chatCompletion(t){return be.env.SELF_HOSTED?this.chatCompletionSelfHost(t):this.chatCompletionCloud(t)}async chatCompletionCloud(t){return await Fu.tracer.trace("chatCompletionCloud",async()=>await new ke({apiKey:be.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletion(t))}async chatCompletionSelfHost(t){return await Fu.tracer.trace("chatCompletionSelfHost",async r=>{if(!be.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(r.addTags({budicloudUrl:be.env.BUDICLOUD_URL}),!this._apiKey){let c=await _a();if(!c)throw new Error("No license key found");this._apiKey=c,r.addTags({licenseKey:this._apiKey})}let a={messages:t.messages,format:t.format},o=`${be.env.BUDICLOUD_URL}/api/ai/chat`,s={method:"POST",headers:{"Content-Type":"application/json",[be.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(a)};console.debug("[BudibaseAI] chatCompletionSelfHost - Making network call",{url:o,method:s.method,headers:s.headers,bodyKeys:Object.keys(a),messagesCount:t.messages.length,format:a.format});let i=await Xn(o,s);if(console.debug("[BudibaseAI] chatCompletionSelfHost - Network response",{url:o,status:i.status,statusText:i.statusText,ok:i.ok}),!i.ok)throw await be.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){be.env.SELF_HOSTED?yield*this.chatCompletionStreamSelfHost(t):yield*this.chatCompletionStreamCloud(t)}async*chatCompletionStreamCloud(t){yield*new ke({apiKey:be.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});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 a=r.messages[r.messages.length-1];a.content&&(yield{type:"content",content:a.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 EI=G(require("openai")),_I=require("@ai-sdk/openai");var Eo=class extends ke{static{n(this,"LiteLLMAI")}getClient(t){if(!t.apiKey)throw new Error("No LiteLLM API key found");return new EI.default({apiKey:t.apiKey,baseURL:t.baseUrl})}},CI=n(e=>{let[t]=e.split("/");return t||"openai"},"getLiteLLMProvider"),OI=n(()=>({openai:{parallelToolCalls:!0}}),"getLiteLLMProviderOptions"),LI=n(e=>{let{apiKey:t,baseUrl:r,fetch:a}=e,o={apiKey:t,baseURL:r,name:"litellm"};return a&&(o.fetch=a),(0,_I.createOpenAI)(o)},"createLiteLLMOpenAI");var UI={OpenAI:"gpt-5-mini",TogetherAI:"gpt-5-mini",AzureOpenAI:"gpt-4.1",Custom:"gpt-5-mini",Anthropic:"claude-3-5-sonnet-20240620",BudibaseAI:"gpt-5-mini"},jN={OpenAI:ke,TogetherAI:ke,AzureOpenAI:xo,Custom:ke,Anthropic:To,BudibaseAI:Ro};async function QN(){return await kr.tracer.trace("getAIConfig",async e=>{let t={type:PI.ConfigType.AI,config:{}};if(!yt.context.isSelfHostUsingCloud()){let a=await yt.configs.getAIConfig();a&&(t=a)}await Fs(t);let r=Object.values(t.config).find(a=>a.active&&a.isDefault);if(!r){e.addTags({enabled:!1,reason:"no provider found"});return}return e.addTags({enabled:!0}),{provider:r.provider,model:r.defaultModel||UI[r.provider],apiKey:r.apiKey,baseUrl:r.baseUrl}})}n(QN,"getAIConfig");async function KN(){return kr.tracer.trace("getSelfHostOpenAIKeyConfig",e=>{if(!yt.env.SELF_HOSTED){e.addTags({enabled:!1,reason:"not self host"});return}if(!yt.env.OPENAI_API_KEY){e.addTags({enabled:!1,reason:"no OPENAI_API_KEY"});return}return e.addTags({enabled:!0}),{provider:"OpenAI",model:UI.OpenAI,apiKey:yt.env.OPENAI_API_KEY}})}n(KN,"getSelfHostOpenAIKeyConfig");async function Wu(){return kr.tracer.trace("getLLMConfig",async()=>await QN()||await KN())}n(Wu,"getLLMConfig");async function Yn(e){return await kr.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:a}=e||{},o=await Wu();if(!o){t.addTags({enabled:!1,reason:"no config found"});return}r&&(o.model=r),a&&(o.maxTokens=a);let s=jN[o.provider];if(!s){t.addTags({enabled:!1,reason:"no provider found",provider:o.provider});return}return new s(o)})}n(Yn,"getLLM");async function kI(){let e=await Yn();if(!e)throw new yt.HTTPError("No available LLM configurations",500);return e}n(kI,"getLLMOrThrow");async function DI(e){return await kr.tracer.trace("getChatLLM",async()=>new Eo(e))}n(DI,"getChatLLM");var se=class e{constructor(){this.messages=[]}static{n(this,"LLMRequest")}withFormat(t){return t instanceof qI.z.ZodType?this.format={type:"json_schema",json_schema:{name:"response",strict:!1,schema:t.toJSONSchema({target:"draft-7"})}}:this.format=t,this}addMessage(t){return this.messages.push(t),this}addMessages(t){return this.messages.push(...t),this}addUserMessage(t){return this.messages.push({role:"user",content:t}),this}addSystemMessage(t){return this.messages.push({role:"system",content:t}),this}static fromRequest(t){let r=new e;return t.messages&&r.addMessages(t.messages),t.format&&r.withFormat(t.format),r}};var Rt=require("zod");function wo(e,t){let r=`Summarize this text:
38
+ `;o.write(u)}}),r.on("end",()=>{o.end()}),{promise:a,stream:o}}n(gm,"dump");var kn=require("@budibase/backend-core"),Dn=require("@budibase/string-templates"),za=require("@budibase/types");var RC=kn.constants.MIN_VALID_DATE.toISOString(),EC=kn.constants.MAX_VALID_DATE.toISOString();function ci(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||RC,e.endDate=e.endDate||EC),e}n(ci,"fillDates");async function hm(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(a=>kn.db.getProdWorkspaceID(a)));let t={};function r(a,o){o?.length&&(t.oneOf={...t.oneOf,[a]:o})}return n(r,"addStringParams"),r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=ci(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}n(hm,"getSearchFilters");function pi(e,t,r){let a={_id:e,status:za.AuditLogResourceStatus.DELETED};switch(t){case"app":a.name=r?.appName;break;case"user":a.email=r?.email;break}return a}n(pi,"deleted");function li(e){let t=(0,Dn.findHBSBlocks)(e);for(let r of t){let a=` "${r}"`;e=e.replace(e.includes(a)?a:` ${r}`,""),e=(0,Dn.processStringSync)(e,{})}return e}n(li,"removeTemplateStrings");function ym(e,t){let r=za.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let a=(0,Dn.processStringSync)(r,t);return a.includes('""')&&(a=li(r)),a}n(ym,"getEventFriendlyName");async function _C(e,t,r){if(!await Ua()||!Pe.utils.isAudited(e))return;let a=ym(e,t),o=new Date;r?.timestamp&&(o=new Date(r.timestamp));let s={timestamp:o.toISOString(),event:e,name:a,userId:r?.userId||Ja.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){s.appId=Pe.db.getProdWorkspaceID(r.appId);let u=await Pe.cache.workspace.getWorkspaceMetadata(r.appId);"name"in u&&(i.appName=u.name)}if(r?.userId){let u=await Pe.users.getById(r?.userId);i.email=u.email}}catch(u){Pe.logging.logAlert("Failed to retrieve fallback information for audit log",u)}return s.fallback=i,await mm(s)}n(_C,"write");async function CC(e){let t=e.map(u=>u.userId),a=e.filter(u=>u.appId).map(u=>Pe.db.getDevWorkspaceID(u.appId)),o=await Pe.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),s=await Pe.db.getWorkspacesByIDs([...new Set(a)]),i=[];for(let u of e){let c=o.find(y=>y?._id===u.userId),d=s.find(y=>Pe.db.isSameWorkspaceID(y?.appId,u.appId)),m={event:u.event,timestamp:u.timestamp,name:u.name,metadata:u.metadata,user:c||pi(u.userId,"user",u.fallback)};u.appId&&(m.app=d||pi(u.appId,"app",u.fallback)),i.push(m)}return i}n(CC,"enrich");async function OC(e){if(!await Ua())throw new Error("Audit logs not available - license required.");let t=await hm(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await ui(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await CC(r.rows)}}n(OC,"fetch");function LC(e){return e=ci(e),gm(e)}n(LC,"download");function PC(){let e=Object.entries(Ja.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=li(r[1]);return t}n(PC,"definitions");var Xa={};_(Xa,{applications:()=>gi,roles:()=>fi,users:()=>di});var di={};_(di,{roleCheck:()=>UC});function qC(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}n(qC,"removeRoles");async function UC(e,t){return await It()||qC(e,t),e}n(UC,"roleCheck");var fi={};_(fi,{assign:()=>kC,unAssign:()=>DC});var Mn=require("@budibase/backend-core");async function kC(e,t){if(!await It())throw new Error("Unable to assign roles - license required.");let r=await Ne.bulkGet(e);for(let a of r){if(t.role&&t.role.roleId){let o=Mn.db.getProdWorkspaceID(t.role.appId);a.roles[o]=t.role.roleId}if(t.appBuilder){let o=Mn.db.getProdWorkspaceID(t.appBuilder.appId),s=a.builder?.apps||[];a.builder={apps:s.concat([o])}}t.builder&&(a.builder={global:!0}),t.admin&&(a.admin={global:!0}),a.roles}await Ne.bulkUpdate(r)}n(kC,"assign");async function DC(e,t){if(!await It())throw new Error("Unable to un-assign roles - license required.");let r=await Ne.bulkGet(e);for(let a of r){if(t.role){let o=Mn.db.getProdWorkspaceID(t.role?.appId);a.roles[o]===t.role.roleId&&delete a.roles[o]}if(t.appBuilder&&a.builder?.apps){let o=Mn.db.getProdWorkspaceID(t.appBuilder.appId);a.builder.apps=a.builder.apps.filter(s=>s!==o)}t.builder&&a.builder&&delete a.builder,t.admin&&a.admin&&delete a.admin}await Ne.bulkUpdate(r)}n(DC,"unAssign");var gi={};_(gi,{buildExportFn:()=>NC,buildImportFn:()=>BC});var mi=require("@budibase/backend-core");var MC=n(e=>{if(e){if(e.appExport)return e.appExport;if(e.file)return e.file}},"ensureAppExportFile");function BC(e){return async(t,r)=>{await It()||t.throw(403,"Endpoint unavailable, license required."),MC(t.request.files)||t.throw(400,"Must provide app export file for import."),await mi.context.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}n(BC,"buildImportFn");function NC(e){return async(t,r)=>{await It()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:a,excludeRows:o}=t.request.body;await mi.context.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:a,excludeRows:o},t.query.appId=t.params.appId,await e(t),await r()})}}n(NC,"buildExportFn");var we=require("@budibase/backend-core"),Ie=require("@budibase/types"),Im=G(require("fs")),wm=require("path");var hi=require("@budibase/backend-core");var bm;function Am(){bm=new hi.queue.BudibaseQueue(hi.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}n(Am,"init");function zt(){return bm}n(zt,"getBackupQueue");async function yi(e,t={}){return Ke.storeAppBackupMetadata(e,t)}n(yi,"storeAppBackupMetadata");function Sm(e){let t=new Date().toISOString();switch(e){case Ie.BackupStatus.COMPLETE:case Ie.BackupStatus.FAILED:return{timestamp:t,finishedAt:t};case Ie.BackupStatus.STARTED:return{timestamp:t,startedAt:t};case Ie.BackupStatus.PENDING:return{timestamp:t,createdAt:t}}}n(Sm,"getTimestamps");async function GC(e,t,r,a){let o=await Za(e);return await Ke.storeAppBackupMetadata({...o,...Sm(t),contents:r,status:t,type:Ie.BackupType.BACKUP},{filename:a,docId:e})}n(GC,"updateBackupStatus");async function FC(e,t,r){let a=await Za(e);return await Ke.storeAppBackupMetadata({...a,...Sm(r),status:r,type:Ie.BackupType.RESTORE,trigger:Ie.BackupTrigger.MANUAL},{docId:e,docRev:t})}n(FC,"updateRestoreStatus");async function Za(e){return Ke.getAppBackupMetadata(e)}n(Za,"getAppBackup");async function WC(e,t){return Ke.updateAppBackupMetadata(e,t)}n(WC,"updateAppBackup");async function vm(e){let t=await Ke.getAppBackupMetadata(e);return t.filename&&await we.objectStore.deleteFile(we.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),Ke.deleteAppBackupMetadata(e)}n(vm,"deleteAppBackup");async function $C(e){let t=[];for(let r of e)try{await vm(r),t.push({backupId:r,success:!0})}catch(a){t.push({backupId:r,success:!1,error:a instanceof Error?a.message:"Unknown error"})}return t}n($C,"deleteAppBackups");async function jC(e,t){return Ke.fetchAppBackups(e,t)}n(jC,"fetchAppBackups");async function Tm(e){let t=await Ke.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let{stream:r}=await we.objectStore.getReadStream(we.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}n(Tm,"getBackupDownloadStream");async function QC(e){let{stream:t}=await Tm(e),r=(0,wm.join)(we.objectStore.budibaseTempDir(),we.utils.newid()),a=Im.default.createWriteStream(r);return new Promise((o,s)=>{t.on("error",s),a.on("error",s),t.pipe(a).on("close",()=>o(r))})}n(QC,"downloadAppBackup");async function KC(e,t,r={}){let a;try{a=await yi({appId:e,trigger:t,timestamp:new Date().toISOString(),status:Ie.BackupStatus.PENDING,type:Ie.BackupType.BACKUP,...r})}catch(o){if(o.status===409)return;throw o}return await zt().add({docId:a.id,docRev:a.rev,appId:e,export:{trigger:t,...r}}),await we.events.backup.appBackupTriggered(e,a.id,Ie.BackupType.BACKUP,t,r?.name),a.id}n(KC,"triggerAppBackup");async function HC(e,t,r,a){let o=await Za(t),s;try{s=await yi({appId:e,timestamp:new Date().toISOString(),status:Ie.BackupStatus.PENDING,type:Ie.BackupType.RESTORE,createdBy:a})}catch(i){if(i?.status===409)return;throw i}return await zt().add({appId:e,docId:s.id,docRev:s.rev,import:{nameForBackup:r,backupId:t,createdBy:a}}),{restoreId:s.id,metadata:o}}n(HC,"triggerAppRestore");async function YC(e,t,r){let a=we.db.getProdWorkspaceID(e);await we.context.doInWorkspaceContext(a,async()=>{let o=we.context.getProdWorkspaceDB();if(!await o.exists())return;let i=await o.tryGet(Ie.DocumentType.WORKSPACE_METADATA);i&&(i.backupErrors||(i.backupErrors={}),i.backupErrors[t]||(i.backupErrors[t]=[]),i.backupErrors[t].push(r),await o.put(i),await we.cache.workspace.invalidateWorkspaceMetadata(i.appId,i))})}n(YC,"trackBackupError");var VC={isEnabled:Ds,triggerAppRestore:_e(HC),triggerAppBackup:_e(KC),getBackupDownloadStream:_e(Tm),downloadAppBackup:_e(QC),fetchAppBackups:_e(jC),storeAppBackupMetadata:_e(yi),updateBackupStatus:_e(GC),updateRestoreStatus:_e(FC),getAppBackup:_e(Za),updateAppBackup:_e(WC),deleteAppBackup:_e(vm),deleteAppBackups:_e($C),trackBackupError:_e(YC)},Ye=VC;var Ai={};_(Ai,{init:()=>bi});var ne=require("@budibase/backend-core"),at=require("@budibase/types"),_r=G(require("fs"));async function bi(e){zt().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),XC(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),JC(t,e)}catch(a){ne.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,a)}})}n(bi,"init");async function zC(e){await ne.db.getDB(e,{skip_setup:!0}).destroy()}n(zC,"removeExistingApp");async function xm(e,t,r,a){let o=ne.db.getDevWorkspaceID(r),s=ne.db.getProdWorkspaceID(r),i=new Date().toISOString(),u=n(async(c,d)=>{a?.doc?await Ye.updateBackupStatus(a.doc.id,c,d?.contents,d?.filename):await Ye.storeAppBackupMetadata({appId:s,timestamp:i,trigger:e,status:c,name:a?.name,type:at.BackupType.BACKUP,contents:d?.contents,createdBy:a?.createdBy},{filename:d?.filename})},"updateMetadata");try{let c=await a.processing.exportAppFn(o,{tar:!0}),d=await a.processing.statsFn(o),m=`${s}/backup-${i}.tar.gz`,y=ne.objectStore.ObjectStoreBuckets.BACKUPS,g=_r.default.createReadStream(c);await ne.objectStore.streamUpload({bucket:y,filename:m,stream:g,extra:{type:"application/gzip",metadata:{name:a?.name,trigger:e,timestamp:i,appId:s}}}),await u(at.BackupStatus.COMPLETE,{filename:m,contents:d}),_r.default.existsSync(c)&&_r.default.rmSync(c)}catch(c){ne.logging.logAlert("App backup error",c),await u(at.BackupStatus.FAILED);let d=a?.doc?.id||`backup-${i}`,m=c instanceof Error?c.message:String(c);await Ye.trackBackupError(s,d,`Backup export failed: ${m}`)}}n(xm,"runBackup");async function JC(e,t){let r=e.data,a=r.appId,o=r.import.backupId,s=r.import.nameForBackup,i=r.import.createdBy,u=ne.tenancy.getTenantIDFromWorkspaceID(a);return ne.tenancy.doInTenant(u,async()=>{let c=ne.db.getDevWorkspaceID(a),d=`${c}_temp_${Date.now()}`,{rev:m}=await Ye.updateRestoreStatus(r.docId,r.docRev,at.BackupStatus.STARTED);await xm(at.BackupTrigger.RESTORING,u,a,{processing:t,createdBy:i,name:s});let y=await Ye.downloadAppBackup(o),g=at.BackupStatus.COMPLETE;try{await t.importAppFn(d,ne.db.getDB(d),{file:{type:"application/gzip",path:y},key:y}),await zC(c),await new ne.db.Replication({source:d,target:c}).replicate()}catch(T){ne.logging.logAlert("App restore error",T),g=at.BackupStatus.FAILED;let B=T instanceof Error?T.message:String(T);await Ye.trackBackupError(a,o,`Backup restore failed: ${B}`)}finally{try{await ne.db.getDB(d,{skip_setup:!0}).destroy()}catch{}}await Ye.updateRestoreStatus(r.docId,m,g),_r.default.existsSync(y)&&_r.default.rmSync(y,{force:!0})})}n(JC,"importProcessor");async function XC(e,t){let r=e.data,a=r.appId,o=r.export.trigger,s=r.export.name,i=ne.tenancy.getTenantIDFromWorkspaceID(a);await ne.tenancy.doInTenant(i,async()=>{try{let{rev:u}=await Ye.updateBackupStatus(r.docId,at.BackupStatus.STARTED);return xm(o,i,a,{processing:t,doc:{id:r.docId,rev:u},name:s})}catch(u){ne.logging.logAlert("App backup error",u);let c=u instanceof Error?u.message:String(u);await Ye.trackBackupError(a,r.docId,`Backup export failed: ${c}`)}})}n(XC,"exportProcessor");var ZC=n(async e=>{Am(),await bi(e.processing)},"init"),Ge={...Ye,processing:Ai,init:ZC,getBackupQueue:zt};var Rm=n(async e=>{e.backups&&await Ge.init(e.backups)},"init");var Ue={};_(Ue,{create:()=>KB,find:()=>QB,get:()=>jB,remove:()=>YB,update:()=>HB});var Vb=G(fu()),vt=require("@budibase/backend-core");var zb=require("@budibase/types");async function jB(e){let t=vt.tenancy.getGlobalDB(),r=new vt.db.QueryBuilder(t.name,zb.SearchIndex.USER);r.setIndexBuilder(vt.db.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[o,s]of Object.entries(e.filters?.equal??{}))r.addEqual(o,s);r.setSort("_id"),r.setSkip(e.skip);let a=await r.run();return{users:a.rows,total:a.totalRows}}n(jB,"get");async function QB(e){return await vt.users.getById(e)}n(QB,"find");async function KB(e){let t=await Ne.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new vt.HTTPError("User is already synched",409);e={...t,scimInfo:(0,Vb.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Ne.save(e,{requirePassword:!1})}n(KB,"create");async function HB(e,t){return await Ne.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}n(HB,"update");async function YB(e){return await Ne.destroy(e)}n(YB,"remove");var Ur={};_(Ur,{create:()=>VB});var Jb=G(fu());var Xb=require("@budibase/backend-core");async function VB(e){let t=await No(e.name),r;if(!t)r=(await re.save(e)).id;else{if(t.scimInfo?.isSync)throw new Xb.HTTPError("Group is already synched",409);r=t._id,t.users.length&&await re.removeUsers(r,t.users.map(o=>o._id)),t.scimInfo=(0,Jb.default)(t.scimInfo,e.scimInfo),await re.save(t)}return await re.get(r)}n(VB,"create");var Xt={};_(Xt,{logRequest:()=>XB,logResponse:()=>ZB});var ot=require("@budibase/backend-core"),eA=G(Zb());var{DocWritethrough:zB}=ot.cache.docWritethrough;function JB(){return`${ot.db.DocumentType.SCIM_LOG}${ot.db.SEPARATOR}${(0,eA.default)().format("YYYYMMDD")}`}n(JB,"getLogDocId");var tA=n(()=>{let e=ot.context.getScimDBName();return new zB(ot.db.getDB(e),JB())},"getDB");async function XB(e){ot.logging.logWarn("SCIM request log",e);let t=Date.now().toString();return await tA().patch({[`${t}_request`]:{ts:new Date().toISOString(),...e}}),t}n(XB,"logRequest");async function ZB(e,t){ot.logging.logWarn("SCIM response",t),await tA().patch({[`${e}_response`]:{ts:new Date().toISOString(),...t}})}n(ZB,"logResponse");var Su={};_(Su,{doInScimContext:()=>yu,feature:()=>Se,internalGroupOnly:()=>Wn,licenseAuth:()=>wu,licensing:()=>rA,requireSCIM:()=>bu,scimGroupOnly:()=>Fn,scimUserOnly:()=>Gn});var Mt=require("@budibase/backend-core");var fo=require("@budibase/types");var eN=n((e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(Mt.env.SELF_HOSTED&&Mt.env.DEFAULT_LICENSE)return t.user.license=Go,r();t.user.license=await ct.cache.getCachedLicense(),e.checkUsersLimit&&(Mt.utils.isServingApp(t)||Mt.utils.isServingBuilder(t)||Mt.utils.isServingBuilderPreview(t)||Mt.utils.isPublicApiRequest(t))&&await ft.usageLimitIsExceeded({name:fo.StaticQuotaName.USERS,type:fo.QuotaUsageType.STATIC,usageChange:0})}return r()},"licensing"),rA=eN;var Se={};_(Se,{requireFeature:()=>tN,requireFeatures:()=>rN});var tN=n(e=>async(t,r)=>{await qa(e),await r()},"requireFeature"),rN=n((...e)=>async(t,r)=>{await ks(e),await r()},"requireFeatures");var mo=require("@budibase/backend-core");var yu=n(async(e,t)=>{let r;return mo.env.ENABLE_SCIM_LOGGER&&(r=await Xt.logRequest({...e.request.toJSON(),body:e.request.body})),await mo.context.doInScimContext(async()=>{let a=await t();return r&&await Xt.logResponse(r,{...e.response.toJSON(),body:e.response.body}),a})},"doInScimContext");var bu=n(async(e,t)=>{await Gs(),await t()},"requireSCIM");var nA=require("@budibase/backend-core");var Gn=n(e=>Au(nA.users.getById,e,!0),"scimUserOnly"),Fn=n(e=>Au(z.get,e,!0),"scimGroupOnly"),Wn=n(e=>Au(z.get,e,!1),"internalGroupOnly");function Au(e,t,r){return async(a,o)=>{let s=a.params[t];return typeof s!="string"&&a.throw(404),!!(await e(s)).scimInfo?.isSync!==r&&a.throw(404),o()}}n(Au,"scimSyncChecks");var $n=require("@budibase/backend-core");var Iu=require("dd-trace");async function wu(e,t){await Iu.tracer.trace("licenseAuth",async r=>{let a=e.request.headers[$n.constants.Header.LICENSE_KEY];Array.isArray(a)&&(a=a[0]),r.addTags({licenseKey:a}),a||e.throw(403,"License key not provided");let o=await Cs(a);o||(r.addTags({licenseFound:!1}),e.throw(403,"License not found or invalid")),o.tenantId||e.throw(403,"License does not have a tenant ID"),Iu.tracer.setUser({id:"anonymous",tenantId:o.tenantId}),await $n.context.doInSelfHostTenantUsingCloud(o.tenantId,async()=>{await $n.context.doInLicenseContext(o,async()=>{await t()})})})}n(wu,"default");var _u={};_(_u,{appBackups:()=>fA,auditLogs:()=>wA,environmentVariables:()=>OA,groups:()=>WA,scim:()=>bI});var Tt=require("@budibase/backend-core"),ho=require("@budibase/types"),lA=G(require("@koa/router")),er=G(require("joi"));var go=require("@budibase/backend-core"),vu=require("@budibase/types");async function Zt(e,t){t||e.throw(400,"App ID missing"),await cr.workspaceExists(t)||e.throw(400,`Provided app ID: ${t} - is invalid.`)}n(Zt,"checkAppID");async function aA(e){let t=e.params.appId;await Zt(e,t);let{body:r}=e.request,a=e.user?._id,o=await Ge.triggerAppBackup(t,vu.BackupTrigger.MANUAL,{name:r.name,createdBy:a});o||e.throw(500,"Unable to start backup."),e.body={backupId:o,message:"Backup triggered - process starting."}}n(aA,"manualBackup");async function oA(e){let t=e.params.appId;await Zt(e,t);let r=e.params.backupId,a=e.request.body.name,o=await Ge.triggerAppRestore(t,r,a,e.user?._id);o||e.throw(500,"Unable to start restore."),await go.events.backup.appBackupRestored(o.metadata),e.body={restoreId:o?.restoreId,message:"Restore triggered - process starting."}}n(oA,"importBackup");async function sA(e){let t=e.params.appId;await Zt(e,t);let r=e.params.backupId;await Ge.deleteAppBackup(r),e.body={message:"Backup deleted successfully."}}n(sA,"deleteBackup");async function iA(e){let t=go.context.getWorkspaceId();await Zt(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 a=await Ge.deleteAppBackups(r),o=a.filter(i=>i.success).length,s=a.length-o;e.body={message:`${o} backups deleted successfully${s>0?`, ${s} failed`:""}.`,results:a,successCount:o,failureCount:s}}n(iA,"deleteBackups");async function uA(e){let t=e.params.appId;await Zt(e,t);let r=e.request.body;r?.trigger&&(r.trigger=r.trigger.toLowerCase(),Object.values(vu.BackupTrigger).includes(r.trigger)||e.throw(400,"Provided trigger is not a valid option.")),e.body=await Ge.fetchAppBackups(t,{paginate:!0,...r})}n(uA,"fetchBackups");async function cA(e){let t=e.params.appId;await Zt(e,t);let r=e.params.backupId,a=e.request.body;e.body=await Ge.updateAppBackup(r,a.name)}n(cA,"updateBackup");async function pA(e){let t=e.params.appId;await Zt(e,t);let r=e.params.backupId,{metadata:a,stream:o}=await Ge.getBackupDownloadStream(r);e.attachment(`backup-${a.timestamp}.tar.gz`),e.body=o}n(pA,"downloadBackup");var dA=new lA.default;function aN(){return Tt.auth.joiValidator.body(er.default.object({trigger:er.default.string().valid(...Object.values(ho.BackupTrigger)),type:er.default.string().valid(...Object.values(ho.BackupType)),startDate:er.default.date(),endDate:er.default.date(),page:er.default.string()}))}n(aN,"validateBackupSearch");dA.post("/api/apps/:appId/backups",Tt.auth.builderOrAdmin,aA).post("/api/apps/:appId/backups/search",Tt.auth.builderOrAdmin,aN(),uA).get("/api/apps/:appId/backups/:backupId/file",Tt.auth.builderOrAdmin,pA).patch("/api/apps/:appId/backups/:backupId",Tt.auth.builderOrAdmin,cA).delete("/api/apps/:appId/backups/:backupId",Tt.auth.builderOrAdmin,sA).delete("/api/apps/:appId/backups",Tt.auth.builderOrAdmin,iA).post("/api/apps/:appId/backups/:backupId/import",Tt.auth.builderOrAdmin,oA);var fA=dA;var Tu=require("@budibase/backend-core");async function mA(e){let t=e.request.body,r=await Dt.fetch(t);await Tu.events.auditLog.filtered(t),e.body=r}n(mA,"search");async function gA(e){let t=e.request.body,{stream:r}=Dt.download(t);await Tu.events.auditLog.downloaded(t),e.attachment(`audit-logs-${Date.now()}.log`),e.body=r}n(gA,"download");async function hA(e){e.body={events:Dt.definitions()}}n(hA,"definitions");var bA=require("@budibase/types"),tr=require("@budibase/backend-core"),AA=G(require("@koa/router")),Ve=G(require("joi"));function yA(){return tr.auth.joiValidator.body(Ve.default.object({userIds:Ve.default.array().items(Ve.default.string()).optional(),appIds:Ve.default.array().items(Ve.default.string()).optional(),events:Ve.default.array().items(Ve.default.string().valid(...Object.values(bA.Event))).optional(),startDate:Ve.default.string().optional().allow(""),endDate:Ve.default.string().optional().allow(""),fullSearch:Ve.default.string().optional().allow(""),bookmark:Ve.default.number()}))}n(yA,"buildAuditLogSearchValidator");var IA=new AA.default;IA.post("/api/global/auditlogs/search",tr.auth.adminOnly,yA(),mA).get("/api/global/auditlogs/download",tr.auth.adminOnly,tr.middleware.querystringToBody,yA(),gA).get("/api/global/auditlogs/definitions",tr.auth.adminOnly,hA);var wA=IA;var Ru=require("@budibase/backend-core"),xu=require("@budibase/types");async function SA(e){e.body={encryptionKeyAvailable:mt.isEncryptionKeyAvailable()}}n(SA,"status");async function vA(e){e.body={variables:await mt.fetch()}}n(vA,"fetch");async function TA(e){let{name:t,production:r,development:a}=e.request.body;await mt.update(t,{production:r,development:a});let o=[xu.Environment.PRODUCTION];r!==a&&o.push(xu.Environment.DEVELOPMENT),await Ru.events.environmentVariable.created(t,o),e.body={message:`Environment variable "${t}" created.`}}n(TA,"create");async function xA(e){let{production:t,development:r}=e.request.body,a=e.params.varName;await mt.update(a,{production:t,development:r}),e.body={message:`Environment variable "${a}" updated.`}}n(xA,"update");async function RA(e){let t=e.params.varName;await mt.remove(t),await Ru.events.environmentVariable.deleted(t),e.body={message:`Environment variable "${t}" deleted.`}}n(RA,"destroy");var rr=require("@budibase/backend-core"),_A=G(require("@koa/router")),jn=G(require("joi"));var CA=new _A.default;function EA(){return rr.auth.joiValidator.body(jn.default.object({name:jn.default.string().optional(),production:jn.default.string().required(),development:jn.default.string().required()}))}n(EA,"buildEnvVarUpdateValidator");CA.get("/api/env/variables/status",rr.auth.builderOrAdmin,SA).get("/api/env/variables",rr.auth.builderOrAdmin,vA).post("/api/env/variables",rr.auth.builderOrAdmin,EA(),TA).patch("/api/env/variables/:varName",rr.auth.builderOrAdmin,EA(),xA).delete("/api/env/variables/:varName",rr.auth.builderOrAdmin,RA);var OA=CA;var gt=require("@budibase/backend-core"),xt=require("@budibase/types"),GA=G(require("@koa/router")),Ce=G(require("joi"));var LA=require("@budibase/backend-core");async function PA(e){let t=e.request.body;if(t.name=t.name.trim(),delete t.roles,t._id){let a=await Er(t._id);t.roles=a.roles,t.scimInfo=a.scimInfo}let r=await Wa(t);e.body={_id:r.id,_rev:r.rev}}n(PA,"save");async function qA(e){let t=e.params.groupId,r=e.request.body.add,a=e.request.body.remove;(r&&!Array.isArray(r)||a&&!Array.isArray(a))&&e.throw(400,"Must supply a list of users to add or to remove");let o,s;r&&(o=await $a(t,r)),a&&(s=await Xs(t,a)),e.body={added:o,removed:s}}n(qA,"updateGroupUsers");async function UA(e){let t=e.params.groupId,r=e.request.body.add,a=e.request.body.remove;(r&&!Array.isArray(r)||a&&!Array.isArray(a))&&e.throw(400,"Must supply a list of objects, with appId and roleId to add or remove"),e.body=await Zs(t,{appsToAdd:r,appsToRemove:a})}n(UA,"updateGroupApps");async function kA(e){e.body={data:await qn()}}n(kA,"fetch");async function DA(e){let{groupId:t,rev:r}=e.params;try{await Js(t,r),e.body={message:"Group deleted successfully"}}catch(a){e.throw(a.status,a)}}n(DA,"destroy");async function MA(e){try{e.body=await Er(e.params.groupId)}catch(t){e.throw(t.status,t)}}n(MA,"find");async function BA(e){let{pageSize:t=10,bookmark:r,emailSearch:a}=e.request.query,o=e.params.groupId,s={limit:t+1},i=await oa(o,{...s,emailSearch:a,bookmark:r}),u=a?i[t]?.email:i[t]?._id,c=!!u;e.body={users:i.slice(0,t),bookmark:u,hasNextPage:c}}n(BA,"searchUsers");async function NA(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 a=await LA.csv.jsonFromCsvString(r,{allowSingleColumn:!0});(!a||a.length===0)&&e.throw(400,"CSV file is invalid");let s=Object.keys(a[0]).find(y=>/^(email|e-mail|email address|mail|e_mail)$/i.test(y.trim()));s||e.throw(400,"CSV file must contain an email column");let i=Array.from(new Set(a.map(y=>y[s]).filter(y=>y&&typeof y=="string"&&y.trim().length>0).map(y=>y.trim())));i.length===0&&e.throw(400,"No valid email addresses found in CSV");try{await Er(t)}catch(y){if(y.status===404)e.throw(404,"Group not found");else throw y}let u=[],c=[],d=[],m=await Promise.all(i.map(y=>Ne.getUserByEmail(y)));for(let y of i){let g=m.find(T=>T?.email===y);g?(u.push({_id:g._id,email:g.email}),d.push(g._id)):c.push({email:y,reason:"User not found"})}d.length>0&&await $a(t,d),e.body={added:u,skipped:c}}n(NA,"bulkAddUsersFromCsv");var FA=new GA.default;function uN(){return gt.auth.joiValidator.body(Ce.default.object({_id:Ce.default.string().optional(),_rev:Ce.default.string().optional(),color:Ce.default.string().required(),icon:Ce.default.string().required(),name:Ce.default.string().trim().required().max(50),role:Ce.default.string().optional(),users:Ce.default.array().optional(),apps:Ce.default.array().optional(),roles:Ce.default.object().optional(),createdAt:Ce.default.string().optional(),updatedAt:Ce.default.string().optional()}).required())}n(uN,"buildGroupSaveValidation");FA.post("/api/global/groups",gt.auth.adminOnly,Se.requireFeature(xt.Feature.USER_GROUPS),uN(),PA).get("/api/global/groups",Se.requireFeature(xt.Feature.USER_GROUPS),kA).delete("/api/global/groups/:groupId/:rev",Se.requireFeature(xt.Feature.USER_GROUPS),gt.auth.adminOnly,Wn("groupId"),DA).get("/api/global/groups/:groupId",Se.requireFeature(xt.Feature.USER_GROUPS),gt.auth.builderOrAdmin,MA).get("/api/global/groups/:groupId/users",Se.requireFeature(xt.Feature.USER_GROUPS),gt.auth.builderOrAdmin,BA).post("/api/global/groups/:groupId/users",gt.auth.adminOnly,Se.requireFeature(xt.Feature.USER_GROUPS),Wn("groupId"),qA).post("/api/global/groups/:groupId/users/bulk",gt.auth.adminOnly,Se.requireFeature(xt.Feature.USER_GROUPS),Wn("groupId"),gt.auth.joiValidator.body(Ce.default.object({csvContent:Ce.default.string().required()}).required()),NA).post("/api/global/groups/:groupId/apps",gt.auth.builderOrAdmin,Se.requireFeature(xt.Feature.USER_GROUPS),UA);var WA=FA;var yI=G(require("@koa/router"));var yo=require("scim-patch");var jA=require("@budibase/backend-core");function $A(e,t){let r=e.request.query[t];if(r!==void 0)return+r}n($A,"tryGetQueryAsNumber");var QA=n(async e=>{let t=$A(e,"pageSize")??20,r=$A(e,"startIndex"),a;e.request.query.filter&&(a=ce.user.userFilters(e.request.query.filter));let o=await Ue.get({pageSize:t,skip:r,filters:a});e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:o.total,Resources:o.users.map(ce.user.toScimUserResponse),startIndex:(r||0)+1,itemsPerPage:t}},"get"),KA=n(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404);let r=await Ue.find(t);e.body=ce.user.toScimUserResponse(r)},"find"),HA=n(async e=>{let t=ce.user.fromScimUser(e.request.body);try{let r=await Ue.create(t);e.body=ce.user.toScimUserResponse(r)}catch(r){throw r instanceof jA.EmailUnavailableError&&e.throw(409,"Email already in use"),r}},"create");function cN(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}n(cN,"isDeactivation");var YA=n(async e=>{let t=await Ue.find(e.params.id);t||e.throw(404);let r=ce.user.toScimUserResponse(t),a=e.request.body;try{(0,yo.patchBodyValidation)(a)}catch{}if(cN(a))return Eu(e);let o;try{o=(0,yo.scimPatch)(r,a.Operations)}catch{}o||e.throw(500);let s=ce.user.fromScimUser(o);await Ue.update(s,{allowChangingEmail:!0}),e.body=ce.user.toScimUserResponse(s)},"update"),Eu=n(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404),await Ue.remove(t),e.status=204},"remove");var cI=G(uI()),pI=require("@budibase/shared-core"),bo=require("scim-patch");var Ao=require("scim2-parse-filter");function lI(e,t){for(let r of t.split(","))delete e[r]}n(lI,"cleanResponse");var dI=n(async e=>{let r=(await re.fetch()).filter(s=>s.scimInfo?.isSync).map(ce.group.toScimGroupResponse),{filter:a,excludedAttributes:o}=e.request.query;if(a){let s=(0,Ao.filter)((0,Ao.parse)(a));r=r.filter(s)}o&&r.forEach(s=>{lI(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"),fI=n(async e=>{let t=ce.group.fromScimGroup(e.request.body),r=await Ur.create(t);e.body=ce.group.toScimGroupResponse(r)},"create"),mI=n(async e=>{let{id:t}=e.params,r=await re.get(t),a=ce.group.toScimGroupResponse(r),{excludedAttributes:o}=e.request.query;o&&lI(a,o),e.body=a},"find"),gI=n(async e=>{let{id:t}=e.params,r=await re.get(t);await re.remove(t,r._rev),e.status=204},"remove"),hI=n(async e=>{let{id:t}=e.params,r=await re.get(t),a=ce.group.toScimGroupResponse(r),o=e.request.body;try{(0,bo.patchBodyValidation)(o)}catch{e.throw(400)}let{true:s,false:i}=(0,cI.default)(o.Operations,u=>u.path==="members");if(i?.length){let u=(0,bo.scimPatch)(a,i);u||e.throw(500);let c={...ce.group.fromScimGroup(u),_rev:r._rev};await re.save(c)}if(s?.length){let u=[],c=[];for(let{op:d,value:m}of s)switch(d){case"add":case"Add":for(let y of m)u.push(await Ue.find(y.value));break;case"remove":case"Remove":for(let y of m)try{c.push(await Ue.find(y.value))}catch(g){if(g.status!==404)throw g}break;case"replace":case"Replace":throw new Error("Replacing members is not allowed");default:pI.utils.unreachable(d)}u.length&&await re.addUsers(t,u.map(d=>d._id)),c.length&&await re.removeUsers(t,c.map(d=>d._id))}e.body=ce.group.toScimGroupResponse(await re.get(t))},"update");var Qn=require("@budibase/types"),Fe=new yI.default({prefix:"/api/global/scim/v2"});Fe.use(bu);Fe.use(yu);Fe.get("/users",QA);Fe.get("/users/:id",Gn("id"),KA);Fe.post("/users",HA);Fe.patch("/users/:id",Gn("id"),YA);Fe.delete("/users/:id",Gn("id"),Eu);Fe.get("/groups",dI);Fe.post("/groups",Se.requireFeature(Qn.Feature.USER_GROUPS),fI);Fe.get("/groups/:id",Se.requireFeature(Qn.Feature.USER_GROUPS),Fn("id"),mI);Fe.delete("/groups/:id",Se.requireFeature(Qn.Feature.USER_GROUPS),Fn("id"),gI);Fe.patch("/groups/:id",Se.requireFeature(Qn.Feature.USER_GROUPS),Fn("id"),hI);var bI=Fe;var ce={};_(ce,{group:()=>Ou,user:()=>Cu});var Cu={};_(Cu,{fromScimUser:()=>MN,toScimUserResponse:()=>UN,userFilters:()=>BN});var AI=require("@budibase/backend-core"),II=require("@budibase/shared-core"),Io=require("@budibase/types"),wI=require("scim2-parse-filter");var{unreachable:qN}=II.utils,UN=n(e=>{let{isSync:t,roles:r,...a}=e.scimInfo||{},o={...a,schemas:["urn:ietf:params:scim:schemas:core:2.0:User"],id:e._id,meta:{resourceType:"User",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},active:e.status===Io.UserStatus.ACTIVE};(e.firstName||e.lastName)&&(o.name={formatted:[e.firstName,e.lastName].filter(i=>i).join(" "),familyName:e.lastName,givenName:e.firstName});let s="urn:ietf:params:scim:schemas:extension:enterprise:2.0:User";if(o[s]?.manager){let i=o[s].manager;typeof i=="string"&&(o[s].manager={value:i})}return o},"toScimUserResponse"),kN=n(e=>!!e?.id,"isScimUserResponse");function DN(e){if(AI.utils.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}n(DN,"tryGetEmail");var MN=n(e=>{let t=kN(e)?e:void 0,r=DN(e);if(!r)throw new Error("Email is required");let a;switch(e.active){case"True":case"true":case!0:a=!0;break;case"False":case"false":case!1:a=!1;break;default:qN(e.active)}let o,s;return e.name?.givenName?(o=e.name?.givenName,s=e.name?.familyName):o=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:o,lastName:s,scimInfo:{...e,isSync:!0},roles:{},status:a?Io.UserStatus.ACTIVE:Io.UserStatus.INACTIVE,createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimUser"),BN=n(e=>{let t={equal:{}},r=(0,wI.parse)(e);function a(o){switch(o.op){case"eq":{let s=o.attrPath,i;switch(s){case"emails.value":i="email";break;default:i=`scimInfo.${s}`}t.equal[i]=o.compValue;break}case"and":for(let s of o.filters)a(s);break;default:console.warn("Filter not handled",{filter:o})}}return n(a,"parseFilters"),a(r),t},"userFilters");var Ou={};_(Ou,{fromScimGroup:()=>FN,toScimGroupResponse:()=>NN});var NN=n(e=>({schemas:["urn:ietf:params:scim:schemas:core:2.0:Group"],id:e._id,externalId:e.scimInfo.externalId,meta:{resourceType:"Group",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},displayName:e.name,members:e.users?.map(t=>({value:t._id}))}),"toScimGroupResponse"),GN=n(e=>!!e?.id,"isScimGroup"),FN=n(e=>{let t=GN(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 Zu={};_(Zu,{LLM:()=>ht,LLMRequest:()=>se,TableGeneration:()=>Xu,agentHistoryTitleSystemPrompt:()=>e0,agentSystemPrompt:()=>ZN,aiColumnSchemas:()=>zu,aiTableResponseToTableSchema:()=>Ku,appendAIColumns:()=>Hu,classifyText:()=>qu,cleanData:()=>Uu,composeAutomationAgentSystemPrompt:()=>JN,composeAutomationAgentToolGuidelines:()=>XN,createLiteLLMOpenAI:()=>LI,extractFileData:()=>HN,generateAIColumns:()=>ju,generateCode:()=>zN,generateCronExpression:()=>ku,generateData:()=>Qu,generateJs:()=>Nu,generateSQL:()=>VN,generateTables:()=>$u,generationStructure:()=>Vu,getChatLLM:()=>DI,getLLM:()=>Yn,getLLMConfig:()=>Wu,getLLMOrThrow:()=>kI,getLiteLLMProvider:()=>CI,getLiteLLMProviderOptions:()=>OI,normalizeContentType:()=>Lu,parseResponseFormat:()=>So,sanitiseToolName:()=>WN,searchWeb:()=>Bu,sentimentAnalysis:()=>Mu,summarizeText:()=>wo,tableDataStructuredOutput:()=>Ju,translate:()=>Du});var Kn=require("@budibase/types");function WN(e){if(e.length>64)throw new Error("Tool name must be under 64 characters long");return e.replace(/[^a-zA-Z0-9_-]/g,"_")}n(WN,"sanitiseToolName");function Lu(e){return e?e.includes("/")?e:{[Kn.SupportedFileType.PDF]:"application/pdf",[Kn.SupportedFileType.JPG]:"image/jpeg",[Kn.SupportedFileType.JPEG]:"image/jpeg",[Kn.SupportedFileType.PNG]:"image/png"}[e.toLowerCase()]||"application/octet-stream":"application/octet-stream"}n(Lu,"normalizeContentType");var _o=require("@budibase/types");var yt=require("@budibase/backend-core"),PI=require("@budibase/types"),kr=require("dd-trace"),qI=require("zod");var TI=require("@budibase/types"),vo=G(require("openai"));var SI=require("@budibase/shared-core"),Bt=require("@budibase/types"),Nt=G(require("dd-trace"));function Pu(e,t){return t.map(r=>e[r]).join(" ")}n(Pu,"extractTextFromColumns");var ht=class{static{n(this,"LLM")}constructor({model:t,apiKey:r,maxTokens:a}){this._model=t,this._apiKey=r,this._maxTokens=a??parseInt(process.env.BUDIBASE_AI_MAX_PROMPT_TOKENS||"1000")}get model(){return this._model}get apiKey(){return this._apiKey}get maxTokens(){return this._maxTokens}async prompt(t){return await Nt.default.trace("prompt",async()=>{let r=typeof t=="string"?new se().addUserMessage(t):t,{messages:a,tokensUsed:o}=await Nt.default.trace("chatCompletion",()=>this.chatCompletion(r));return!a||a.length===0?{message:"",tokensUsed:o}:{message:a[a.length-1].content||"",tokensUsed:o}})}async chat(t){return await Nt.default.trace("chat",async()=>await this.chatCompletion(t))}async*chatStream(t){yield*this.chatCompletionStream(t)}async summarizeText(t){return Nt.default.trace("summarizeText",()=>this.prompt(wo(t)))}async generateCronExpression(t){return Nt.default.trace("generateCronExpression",()=>this.prompt(ku(t)))}async operation(t,r){return Nt.default.trace("operation",a=>{a.addTags({operation:t.operation,rowId:r.id});let o=this.promptForOperation(t,r);return this.prompt(o)})}promptForOperation(t,r){let{operation:a,column:o,columns:s,language:i,categories:u,prompt:c}=t;switch(a){case Bt.AIOperationEnum.SUMMARISE_TEXT:return wo(Pu(r,s));case Bt.AIOperationEnum.CLEAN_DATA:return Uu(r[o]);case Bt.AIOperationEnum.TRANSLATE:return Du(r[o],i);case Bt.AIOperationEnum.CATEGORISE_TEXT:if(!u)throw Error("No categories provided for categorise text operation. Please provide categories.");return qu(Pu(r,s),u.split(","));case Bt.AIOperationEnum.SENTIMENT_ANALYSIS:return Mu(r[o]);case Bt.AIOperationEnum.PROMPT:return c;case Bt.AIOperationEnum.SEARCH_WEB:return Bu(Pu(r,s));default:throw SI.utils.unreachable(a)}}async generateJs(t,r){return await Nt.default.trace("generateJs",async()=>{let{bindings:a=[],snippets:o=[]}=r||{};return await this.prompt(Nu(a,o).addUserMessage(t))})}};var Hn=(a=>(a.GPT_5_MINI="gpt-5-mini",a.GPT_5="gpt-5",a.GPT_5_NANO="gpt-5-nano",a))(Hn||{});function So(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}n(So,"parseResponseFormat");function vI(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}n(vI,"calculateBudibaseAICredits");var ke=class extends ht{constructor(r){super(r);this.client=this.getClient(r)}static{n(this,"OpenAI")}getVerbosityForModel(){if(Object.values(Hn).includes(this.model))return"low"}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new vo.default({apiKey:r.apiKey})}async uploadFile(r,a,o){let s=Lu(o);if(TI.ImageContentTypes.includes(s.toLowerCase())){let c;if(Buffer.isBuffer(r))c=r;else{let m=[];for await(let y of r)m.push(new Uint8Array(y));c=Buffer.concat(m)}let d=c.toString("base64");return`data:${s};base64,${d}`}let i=await(0,vo.toFile)(r,a);return(await this.client.files.create({file:i,purpose:"assistants"})).id}async chatCompletion(r){let a={model:this.model,messages:r.messages,max_completion_tokens:this._maxTokens,response_format:So(r.format)};if(Object.values(Hn).includes(this.model)){let i=this.getVerbosityForModel();i&&(a.verbosity=i),a.reasoning_effort="minimal"}let o=await this.client.chat.completions.create(a),s=o?.choices?.[0]?.message;if(s?.content)return{messages:[...r.messages,{role:s.role,content:s.content}],tokensUsed:vI(o.usage)};throw new Error("No response found")}async*chatCompletionStream(r){let a={model:this.model,messages:r.messages,max_tokens:this.maxTokens,response_format:So(r.format),stream:!0};try{let o=await this.client.chat.completions.create(a),s="",i=null;for await(let c of o){let d=c?.choices?.[0]?.delta;d&&(d.content&&(s+=d.content,yield{type:"content",content:d.content}),c.usage&&(i=c.usage))}let u=i?vI(i):0;s&&r.addMessage({role:"assistant",content:s}),yield{type:"done",messages:r.messages,tokensUsed:u}}catch(o){yield{type:"error",content:o.message}}}};var Gu=G(require("@anthropic-ai/sdk"));function $N(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}n($N,"calculateBudibaseAICredits");var To=class extends ht{constructor(r){super(r);this.client=new Gu.default({apiKey:r.apiKey})}static{n(this,"Anthropic")}firstTextBlock(r){for(let a of r.content)if(a.type==="text")return a.text}async uploadFile(r,a,o){throw new Error("File upload not supported for this LLM provider")}async chatCompletion(r){try{let a=await this.client.messages.create({model:this.model,messages:r.messages.map(({content:s})=>{if(s==null)return{role:"user",content:""};if(typeof s=="string")return{role:"user",content:s};let i="";for(let u of s)u.type==="text"?i+=u.text:["image_url","input_audio","file"].includes(u.type);return{role:"user",content:i}}),max_tokens:this.maxTokens}),o=this.firstTextBlock(a)||"";return{messages:[...r.messages,{role:"assistant",content:o}],tokensUsed:$N(a.usage)}}catch(a){throw a instanceof Gu.default.APIError&&console.error(`Anthropic Prompt failed with error ${a.name} and status: ${a.status}`),a}}async*chatCompletionStream(r){try{let a=await this.chatCompletion(r);if(a.messages.length>0){let o=a.messages[a.messages.length-1];o.content&&(yield{type:"content",content:o.content})}yield{type:"done",messages:a.messages,tokensUsed:a.tokensUsed}}catch(a){yield{type:"error",content:a.message}}}};var xI=require("openai");var xo=class extends ke{static{n(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 xI.AzureOpenAI({apiKey:t.apiKey,apiVersion:"2024-10-01-preview",baseURL:t.baseUrl})}getVerbosityForModel(){return Object.values(Hn).includes(this.model)?"medium":void 0}};var be=require("@budibase/backend-core"),RI=require("@budibase/types"),Fu=require("dd-trace");var Ro=class extends ht{static{n(this,"BudibaseAI")}async prompt(t){let r=await super.prompt(t);return r.tokensUsed&&await Ga(r.tokensUsed),r}async chat(t){let r=await super.chat(t);return r.tokensUsed&&await Ga(r.tokensUsed),r}async uploadFile(t,r,a){return be.env.SELF_HOSTED?this.uploadFileSelfHost(t,r,a):this.uploadFileCloud(t,r,a)}async uploadFileCloud(t,r,a){return new ke({apiKey:be.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).uploadFile(t,r,a)}async uploadFileSelfHost(t,r,a){let o;if(Buffer.isBuffer(t))o=t;else{let m=[];for await(let y of t)m.push(new Uint8Array(y));o=Buffer.concat(m)}let s=o.toString("base64");if(a&&RI.ImageContentTypes.includes(a.toLowerCase()))return`data:image/jpeg;base64,${s}`;if(!be.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let m=await _a();if(!m)throw new Error("No license key found");this._apiKey=m}let i=`${be.env.BUDICLOUD_URL}/api/ai/upload-file`,u={method:"POST",headers:{"Content-Type":"application/json",[be.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:s,filename:r,contentType:a})};console.debug("[BudibaseAI] uploadFileSelfHost - Making network call",{url:i,method:u.method,headers:u.headers,bodyKeys:["data","filename","contentType"],filename:r,contentType:a});let c=await Xn(i,u);if(console.debug("[BudibaseAI] uploadFileSelfHost - Network response",{url:i,status:c.status,statusText:c.statusText,ok:c.ok}),!c.ok)throw await be.HTTPError.fromResponse(c);return(await c.json()).fileId}async chatCompletion(t){return be.env.SELF_HOSTED?this.chatCompletionSelfHost(t):this.chatCompletionCloud(t)}async chatCompletionCloud(t){return await Fu.tracer.trace("chatCompletionCloud",async()=>await new ke({apiKey:be.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletion(t))}async chatCompletionSelfHost(t){return await Fu.tracer.trace("chatCompletionSelfHost",async r=>{if(!be.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(r.addTags({budicloudUrl:be.env.BUDICLOUD_URL}),!this._apiKey){let c=await _a();if(!c)throw new Error("No license key found");this._apiKey=c,r.addTags({licenseKey:this._apiKey})}let a={messages:t.messages,format:t.format},o=`${be.env.BUDICLOUD_URL}/api/ai/chat`,s={method:"POST",headers:{"Content-Type":"application/json",[be.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(a)};console.debug("[BudibaseAI] chatCompletionSelfHost - Making network call",{url:o,method:s.method,headers:s.headers,bodyKeys:Object.keys(a),messagesCount:t.messages.length,format:a.format});let i=await Xn(o,s);if(console.debug("[BudibaseAI] chatCompletionSelfHost - Network response",{url:o,status:i.status,statusText:i.statusText,ok:i.ok}),!i.ok)throw await be.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){be.env.SELF_HOSTED?yield*this.chatCompletionStreamSelfHost(t):yield*this.chatCompletionStreamCloud(t)}async*chatCompletionStreamCloud(t){yield*new ke({apiKey:be.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});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 a=r.messages[r.messages.length-1];a.content&&(yield{type:"content",content:a.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 EI=G(require("openai")),_I=require("@ai-sdk/openai");var Eo=class extends ke{static{n(this,"LiteLLMAI")}getClient(t){if(!t.apiKey)throw new Error("No LiteLLM API key found");return new EI.default({apiKey:t.apiKey,baseURL:t.baseUrl})}},CI=n(e=>{let[t]=e.split("/");return t||"openai"},"getLiteLLMProvider"),OI=n(e=>{if(e)return{openai:{parallelToolCalls:!0}}},"getLiteLLMProviderOptions"),LI=n(e=>{let{apiKey:t,baseUrl:r,fetch:a}=e,o={apiKey:t,baseURL:r,name:"litellm"};return a&&(o.fetch=a),(0,_I.createOpenAI)(o)},"createLiteLLMOpenAI");var UI={OpenAI:"gpt-5-mini",TogetherAI:"gpt-5-mini",AzureOpenAI:"gpt-4.1",Custom:"gpt-5-mini",Anthropic:"claude-3-5-sonnet-20240620",BudibaseAI:"gpt-5-mini"},jN={OpenAI:ke,TogetherAI:ke,AzureOpenAI:xo,Custom:ke,Anthropic:To,BudibaseAI:Ro};async function QN(){return await kr.tracer.trace("getAIConfig",async e=>{let t={type:PI.ConfigType.AI,config:{}};if(!yt.context.isSelfHostUsingCloud()){let a=await yt.configs.getAIConfig();a&&(t=a)}await Fs(t);let r=Object.values(t.config).find(a=>a.active&&a.isDefault);if(!r){e.addTags({enabled:!1,reason:"no provider found"});return}return e.addTags({enabled:!0}),{provider:r.provider,model:r.defaultModel||UI[r.provider],apiKey:r.apiKey,baseUrl:r.baseUrl}})}n(QN,"getAIConfig");async function KN(){return kr.tracer.trace("getSelfHostOpenAIKeyConfig",e=>{if(!yt.env.SELF_HOSTED){e.addTags({enabled:!1,reason:"not self host"});return}if(!yt.env.OPENAI_API_KEY){e.addTags({enabled:!1,reason:"no OPENAI_API_KEY"});return}return e.addTags({enabled:!0}),{provider:"OpenAI",model:UI.OpenAI,apiKey:yt.env.OPENAI_API_KEY}})}n(KN,"getSelfHostOpenAIKeyConfig");async function Wu(){return kr.tracer.trace("getLLMConfig",async()=>await QN()||await KN())}n(Wu,"getLLMConfig");async function Yn(e){return await kr.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:a}=e||{},o=await Wu();if(!o){t.addTags({enabled:!1,reason:"no config found"});return}r&&(o.model=r),a&&(o.maxTokens=a);let s=jN[o.provider];if(!s){t.addTags({enabled:!1,reason:"no provider found",provider:o.provider});return}return new s(o)})}n(Yn,"getLLM");async function kI(){let e=await Yn();if(!e)throw new yt.HTTPError("No available LLM configurations",500);return e}n(kI,"getLLMOrThrow");async function DI(e){return await kr.tracer.trace("getChatLLM",async()=>new Eo(e))}n(DI,"getChatLLM");var se=class e{constructor(){this.messages=[]}static{n(this,"LLMRequest")}withFormat(t){return t instanceof qI.z.ZodType?this.format={type:"json_schema",json_schema:{name:"response",strict:!1,schema:t.toJSONSchema({target:"draft-7"})}}:this.format=t,this}addMessage(t){return this.messages.push(t),this}addMessages(t){return this.messages.push(...t),this}addUserMessage(t){return this.messages.push({role:"user",content:t}),this}addSystemMessage(t){return this.messages.push({role:"system",content:t}),this}static fromRequest(t){let r=new e;return t.messages&&r.addMessages(t.messages),t.format&&r.withFormat(t.format),r}};var Rt=require("zod");function wo(e,t){let r=`Summarize this text:
39
39
  ${e}`,a="";if(t)switch(t){case _o.SummariseLength.SHORT:a="In 1-2 concise sentences, ";break;case _o.SummariseLength.MEDIUM:a="In 2-3 paragraphs, ";break;case _o.SummariseLength.LONG:a="In multiple detailed paragraphs, ";break}return new se().addUserMessage(`${a}${r}.
40
40
  Only return the summary.`)}n(wo,"summarizeText");function HN(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/license.md ADDED
@@ -0,0 +1,49 @@
1
+ # Business Source License
2
+
3
+ License text copyright (c) 2020 MariaDB Corporation Ab, All Rights Reserved.
4
+
5
+ “Business Source License” is a trademark of MariaDB Corporation Ab.
6
+
7
+ ## Licensor
8
+
9
+ Budibase Ltd
10
+
11
+ ## Licensed Work
12
+
13
+ Budibase.
14
+
15
+ The Licensed Work is (c) 2026 Budibase Ltd.
16
+
17
+ ## Change Date
18
+
19
+ Four years from the date the Licensed Work is published
20
+
21
+ ## Change License
22
+
23
+ GPLv3
24
+
25
+ ## Additional use grant
26
+
27
+ Permission is hereby granted to use the Licensed Work in a Production Environment.
28
+
29
+ Conditions on Production Use: The right to use the Licensed Work in a Production Environment is null and void if the Source Code has been modified to circumvent, disable, or defeat license key verification or feature-gating mechanisms.
30
+
31
+ Exception for European Public Sector: The condition above does not apply to Public Sector Organizations located within Europe. These organizations are granted full Production Use rights regardless of modifications to license verification or feature gating logic.
32
+
33
+ ## Terms
34
+
35
+ The Licensor hereby grants you the right to copy, modify, create derivative works, redistribute, and make non-production use of the Licensed Work. The Licensor may make an Additional Use Grant, above, permitting limited production use.
36
+
37
+ Effective on the Change Date, or the fourth anniversary of the first publicly available distribution of a specific version of the Licensed Work under this License, whichever comes first, the Licensor hereby grants you rights under the terms of the Change License, and the rights granted in the paragraph above terminate.
38
+
39
+ If your use of the Licensed Work does not comply with the requirements currently in effect as described in this License, you must purchase a commercial license from the Licensor, its affiliated entities, or authorized resellers, or you must refrain from using the Licensed Work.
40
+
41
+ All copies of the original and modified Licensed Work, and derivative works of the Licensed Work, are subject to this License. This License applies separately for each version of the Licensed Work and the Change Date may vary for each version of the Licensed Work released by Licensor.
42
+
43
+ You must conspicuously display this License on each original or modified copy of the Licensed Work. If you receive the Licensed Work in original or modified form from a third party, the terms and conditions set forth in this License apply to your use of that work.
44
+
45
+ Any use of the Licensed Work in violation of this License will automatically terminate your rights under this License for the current and all other versions of the Licensed Work.
46
+
47
+ This License does not grant you any right in any trademark or logo of Licensor or its affiliates (provided that you may use a trademark or logo of Licensor as expressly required by this License).
48
+
49
+ TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND TITLE.
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "dist"
5
5
  ],
6
6
  "license": "UNLICENSED",
7
- "version": "3.27.3",
7
+ "version": "3.27.4",
8
8
  "description": "Budibase Pro (Backend)",
9
9
  "main": "dist/index.js",
10
10
  "types": "dist/index.d.ts",
@@ -71,5 +71,5 @@
71
71
  }
72
72
  }
73
73
  },
74
- "gitHead": "a2ccba6d3b5002fab734abfe9563b7cf2b3a6592"
74
+ "gitHead": "d0d77e2d7618885095e00c73cefcfefd8ad54877"
75
75
  }
package/LICENSE DELETED
@@ -1,9 +0,0 @@
1
- Copyright 2019-2023, Budibase Ltd.
2
-
3
- Each Budibase package has its own license, please check the license file in each package.
4
-
5
- You can consider Budibase to be GPLv3 licensed overall.
6
-
7
- The apps that you build with Budibase do not package any GPLv3 licensed code, thus do not fall under those restrictions.
8
-
9
- Budibase ships with Structured Query Server, by The Neighbourhoodie Software GmbH. This license for this can be found at ./SQS_LICENSE