@budibase/pro 3.12.10 → 3.12.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -35,7 +35,7 @@ d/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR
|
|
|
35
35
|
mwIDAQAB
|
|
36
36
|
-----END PUBLIC KEY-----
|
|
37
37
|
`;function Kr(e){return So.default.verify(e,yS,{algorithms:["RS256"]})}function AS(e,t){return So.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}var Ya={};w(Ya,{getFeatures:()=>wo});var l=require("@budibase/types");var bS={[l.PlanType.FREE]:[...ge.SELF_FREE_LICENSE.features],[l.PlanType.PREMIUM]:void 0,[l.PlanType.PREMIUM_PLUS]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.PREMIUM_PLUS_TRIAL]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.PRO]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS],[l.PlanType.TEAM]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS],[l.PlanType.BUSINESS]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.ENTERPRISE_BASIC]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.ENTERPRISE_BASIC_TRIAL]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.ENTERPRISE]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.BUDIBASE_AI]},IS={[l.PlanType.FREE]:[...ge.CLOUD_FREE_LICENSE.features],[l.PlanType.PREMIUM]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.PDF],[l.PlanType.PREMIUM_PLUS]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.BUDIBASE_AI,l.Feature.PDF],[l.PlanType.PREMIUM_PLUS_TRIAL]:[l.Feature.APP_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.BUDIBASE_AI,l.Feature.PDF],[l.PlanType.PRO]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.BRANDING],[l.PlanType.TEAM]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.BRANDING],[l.PlanType.BUSINESS]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.BUDIBASE_AI,l.Feature.PDF],[l.PlanType.ENTERPRISE_BASIC]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF],[l.PlanType.ENTERPRISE_BASIC_TRIAL]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF],[l.PlanType.ENTERPRISE]:[l.Feature.USER_GROUPS,l.Feature.APP_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF]};function wo(e,t){let r=[];function a(n){let o=n[t];if(!o)throw new Error(`Features do not exist for planType=${t} and hosting=${e}`);return o}switch(e){case l.Hosting.SELF:r=a(bS);break;case l.Hosting.CLOUD:r=a(IS);break}return r}var Ha={};w(Ha,{UNLIMITED:()=>d,getQuotas:()=>To});var G=require("@budibase/types");var c=Ze,bp=ge,d=-1,Yr=e=>e*1e6,SS={[G.PlanType.FREE]:{...bp.CLOUD_FREE_LICENSE.quotas},[G.PlanType.PREMIUM]:{usage:{monthly:{...c.queries(d),...c.automations(1e3),...c.budibaseAICredits(0),...c.actions(d)},static:{...c.rows(1e4),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(0),...c.plugins(d),...c.customAIConfigurations(0)}},constant:{...c.automationLogRetentionDays(7),...c.appBackupRetentionDays(7)}},[G.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...c.queries(d),...c.automations(5e3),...c.budibaseAICredits(Yr(2)),...c.actions(d)},static:{...c.rows(25e3),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(0),...c.plugins(d),...c.customAIConfigurations(1)}},constant:{...c.automationLogRetentionDays(30),...c.appBackupRetentionDays(30)}},[G.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...c.queries(d),...c.automations(5e3),...c.budibaseAICredits(Yr(2)),...c.actions(d)},static:{...c.rows(25e3),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(0),...c.plugins(d),...c.customAIConfigurations(1)}},constant:{...c.automationLogRetentionDays(30),...c.appBackupRetentionDays(30)}},[G.PlanType.PRO]:{usage:{monthly:{...c.queries(d),...c.automations(1e3),...c.budibaseAICredits(0),...c.actions(d)},static:{...c.rows(d),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(5),...c.plugins(d),...c.customAIConfigurations(0)}},constant:{...c.automationLogRetentionDays(7),...c.appBackupRetentionDays(7)}},[G.PlanType.TEAM]:{usage:{monthly:{...c.queries(d),...c.automations(5e3),...c.budibaseAICredits(0),...c.actions(d)},static:{...c.rows(d),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(10),...c.plugins(d),...c.customAIConfigurations(0)}},constant:{...c.automationLogRetentionDays(30),...c.appBackupRetentionDays(90)}},[G.PlanType.BUSINESS]:{usage:{monthly:{...c.queries(d),...c.automations(1e4),...c.budibaseAICredits(0),...c.actions(d)},static:{...c.rows(5e4),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(50),...c.plugins(d),...c.customAIConfigurations(0)}},constant:{...c.automationLogRetentionDays(365),...c.appBackupRetentionDays(365)}},[G.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...c.queries(d),...c.automations(d),...c.budibaseAICredits(Yr(4)),...c.actions(d)},static:{...c.rows(d),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(d),...c.plugins(d),...c.customAIConfigurations(d)}},constant:{...c.automationLogRetentionDays(d),...c.appBackupRetentionDays(d)}},[G.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...c.queries(d),...c.automations(d),...c.budibaseAICredits(Yr(4)),...c.actions(d)},static:{...c.rows(d),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(d),...c.plugins(d),...c.customAIConfigurations(d)}},constant:{...c.automationLogRetentionDays(15),...c.appBackupRetentionDays(15)}},[G.PlanType.ENTERPRISE]:{usage:{monthly:{...c.queries(d),...c.automations(d),...c.budibaseAICredits(Yr(4)),...c.actions(d)},static:{...c.rows(d),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(d),...c.plugins(d),...c.customAIConfigurations(d)}},constant:{...c.automationLogRetentionDays(d),...c.appBackupRetentionDays(d)}}},wS={[G.PlanType.FREE]:{...bp.SELF_FREE_LICENSE.quotas},[G.PlanType.PREMIUM]:void 0,[G.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...c.queries(d),...c.automations(d),...c.budibaseAICredits(0),...c.actions(d)},static:{...c.rows(d),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(0),...c.plugins(d),...c.customAIConfigurations(1)}},constant:{...c.automationLogRetentionDays(30),...c.appBackupRetentionDays(30)}},[G.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...c.queries(d),...c.automations(d),...c.budibaseAICredits(0),...c.actions(d)},static:{...c.rows(d),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(0),...c.plugins(d),...c.customAIConfigurations(1)}},constant:{...c.automationLogRetentionDays(30),...c.appBackupRetentionDays(30)}},[G.PlanType.PRO]:{usage:{monthly:{...c.queries(d),...c.automations(d),...c.budibaseAICredits(0),...c.actions(d)},static:{...c.rows(d),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(5),...c.plugins(d),...c.customAIConfigurations(0)}},constant:{...c.automationLogRetentionDays(7),...c.appBackupRetentionDays(7)}},[G.PlanType.TEAM]:{usage:{monthly:{...c.queries(d),...c.automations(d),...c.budibaseAICredits(0),...c.actions(d)},static:{...c.rows(d),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(10),...c.plugins(d),...c.customAIConfigurations(0)}},constant:{...c.automationLogRetentionDays(30),...c.appBackupRetentionDays(90)}},[G.PlanType.BUSINESS]:{usage:{monthly:{...c.queries(d),...c.automations(d),...c.budibaseAICredits(0),...c.actions(d)},static:{...c.rows(d),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(50),...c.plugins(d),...c.customAIConfigurations(0)}},constant:{...c.automationLogRetentionDays(90),...c.appBackupRetentionDays(365)}},[G.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...c.queries(d),...c.automations(d),...c.budibaseAICredits(0),...c.actions(d)},static:{...c.rows(d),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(d),...c.plugins(d),...c.customAIConfigurations(d)}},constant:{...c.automationLogRetentionDays(d),...c.appBackupRetentionDays(d)}},[G.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...c.queries(d),...c.automations(d),...c.budibaseAICredits(0),...c.actions(d)},static:{...c.rows(d),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(d),...c.plugins(d),...c.customAIConfigurations(d)}},constant:{...c.automationLogRetentionDays(15),...c.appBackupRetentionDays(15)}},[G.PlanType.ENTERPRISE]:{usage:{monthly:{...c.queries(d),...c.automations(d),...c.budibaseAICredits(0),...c.actions(d)},static:{...c.rows(d),...c.apps(d),...c.users(d),...c.creators(d),...c.userGroups(d),...c.plugins(d),...c.customAIConfigurations(d)}},constant:{...c.automationLogRetentionDays(d),...c.appBackupRetentionDays(d)}}};function To(e,t){let r;function a(n){let o=n[t];if(!o)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return o}switch(e){case G.Hosting.SELF:r=a(wS);break;case G.Hosting.CLOUD:r=a(SS);break}return JSON.parse(JSON.stringify(r))}var Vt={};w(Vt,{appExists:()=>TS,encoding:()=>Kt});var Ip=require("@budibase/backend-core");async function TS(e){return(await Ip.db.getAllApps({all:!0,idsOnly:!0})).includes(e)}var Kt={};w(Kt,{base64ToObject:()=>ES,objectToBase64:()=>vS});function vS(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}function ES(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}var af=require("@budibase/types"),sr=require("@budibase/backend-core"),nf=P(Nl()),of=P(Jo());async function ex(e){await Te.save({offlineLicenseToken:e}),await Ct()}async function tx(){await Te.save({offlineLicenseToken:void 0}),await Ct()}async function sf(){return(await Te.get()).offlineLicenseToken}async function Xo(){let t=(await sr.installation.getInstall()).installId,r=sr.context.getTenantId(),a=await sr.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:a}}async function rx(){let e=await Xo();return Kt.objectToBase64(e)}function ax(e){return Kt.base64ToObject(e)}function uf(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}async function pf(e){let t=await Xo();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}function cf(e){let t=e.plan.type,r=af.Hosting.SELF,a=wo(r,t),n=To(r,t);return e.features=(0,nf.default)(e.features,a),e.quotas=(0,of.default)(e.quotas,n),e}async function Zo(){try{let e=await sf();if(e){let t=await Kr(e);return uf(t),await pf(t),cf(t)}}catch(e){console.error("Error retrieving offline license",e)}}var fa={};w(fa,{deleteDevLicense:()=>ux,getOfflineLicense:()=>sx,writeDevLicenseToDisk:()=>ix});var lf=require("@budibase/backend-core"),ts=require("path"),df=require("os"),Ot=P(require("fs"));var nx=lf.env.isTest()?".budibase-test":".budibase",es=(0,ts.join)((0,df.tmpdir)(),nx),ox="dev_license.txt",da=(0,ts.join)(es,ox);if(!Ot.default.existsSync(es))try{Ot.default.mkdirSync(es)}catch{}function sx(){try{if(Ot.default.existsSync(da)){let e=Ot.default.readFileSync(da,{encoding:"utf-8"});return Kr(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}function ix(e){console.log(`Writing license to: ${da}`),Ot.default.writeFileSync(da,e,{encoding:"utf-8"})}function ux(){Ot.default.rmSync(da,{force:!0})}var as=async()=>{if(rs.env.OFFLINE_MODE)return Zo();let e=await $t();return e||(e=fa.getOfflineLicense()),e},ns=e=>bo(e),os=()=>rs.env.SELF_HOSTED?ge.SELF_FREE_LICENSE:ge.CLOUD_FREE_LICENSE;var is={};w(is,{activateLicenseKey:()=>px,deleteLicenseKey:()=>cx,getLicenseKey:()=>dn});var ss=P(require("dd-trace"));async function px(e){await Io(e),await Te.save({licenseKey:e}),await Ct()}async function dn(){return await ss.default.trace("getLicenseKey",async e=>{let t=await Te.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}async function cx(){return await ss.default.trace("deleteLicenseKey",async()=>{await Te.save({licenseKey:void 0}),await Ct()})}var Lt=require("@budibase/backend-core"),fn=P(require("dd-trace")),ff=3600,Ct=async()=>{await hf(),await gf()},mf=async(e,t)=>{let{populateLicense:r=as,populateFreeLicense:a=os}=t||{};return await fn.default.trace("getCachedLicense",async n=>{let o=Lt.context.getLicense();if(o)return n.addTags({foundInContext:!0,features:o.features,plan:o.plan,quotas:o.quotas}),o;let s=Lt.tenancy.getTenantId(),i=await oo(),p=await i.get(s);return n.addTags({tenantId:s,foundInCache:!!p}),p?(n.addTags({foundInCache:!0,refreshedAt:p.refreshedAt,features:p.features,plan:p.plan,quotas:p.quotas}),p):(p=await fn.default.trace("populateLicense",async()=>await r(s)),n.addTags({populatedLicense:!!p}),p||(p=fn.default.trace("populateFreeLicense",()=>a(e,s)),n.addTags({populatedFreeLicense:!!p})),p.refreshedAt=new Date().toISOString(),n.addTags({refreshedAt:p.refreshedAt,features:p.features,plan:p.plan,quotas:p.quotas,expirySeconds:ff}),await i.store(s,p,ff),p)})};Lt.env.isJest()&&(mf=jest.fn());var gf=mf,hf=async()=>{let e=Lt.tenancy.getTenantId();await(await oo()).delete(e)};async function ie(e,t){Array.isArray(e)||(e=[e]),t||(t=await Pe.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}async function mn(e,t){if(!await ie(e,t))throw new et.FeatureDisabledError(`${e} is not currently enabled`,e)}async function us(e,t){if(!await ie(e,t)){let r=e.join(", ");throw new et.FeatureDisabledError(`${r} are not currently enabled`,r)}}function ye(e){return async(...t)=>(await mn(se.Feature.APP_BACKUPS),e(...t))}async function ps(){return ie(se.Feature.APP_BACKUPS)}async function cs(){return ie(se.Feature.BRANDING)}async function yf(){return ie(se.Feature.ENFORCEABLE_SSO)}async function dx(){return ie(se.Feature.SYNC_AUTOMATIONS)}async function fx(){return ie(se.Feature.TRIGGER_AUTOMATION_RUN)}async function Pt(){return ie(se.Feature.APP_BUILDERS)}async function gn(){return ie(se.Feature.AUDIT_LOGS)}async function ls(){return ie(se.Feature.USER_GROUPS)}function mx(){return ie(se.Feature.PWA)}async function tt(){return ie(se.Feature.EXPANDED_PUBLIC_API)}async function gx(e){if(et.env.ENABLE_SSO_MAINTENANCE_MODE||!await yf())return!1;let r;return e?.config?r=e.config:r=await et.configs.getSettingsConfig(),!!r.isSSOEnforced}var ds=async()=>{let e=se.Feature.SCIM,t=await ie(e),r=await et.configs.getSCIMConfig();if(!t||!r?.enabled)throw new et.FeatureDisabledError(`${e} is not currently enabled`,e);return!0};async function hx(){return ie(se.Feature.VIEW_PERMISSIONS)}async function yx(){return ie(se.Feature.VIEW_READONLY_COLUMNS)}var Ax={faviconUrl:void 0,faviconUrlEtag:void 0,emailBrandingEnabled:!0,testimonialsEnabled:!0,platformTitle:void 0,loginHeading:void 0,loginButton:void 0,metaDescription:void 0,metaImageUrl:void 0,metaTitle:void 0};async function bx(e){return await cs()?{faviconUrl:e.faviconUrl,faviconUrlEtag:e.faviconUrlEtag,emailBrandingEnabled:e.emailBrandingEnabled,testimonialsEnabled:e.testimonialsEnabled,platformTitle:e.platformTitle,loginHeading:e.loginHeading,loginButton:e.loginButton,metaDescription:e.metaDescription,metaImageUrl:e.metaImageUrl,metaTitle:e.metaTitle}:Ax}var ms={};w(ms,{enrichAIConfig:()=>fs});var Af=require("@budibase/backend-core"),Ix="budibase_ai";async function fs(e){if(Af.env.SELF_HOSTED)return e;for(let t of Object.values(e.config))if(t.provider==="BudibaseAI")return e;return e.config[Ix]={provider:"BudibaseAI",active:!0,isDefault:Object.keys(e.config).every(t=>!e.config[t].isDefault),defaultModel:process.env.BUDIBASE_AI_DEFAULT_MODEL||"gpt-4o-mini",name:"Budibase AI"},e}var Ke={};w(Ke,{addAction:()=>Ex,addApp:()=>Rx,addAutomation:()=>Px,addGroup:()=>hs,addPlugin:()=>As,addRow:()=>xx,addRows:()=>Ox,addUsers:()=>bn,bustCache:()=>co,decrement:()=>rt,decrementMany:()=>ma,getCurrentUsageValues:()=>Ku,getLicensedQuota:()=>If,getQuotaUsage:()=>vt,increment:()=>Ae,incrementBudibaseAICredits:()=>Sn,incrementMany:()=>Ut,removeApp:()=>_x,removeGroup:()=>ys,removePlugin:()=>bs,removeRow:()=>Cx,removeRows:()=>Lx,removeUsers:()=>lr,set:()=>gs,setAllUsage:()=>fo,setAppUsageValue:()=>lo,setUsage:()=>ju,setUsagePerApp:()=>Wu,updatePluginCount:()=>Is,updateUsage:()=>ur,usageLimitIsExceeded:()=>vx,utils:()=>_r});var yn=require("@budibase/types");var H=require("@budibase/types");var De=require("@budibase/backend-core");var ir=require("dd-trace"),Ae=(e,t,r)=>bf({change:1,name:e,type:t,opts:r}),Ut=e=>ir.tracer.trace("quotas.incrementMany",async()=>bf(e)),bf=async e=>await ir.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await ur(r.map(n=>({usageChange:n.change,name:n.name,type:n.type,opts:{dryRun:!0,suppressErrorLog:n.opts?.suppressErrorLog,id:n.opts?.id}})));let a=[];for(let n of r)await ir.tracer.trace("quotas.incrementMany.fn",async o=>{o.addTags({actionName:n.name,actionType:n.type,actionChange:n.change});let s=n.opts?.fn;s&&a.push(await s())});return await ur(r.map(n=>({usageChange:n.change,name:n.name,type:n.type,opts:{dryRun:!1,valueFn:n.opts?.valueFn,suppressErrorLog:n.opts?.suppressErrorLog,id:n.opts?.id}}))),a[0]}),rt=(e,t,r={})=>ur({usageChange:-1,name:e,type:t,opts:r}),ma=e=>{let t=Array.isArray(e)?e:[e];return ur(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},gs=async(e,t,r)=>ke.setUsage(r,e,t),Sx=(e,t,r)=>{if(e==H.QuotaUsageType.STATIC){let a=r.usageQuota.triggers;return a?a[t]||{}:{}}else{let a=ke.utils.getCurrentMonthString(),n=r.monthly[a].triggers;return n?n[t]||{}:{}}},wx=async(e,t,r,a)=>{try{await De.locks.doWithLock({type:H.LockType.TRY_ONCE,name:H.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let n={percentage:r,name:t.name};a&&(n.resetDate=a),await ft.triggerQuota(n)})}catch(n){De.logging.logAlert("Error triggering quota",n)}},Tx=async(e,t,r,a)=>{let n=await vt(),o=e===H.QuotaUsageType.MONTHLY?n.quotaReset:void 0,s=await Sx(e,t,n),i=a.triggers,p=r/a.value*100;p>100&&(p=100);for(let[m,f]of i.entries())if(p>=f&&a.value!==Ze.UNLIMITED){if(!s[f]){s[f]=new Date().toISOString();let g=i[m+1]||100;(!(p>=g)||p===f)&&await wx(t,a,p,o)}}else s[f]=void 0;return s},ur=async e=>{await ir.tracer.trace("quotas.updateUsage",async t=>{let r=De.tenancy.getTenantId(),a=Array.isArray(e)?e:[e];t.addTags({numActions:a.length,tenantId:r});let n,o,s=[],i={},p={},m={},f={};for(let g of a)await ir.tracer.trace("quotas.updateUsage.action",async S=>{S.addTags({actionName:g.name,actionType:g.type,actionUsageChange:g.usageChange});try{n=De.context.getAppId()}catch{}if(H.APP_QUOTA_NAMES.includes(g.name)&&!n)throw new Error("App context required for quota update");try{o=await If(H.QuotaType.USAGE,g.name,g.type),s.push(o);let{total:_,app:R,breakdown:E}=await ke.getCurrentUsageValues(g.type,g.name,g.opts?.id);_+=g.usageChange,R!=null&&(R+=g.usageChange),E!=null&&(E+=g.usageChange);let U={};if(g.opts?.dryRun||(U=await Tx(g.type,g.name,_,o),f={...f,[g.name]:U}),o.value!==Ze.UNLIMITED&&_>o.value&&g.usageChange>0)throw new De.UsageLimitError(`Licensed ${o.name} of ${o.value} has been exceeded`,o.name);if(_=Math.max(0,_),R&&(R=Math.max(0,R)),E&&(E=Math.max(0,E),m={...m,[g.name]:E}),!g.opts?.dryRun){let Oe=g.opts?.valueFn;Oe&&(_=await Oe(),R=_),i={...i,[g.name]:_},p={...p,[g.name]:R}}}catch(_){throw g.opts?.suppressErrorLog||console.error(`Error updating usage quotas for ${g.name}`,_),_}});let h=a.filter(g=>!g.opts?.dryRun).map(g=>({name:g.name,type:g.type,values:{total:i[g.name],app:p[g.name],breakdown:m[g.name],triggers:f[g.name]},opts:{...g.opts,tenantId:r}}));h.length>0&&await ke.setAllUsage(h)})},If=async(e,t,r)=>{let a=await Pe.getCachedLicense();if(!a){let n=De.tenancy.getTenantId();throw new Error("License not found for tenant id "+n)}if(r&&(0,H.isStaticQuota)(e,r,t))return a.quotas[e][r][t];if(r&&(0,H.isMonthlyQuota)(e,r,t))return a.quotas[e][r][t];if((0,H.isConstantQuota)(e,t))return a.quotas[e][t];throw new Error("Invalid quota type")},vx=async(e,t)=>{try{return await ur({usageChange:1,name:e,type:t,opts:{dryRun:!0}}),!1}catch(r){if(r.code===H.ErrorCode.USAGE_LIMIT_EXCEEDED)return!0;throw r}};var Ex=async e=>Ae(yn.MonthlyQuotaName.ACTIONS,yn.QuotaUsageType.MONTHLY,{fn:e});var pr=require("@budibase/types"),Sf=require("@budibase/backend-core"),wf=async()=>{let e=await Sf.db.getAllApps({dev:!0});return e?e.length:0},Rx=async(e,{appId:t}={})=>Ae(pr.StaticQuotaName.APPS,pr.QuotaUsageType.STATIC,{fn:e,valueFn:wf,id:t}),_x=async({appId:e}={})=>rt(pr.StaticQuotaName.APPS,pr.QuotaUsageType.STATIC,{valueFn:wf,id:e});var We=require("@budibase/types"),xx=async(e,{tableId:t}={})=>Ae(We.StaticQuotaName.ROWS,We.QuotaUsageType.STATIC,{fn:e,id:t}),Cx=async({tableId:e}={})=>rt(We.StaticQuotaName.ROWS,We.QuotaUsageType.STATIC,{id:e}),Ox=async(e,t,{tableId:r}={})=>Ut({change:e,name:We.StaticQuotaName.ROWS,type:We.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),Lx=async(e,{tableId:t}={})=>ma({change:e,name:We.StaticQuotaName.ROWS,type:We.QuotaUsageType.STATIC,opts:{id:t}});var An=require("@budibase/types"),Px=async(e,{automationId:t}={})=>Ae(An.MonthlyQuotaName.AUTOMATIONS,An.QuotaUsageType.MONTHLY,{fn:e,id:t});var cr=require("@budibase/types"),hs=async e=>Ae(cr.StaticQuotaName.USER_GROUPS,cr.QuotaUsageType.STATIC,{fn:e}),ys=async()=>rt(cr.StaticQuotaName.USER_GROUPS,cr.QuotaUsageType.STATIC);var yt=require("@budibase/types"),As=async e=>Ae(yt.StaticQuotaName.PLUGINS,yt.QuotaUsageType.STATIC,{fn:e}),bs=async()=>rt(yt.StaticQuotaName.PLUGINS,yt.QuotaUsageType.STATIC),Is=async e=>gs(yt.StaticQuotaName.PLUGINS,yt.QuotaUsageType.STATIC,e);var $e=require("@budibase/types"),ga=require("@budibase/backend-core");var bn=async(e,t,r)=>{let a=[{change:e,name:$e.StaticQuotaName.USERS,type:$e.QuotaUsageType.STATIC,opts:{fn:r,valueFn:ga.users.getUserCount}}];t>0&&a.push({change:t,name:$e.StaticQuotaName.CREATORS,type:$e.QuotaUsageType.STATIC,opts:{valueFn:ga.users.getCreatorCount}});let n=await Ut(a);return await $t(),n},lr=async(e,t)=>{let r=[{change:e,name:$e.StaticQuotaName.USERS,type:$e.QuotaUsageType.STATIC,opts:{valueFn:ga.users.getUserCount}}];t>0&&r.push({change:t,name:$e.StaticQuotaName.CREATORS,type:$e.QuotaUsageType.STATIC,opts:{valueFn:ga.users.getCreatorCount}}),await ma(r),await $t()};var In=require("@budibase/types"),Sn=async e=>Ut({change:e,name:In.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:In.QuotaUsageType.MONTHLY});var at={};w(at,{addAppBuilder:()=>Bx,db:()=>Ve,removeAppBuilder:()=>Mx});var ya=require("@budibase/backend-core");var j={};w(j,{addAppBuilder:()=>Es,addUsers:()=>ws,adjustGroupCreatorsQuotas:()=>Nx,cleanupApp:()=>Dx,enrichUserRolesFromGroups:()=>qx,fetch:()=>ha,get:()=>qt,getBulk:()=>Cf,getGroupBuilderAppIds:()=>xf,getGroupRoleId:()=>Ux,remove:()=>Ss,removeAppBuilder:()=>Rs,removeUsers:()=>Ts,save:()=>dr,updateGroupApps:()=>vs});var x=require("@budibase/backend-core");var Tf=require("@budibase/backend-core"),wn=class extends Tf.HTTPError{constructor(t){super(`Group name "${t}" is unavailable`,409)}};async function Rf(e,t){try{let r=[];for(let i of e)if(i.roles){let p=i.roles[x.db.getProdAppID(t)];p&&r.push(p)}let a=await Promise.all(r.map(async i=>({[i]:await x.roles.roleToNumber(i)}))),n,o,s={};a.forEach(i=>{let[p,m]=Object.entries(i)[0];s[p]={roleId:p,roleNum:m}});for(let{roleId:i,roleNum:p}of Object.values(s))(o===void 0||p>o)&&(o=p,n=i);return n}catch(r){throw x.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}async function _f(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await M.getBulk(e,{enriched:!1}),t}async function xf(e,t){if(!e.userGroups)return[];let r=await _f(e.userGroups,t?.groups),a=t?.appId?x.db.getProdAppID(t?.appId):null,n=[];for(let o of r){let s=o.builder?.apps;a&&s?.includes(a)?n.push(a):a||(n=n.concat(s||[]))}return[...new Set(n)]}async function Ux(e,t,r){if(!e.userGroups)return null;let a=await _f(e.userGroups,r?.groups),n=x.db.getProdAppID(t);return e.roles?.[n]?e.roles[n]:(a=a.filter(o=>o?.roles?Object.keys(o.roles).includes(n):!1),await Rf(a,t))}async function qx(e){if(!e||!e.userGroups)return e;let t=await Cf(e.userGroups,{enriched:!1}),r=[];for(let n of t)n?.roles&&(r=r.concat(Object.keys(n.roles)));r=[...new Set(r)];for(let n of r)await x.context.doInAppContext(n,async()=>{if(e.roles[n])return;let o=await Rf(t,n);o&&(e.roles[n]=o)});let a=await xf(e,{groups:t});if(a.length&&!e.builder?.global){let n=e.builder?.apps||[];e.builder={apps:n.concat(a)}}return e}async function ha(){return await M.fetch()}async function qt(e){return await M.get(e)}async function Cf(e,t={enriched:!0}){return await M.getBulk(e,t)}async function vf(e){if(await M.getByName(e))throw new wn(e)}async function Ef(e){let t=await M.getGroupUsers(e._id);if(!t.length)return 0;let a=await x.tenancy.getGlobalDB().getMultiple(t.map(o=>o._id));return(await x.userUtils.creatorsInList(a)).filter(o=>o).length}async function dr(e){let t=[],r=!e._id,a=0;if(delete e.users,!e._id)e._id=M.generateUserGroupID(),await vf(e.name),t.push(x.events.group.created(e));else{let o=await M.get(e._id);if(o.name!==e.name&&await vf(e.name),t.push(x.events.group.updated(e)),JSON.stringify(o.roles)!==JSON.stringify(e.roles)){let s=o.users?.length||0,i=0;s>0&&(i=await Ef(o)),Object.values(e.roles).includes("CREATOR")?a=s-i:a=-s,t.push(x.events.group.permissionsEdited(e))}}await Promise.all(t);let n=()=>M.save(e);if(r)return await hs(n);{let o=await n();if(a>0)await bn(0,a);else if(a<0){let s=await Ef(e),i=Math.abs(a)-s;i>0&&await lr(0,i)}return o}}async function Ss(e,t){let r;try{r=await M.get(e)}catch{throw new Error("Group not found")}let a=Object.values(r.roles||{}).includes("CREATOR"),n=()=>{};if(a){let s=x.tenancy.getGlobalDB(),i=await M.getGroupUsers(e),m=(await Promise.all(i.map(S=>s.get(S._id)))).map(S=>({...S,userGroups:S.userGroups.filter(O=>O!==e)})),h=(await x.userUtils.creatorsInList(m)).filter(S=>S).length,g=i.length-h;g&&(n=()=>lr(0,g))}let o=await M.destroy(e,t);return await x.events.group.deleted(r),await ys(),await n(),o}async function ws(e,t){let r=await M.get(e),a=await x.users.bulkGetGlobalUsersById(t),n=[];for(let p of a)p.userGroups||(p.userGroups=[]),p.userGroups.includes(e)||n.push(p);if(!n.length)return n;let o=n.map(p=>({...p,userGroups:[...p?.userGroups||[],e]}));if(await x.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes("CREATOR")){let m=(await x.userUtils.creatorsInList(n)).filter(h=>h).length,f=n.length-m;f&&await bn(0,f)}let i=[];for(let p of t)i.push(x.cache.user.invalidateUser(p));return await Promise.all(i),await x.events.group.usersAdded(o.length,r),o}async function Ts(e,t){let r=await M.get(e),a=await x.users.bulkGetGlobalUsersById(t),n=[];for(let i of a){if(!i.userGroups||!i.userGroups.includes(e))continue;let p=i.userGroups.indexOf(e);i.userGroups.splice(p,1),n.push(i)}if(await x.users.bulkUpdateGlobalUsers(n),Object.values(r.roles||{}).includes("CREATOR")){let p=(await x.userUtils.creatorsInList(n)).filter(f=>f).length,m=n.length-p;m&&await lr(0,m)}let s=[];for(let i of t)s.push(x.cache.user.invalidateUser(i));return await Promise.all(s),n.length&&await x.events.group.usersDeleted(n.length,r),n}async function vs(e,t){let r=await qt(e);if(r.roles||(r.roles={}),t.appsToAdd)for(let a of t.appsToAdd)r.roles[a.appId]=a.roleId;if(t.appsToRemove)for(let a of t.appsToRemove)delete r.roles[a.appId];return await dr(r)}async function Dx(e){let t=await ha(),r=[];for(let a of t)!a.roles||!a.roles[e]||(delete a.roles[e],r.push(a));return await M.bulkSave(r)}async function Es(e,t){if(!await Pt())throw new Error("Feature not enabled, please check license");let r=x.db.getProdAppID(t),a=await qt(e);a.builder??={apps:[]},a.builder.apps.includes(t)||(a.builder.apps.push(r),await dr(a))}async function Rs(e,t){if(!await Pt())throw new Error("Feature not enabled, please check license");let r=x.db.getProdAppID(t),a=await qt(e);a.builder?.apps.includes(t)&&(a.builder.apps=a.builder.apps.filter(n=>n!==r),await dr(a))}async function Nx(){if(!await ls()){let e=x.tenancy.getGlobalDB(),r=(await ha()||[]).filter(a=>Object.values(a?.roles||{}).includes("CREATOR"));for(let a of r){let n=await M.getGroupUsers(a._id),s=(await Promise.all(n.map(f=>e.get(f._id)))).map(f=>({...f,userGroups:f.userGroups.filter(h=>h!==a._id)})),p=(await x.userUtils.creatorsInList(s)).filter(f=>f).length,m=n.length-p;await M.save({...a,roles:{}}),m&&await lr(0,m)}}}ya.users.UserDB.init(Ke,j,qe);var Ve=ya.users.UserDB;async function Bx(e,t){if(!await Pt())throw new Error("Feature not enabled, please check license");await ya.users.addAppBuilder(e,t)}async function Mx(e,t){if(!await Pt())throw new Error("Feature not enabled, please check license");await ya.users.removeAppBuilder(e,t)}var En={};w(En,{logs:()=>Us});var Us={};w(Us,{logSearch:()=>Vx,oldestLogDate:()=>Nf,storeLog:()=>Yx});var Df=require("@budibase/types"),vn=require("@budibase/backend-core");var Tn=require("@budibase/types");var Z=require("@budibase/backend-core");var Of=require("@budibase/backend-core");async function Lf(e,t){let r,a=5,n=!1,o,s=!0;for(;a>0;a--)try{s?o=await e():o=await exports.randomDelay(e),n=!0;break}catch(i){r=i}return n||Of.logging.logWarn(`Failed to backoff: ${t}`,r),o}var{SEPARATOR:nt,UNICODE_MAX:Gx,DocumentType:Pf,AutomationViewMode:_s,ViewName:kx,getQueryIndex:Fx}=Z.db,Qx=new Date(0).toISOString(),jx=100,xs=async()=>ja(Tn.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS);function Uf(e,t,{status:r,automationId:a}={},n={}){let o=a?`${a}${nt}`:"",s=r?`${r}${nt}`:"",i;return r&&a?i=`${_s.ALL}${nt}${s}${o}`:r?i=`${_s.STATUS}${nt}${s}`:a?i=`${_s.AUTOMATION}${nt}${o}`:i=`${Pf.AUTOMATION_LOG}${nt}`,{...n,descending:!0,startkey:`${i}${t}${Gx}`,endkey:`${i}${e}`}}function Wx(e,t,r){return`${Pf.AUTOMATION_LOG}${nt}${e}${nt}${r}${nt}${t}`}async function Cs(e,t,r={docs:!0}){let a=Z.context.getProdAppDB();await a.exists()||(a=Z.context.getDevAppDB());let n={status:r.status},o=r?.limit?r.limit:r?.paginate?9+1:void 0,s=Uf(e,t,n,{include_docs:r.docs,limit:o});r?.page&&(s.startkey=r.page);let i=await a.allDocs(s);return Cr(i,{paginate:r?.paginate,pageSize:9})}async function Os(e,t,r={}){let a=Z.context.getProdAppDB();await a.exists()||(a=Z.context.getDevAppDB());let n;try{let o={automationId:r?.automationId,status:r?.status},s=Uf(e,t,o,{include_docs:!0,limit:9+1});r?.page&&(s.startkey=r.page),n=await a.query(Fx(kx.AUTOMATION_LOGS),s)}catch(o){if(o!=null&&(o.name==="not_found"||o.error==="not_found"))return await ap(),Os(e,t,r);throw o}return Cr(n,{paginate:!0,pageSize:9})}async function qf(e,t){let r=Z.context.getProdAppDB(),a=e._id,n=e.name,o=new Date().toISOString(),s=Wx(o,t.status,a),i={...t,automationId:a,status:t.status,automationName:n,createdAt:o,_id:s};return await r.put(i),s}async function Ls(e,{clearing:t}={clearing:!1}){let r=Z.context.getProdAppDB();await Lf(async()=>{let a=await r.get(Z.db.DocumentType.APP_METADATA);for(let n of e){let o=n.split(Z.db.SEPARATOR),s=`${o[o.length-3]}${Z.db.SEPARATOR}${o[o.length-2]}`,i={};a.automationErrors&&(i=a.automationErrors),Array.isArray(i[s])||(i[s]=[]);let p=i[s].indexOf(n);t&&p!==-1?i[s].splice(p,1):i[s].push(n),i[s].length===0&&delete i[s],a.automationErrors=i}await r.put(a),await Z.cache.app.invalidateAppMetadata(a.appId,a)},"Failed to update app metadata with automation log error")}async function $x(){let e=await xs();try{return await Cs(Qx,e,{docs:!1,paginate:!1,limit:jx})}catch{return{data:[],hasNextPage:!1}}}async function Ps(){let e=Z.context.getProdAppDB();try{let t=await $x();if(!t.data||t.data.length===0)return;let r=t.data.map(n=>({_id:n.id,_rev:n.value.rev,_deleted:!0})),a=t.data.filter(n=>{let o=n.id.split(Z.db.SEPARATOR);return o[o.length-1]===Tn.AutomationStatus.ERROR}).map(n=>n.id);await e.bulkDocs(r),a.length&&await Ls(a,{clearing:!0})}catch(t){Z.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}var Nf=xs;async function Kx(e,t,r,a){let n,o=new Date().toISOString(),s=await Nf();return(!e||e<s)&&(e=s),r||t?n=await Os(e,o,{automationId:r,status:t,page:a}):n=await Cs(e,o,{status:t,page:a,docs:!0,paginate:!0}),n}async function Vx(e){return await Ps(),await Kx(e.startDate,e.status,e.automationId,e.page)}async function Yx(e,t){if(!vn.db.isProdAppID(vn.context.getAppId()))return;let r=await qf(e,t);t.status===Df.AutomationStatus.ERROR&&await Ls([r]),await Ps()}var Rn={};w(Rn,{checkPluginQuotas:()=>Jx,deletePlugin:()=>zx,storePlugin:()=>Hx});var kf=require("@budibase/types"),z=require("@budibase/backend-core");var Bf=P(require("fs")),Mf=require("path");function Gf(e,t){return Bf.default.readFileSync((0,Mf.join)(e,t),"utf8")}async function Hx(metadata,directory,source){let db=z.tenancy.getGlobalDB(),version=metadata.package.version,name=metadata.package.name,description=metadata.package.description,hash=metadata.schema.hash,bucketPath=z.objectStore.getPluginS3Dir(name),files=await z.objectStore.uploadDirectory(z.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===kf.PluginType.DATASOURCE){let js=Gf(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=z.db.generatePluginID(name),rev;try{rev=(await db.get(pluginId))._rev}catch(e){rev=void 0}let doc={_id:pluginId,_rev:rev,...metadata,name,version,hash,description,source};iconFileName&&(doc.iconFileName=iconFileName),source&&(doc={...doc,source});let write=async()=>{let e=await db.put(doc);return await z.events.plugin.imported(doc),{...doc,_rev:e.rev}};return rev?await write():await As(write)}async function zx(e){let t=z.tenancy.getGlobalDB();try{let r=await t.get(e),a=z.objectStore.getPluginS3Dir(r.name);await z.objectStore.deleteFolder(z.objectStore.ObjectStoreBuckets.PLUGINS,a),await t.remove(e,r._rev),await z.events.plugin.deleted(r),await bs()}catch(r){let a=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${a}`)}}async function Jx(){let e=z.tenancy.getGlobalDB();try{let r=(await e.allDocs(z.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await Is(r)}catch(t){z.logging.logAlert("Unable to retrieve plugins for quota check",t)}}var Ye={};w(Ye,{fetch:()=>Zx,fetchValues:()=>eC,isEncryptionKeyAvailable:()=>Xx,isValid:()=>jf,remove:()=>rC,update:()=>tC});var Aa=require("@budibase/types"),Ff=require("@budibase/backend-core");function Xx(){return!!Ff.env.ENCRYPTION_KEY}async function Zx(){let e=await _t.get();return Object.keys(e.variables)}async function eC(e){let r=(await _t.get()).variables,a={};for(let[n,o]of Object.entries(r))switch(e){case Aa.AppEnvironment.DEVELOPMENT:a[n]=o.development;break;case Aa.AppEnvironment.PRODUCTION:default:a[n]=o.production;break}return a}async function Qf(e){if(!(await je.cache.getCachedLicense()).features.includes(Aa.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await _t.get();r.variables=e(r.variables),await _t.update(r)}async function tC(e,t){if(jf(e))await Qf(a=>(a[e]=t,a));else throw new Error("Variable name has characters that are not allowed")}async function rC(e){await Qf(t=>(delete t[e],t))}function jf(e){return/^[a-zA-Z0-9-_]+$/.test(e)}var At={};w(At,{definitions:()=>fC,download:()=>dC,fetch:()=>lC,write:()=>pC});var xn=require("@budibase/types");var K=require("@budibase/backend-core"),Ne=require("@budibase/types");var Wf=require("memorystream"),$f=new K.sql.Sql(Ne.SqlClient.SQL_LITE);async function aC(e,t,r){let a={operation:Ne.Operation.READ,table:Wt.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:Ne.SortOrder.DESCENDING,type:Ne.SortType.STRING}}},n=$f._query(a);if(Array.isArray(n))throw new Error("Cannot execute multiple queries for audit log search");return{sql:n.sql,bindings:n.bindings}}function nC(e){return`${K.DocumentType.AUDIT_LOG}${K.SEPARATOR}${e}${K.SEPARATOR}${K.utils.newid()}`}async function Kf(e){e._id||(e._id=nC(e.timestamp)),e.type||(e.type=Ne.AUDIT_LOG_TYPE);try{let r=await K.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){K.logging.logAlert("Failed to write audit log",t)}}async function qs(e,t,r){t||(t=1);let a=K.context.getAuditLogsDB();try{let n=9+1,o=await aC(e,t,n),s=Wt.searchTable(),i=$f.convertJsonStringColumns(s,await a.sql(o.sql,o.bindings)),p;i.length>n&&(p=i.pop());let m={rows:i,hasNextPage:!!p};return m.hasNextPage&&(m.bookmark=t+1),m}catch(n){if(n.status===404&&!r?.isRetry)return await oC(),await Vu(),await qs(e,t,{isRetry:!0});throw n}}async function oC(){let e=K.context.getAuditLogsDB(),r=(await e.allDocs(K.db.getDocParams(K.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(a=>a.doc).filter(a=>a&&!a.type).map(a=>({...a,type:Ne.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}function Vf(e){let t=K.context.getAuditLogsDB(),r=new Wf,a=t.dump(r,{filter:o=>{let s=o;if(!s._id?.startsWith(K.DocumentType.AUDIT_LOG))return!1;let i=!0,p=(m,f)=>{!m||m.length===0||(i=!!(i&&f&&m.includes(f)))};if(p(e.userIds,s.userId),p(e.appIds,s.appId),p(e.events,s.event),(e.startDate||e.endDate)&&(i=i&&s.timestamp>=e.startDate&&s.timestamp<=e.endDate),e.fullSearch){let m=JSON.stringify(o);i=i&&m.includes(e.fullSearch)}return i}}),n=new Wf;return r.on("data",o=>{let s=JSON.parse(Buffer.from(o).toString());if(Array.isArray(s.docs)){let i="";for(let p of s.docs)i+=JSON.stringify(p)+`
|
|
38
|
-
`;n.write(i)}}),r.on("end",()=>{n.end()}),{promise:a,stream:n}}var le=require("@budibase/backend-core");var _n=require("@budibase/types"),ba=require("@budibase/string-templates"),Ia=require("@budibase/backend-core"),iC=Ia.constants.MIN_VALID_DATE.toISOString(),uC=Ia.constants.MAX_VALID_DATE.toISOString();function Ds(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||iC,e.endDate=e.endDate||uC),e}async function Yf(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(a=>Ia.db.getProdAppID(a)));let t={};function r(a,n){n?.length&&(t.oneOf={...t.oneOf,[a]:n})}return r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=Ds(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}function Ns(e,t,r){let a={_id:e,status:_n.AuditLogResourceStatus.DELETED};switch(t){case"app":a.name=r?.appName;break;case"user":a.email=r?.email;break}return a}function Bs(e){let t=(0,ba.findHBSBlocks)(e);for(let r of t){let a=` "${r}"`;e=e.replace(e.includes(a)?a:` ${r}`,""),e=(0,ba.processStringSync)(e,{})}return e}function Hf(e,t){let r=_n.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let a=(0,ba.processStringSync)(r,t);return a.includes('""')&&(a=Bs(r)),a}async function pC(e,t,r){if(!await gn()||!le.utils.isAudited(e))return;let a=Hf(e,t),n=new Date;r?.timestamp&&(n=new Date(r.timestamp));let o={timestamp:n.toISOString(),event:e,name:a,userId:r?.userId||xn.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},s={};try{if(r?.appId){o.appId=le.db.getProdAppID(r.appId);let i=await le.cache.app.getAppMetadata(r.appId);"name"in i&&(s.appName=i.name)}if(r?.userId){let i=await le.users.getById(r?.userId);s.email=i.email}}catch(i){le.logging.logAlert("Failed to retrieve fallback information for audit log",i)}return o.fallback=s,await Kf(o)}async function cC(e){let t=e.map(i=>i.userId),a=e.filter(i=>i.appId).map(i=>le.db.getDevAppID(i.appId)),n=await le.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),o=await le.db.getAppsByIDs([...new Set(a)]),s=[];for(let i of e){let p=n.find(h=>h?._id===i.userId),m=o.find(h=>le.db.isSameAppID(h?.appId,i.appId)),f={event:i.event,timestamp:i.timestamp,name:i.name,metadata:i.metadata,user:p||Ns(i.userId,"user",i.fallback)};i.appId&&(f.app=m||Ns(i.appId,"app",i.fallback)),s.push(f)}return s}async function lC(e){if(!await gn())throw new Error("Audit logs not available - license required.");let t=await Yf(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await qs(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await cC(r.rows)}}function dC(e){return e=Ds(e),Vf(e)}function fC(){let e=Object.entries(xn.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=Bs(r[1]);return t}var Cn={};w(Cn,{applications:()=>Fs,roles:()=>Gs,users:()=>Ms});var Ms={};w(Ms,{roleCheck:()=>gC});function mC(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}async function gC(e,t){return await tt()||mC(e,t),e}var Gs={};w(Gs,{assign:()=>hC,unAssign:()=>yC});var Sa=require("@budibase/backend-core");async function hC(e,t){if(!await tt())throw new Error("Unable to assign roles - license required.");let r=await Ve.bulkGet(e);for(let a of r){if(t.role&&t.role.roleId){let n=Sa.db.getProdAppID(t.role.appId);a.roles[n]=t.role.roleId}if(t.appBuilder){let n=Sa.db.getProdAppID(t.appBuilder.appId),o=a.builder?.apps||[];a.builder={apps:o.concat([n])}}t.builder&&(a.builder={global:!0}),t.admin&&(a.admin={global:!0}),a.roles}await Ve.bulkUpdate(r)}async function yC(e,t){if(!await tt())throw new Error("Unable to un-assign roles - license required.");let r=await Ve.bulkGet(e);for(let a of r){if(t.role){let n=Sa.db.getProdAppID(t.role?.appId);a.roles[n]===t.role.roleId&&delete a.roles[n]}if(t.appBuilder&&a.builder?.apps){let n=Sa.db.getProdAppID(t.appBuilder.appId);a.builder.apps=a.builder.apps.filter(o=>o!==n)}t.builder&&a.builder&&delete a.builder,t.admin&&a.admin&&delete a.admin}}var Fs={};w(Fs,{buildExportFn:()=>bC,buildImportFn:()=>AC});var ks=require("@budibase/backend-core");function AC(e){return async(t,r)=>{await tt()||t.throw(403,"Endpoint unavailable, license required."),t.request.files?.appExport||t.throw(400,"Must provide app export file for import."),await ks.context.doInAppContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}function bC(e){return async(t,r)=>{await tt()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:a,excludeRows:n}=t.request.body;await ks.context.doInAppContext(t.params.appId,async()=>{t.request.body={encryptPassword:a,excludeRows:n},t.query.appId=t.params.appId,await e(t),await r()})}}var He=require("@budibase/backend-core"),ue=require("@budibase/types");var Qs=require("@budibase/backend-core"),zf;function Jf(){zf=new Qs.queue.BudibaseQueue(Qs.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}function Dt(){return zf}var Xf=require("path"),Zf=P(require("fs"));async function Ws(e,t={}){return ve.storeAppBackupMetadata(e,t)}function em(e){let t=new Date().toISOString();switch(e){case ue.AppBackupStatus.COMPLETE:case ue.AppBackupStatus.FAILED:return{timestamp:t,finishedAt:t};case ue.AppBackupStatus.STARTED:return{timestamp:t,startedAt:t};case ue.AppBackupStatus.PENDING:return{timestamp:t,createdAt:t}}}async function IC(e,t,r,a){let n=await On(e);return await ve.storeAppBackupMetadata({...n,...em(t),contents:r,status:t,type:ue.AppBackupType.BACKUP},{filename:a,docId:e})}async function SC(e,t,r){let a=await On(e);return await ve.storeAppBackupMetadata({...a,...em(r),status:r,type:ue.AppBackupType.RESTORE,trigger:ue.AppBackupTrigger.MANUAL},{docId:e,docRev:t})}async function On(e){return ve.getAppBackupMetadata(e)}async function wC(e,t){return ve.updateAppBackupMetadata(e,t)}async function TC(e){let t=await ve.getAppBackupMetadata(e);return t.filename&&await He.objectStore.deleteFile(He.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),ve.deleteAppBackupMetadata(e)}async function vC(e,t){return ve.fetchAppBackups(e,t)}async function tm(e){let t=await ve.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let r=await He.objectStore.getReadStream(He.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}async function EC(e){let{stream:t}=await tm(e),r=(0,Xf.join)(He.objectStore.budibaseTempDir(),He.utils.newid()),a=Zf.default.createWriteStream(r);return new Promise((n,o)=>{t.on("error",o),a.on("error",o),t.pipe(a).on("close",()=>n(r))})}async function RC(e,t,r={}){let a;try{a=await Ws({appId:e,trigger:t,timestamp:new Date().toISOString(),status:ue.AppBackupStatus.PENDING,type:ue.AppBackupType.BACKUP,...r})}catch(n){if(n.status===409)return;throw n}return await Dt().add({docId:a.id,docRev:a.rev,appId:e,export:{trigger:t,...r}}),await He.events.backup.appBackupTriggered(e,a.id,ue.AppBackupType.BACKUP,t,r?.name),a.id}async function _C(e,t,r,a){let n=await On(t),o;try{o=await Ws({appId:e,timestamp:new Date().toISOString(),status:ue.AppBackupStatus.PENDING,type:ue.AppBackupType.RESTORE,createdBy:a})}catch(s){if(s?.status===409)return;throw s}return await Dt().add({appId:e,docId:o.id,docRev:o.rev,import:{nameForBackup:r,backupId:t,createdBy:a}}),{restoreId:o.id,metadata:n}}var xC={isEnabled:ps,triggerAppRestore:ye(_C),triggerAppBackup:ye(RC),getBackupDownloadStream:ye(tm),downloadAppBackup:ye(EC),fetchAppBackups:ye(vC),storeAppBackupMetadata:ye(Ws),updateBackupStatus:ye(IC),updateRestoreStatus:ye(SC),getAppBackup:ye(On),updateAppBackup:ye(wC),deleteAppBackup:ye(TC)},ot=xC;var Ks={};w(Ks,{init:()=>$s});var J=require("@budibase/backend-core");var Be=require("@budibase/types");var fr=P(require("fs"));async function $s(e){Dt().process(async t=>{let r=t.data;try{if(r.export)return LC(t,e);if(r.import)return OC(t,e)}catch(a){J.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,a)}})}async function CC(e){await J.db.getDB(e,{skip_setup:!0}).destroy()}async function rm(e,t,r,a){let n=J.db.getDevAppID(r),o=J.db.getProdAppID(r),s=new Date().toISOString(),i=async(p,m)=>{a?.doc?await ot.updateBackupStatus(a.doc.id,p,m?.contents,m?.filename):await ot.storeAppBackupMetadata({appId:o,timestamp:s,trigger:e,status:p,name:a?.name,type:Be.AppBackupType.BACKUP,contents:m?.contents,createdBy:a?.createdBy},{filename:m?.filename})};try{let p=await a.processing.exportAppFn(n,{tar:!0}),m=await a.processing.statsFn(n),f=`${o}/backup-${s}.tar.gz`,h=J.objectStore.ObjectStoreBuckets.BACKUPS,g=fr.default.createReadStream(p);await J.objectStore.streamUpload({bucket:h,filename:f,stream:g,extra:{type:"application/gzip",metadata:{name:a?.name,trigger:e,timestamp:s,appId:o}}}),await i(Be.AppBackupStatus.COMPLETE,{filename:f,contents:m}),fr.default.existsSync(p)&&fr.default.rmSync(p)}catch(p){J.logging.logAlert("App backup error",p),await i(Be.AppBackupStatus.FAILED)}}async function OC(e,t){let r=e.data,a=r.appId,n=r.import.backupId,o=r.import.nameForBackup,s=r.import.createdBy,i=J.tenancy.getTenantIDFromAppID(a);return J.tenancy.doInTenant(i,async()=>{let p=J.db.getDevAppID(a),{rev:m}=await ot.updateRestoreStatus(r.docId,r.docRev,Be.AppBackupStatus.STARTED);await rm(Be.AppBackupTrigger.RESTORING,i,a,{processing:t,createdBy:s,name:o});let f=await ot.downloadAppBackup(n);await CC(p);let h=Be.AppBackupStatus.COMPLETE;try{await t.importAppFn(p,J.db.getDB(p),{file:{type:"application/gzip",path:f},key:f})}catch(g){J.logging.logAlert("App restore error",g),h=Be.AppBackupStatus.FAILED}await ot.updateRestoreStatus(r.docId,m,h),fr.default.existsSync(f)&&fr.default.rmSync(f,{force:!0})})}async function LC(e,t){let r=e.data,a=r.appId,n=r.export.trigger,o=r.export.name,s=J.tenancy.getTenantIDFromAppID(a);await J.tenancy.doInTenant(s,async()=>{try{let{rev:i}=await ot.updateBackupStatus(r.docId,Be.AppBackupStatus.STARTED);return rm(n,s,a,{processing:t,doc:{id:r.docId,rev:i},name:o})}catch(i){J.logging.logAlert("App backup error",i)}})}var PC=async e=>{Jf(),await $s(e.processing)},Re={...ot,processing:Ks,init:PC,getBackupQueue:Dt};var am=async e=>{e.backups&&await Re.init(e.backups)};var fe={};w(fe,{create:()=>EM,find:()=>vM,get:()=>TM,remove:()=>_M,update:()=>RM});var EA=P(ki()),st=require("@budibase/backend-core");var RA=require("@budibase/types");async function TM(e){let t=st.tenancy.getGlobalDB(),r=new st.db.QueryBuilder(t.name,RA.SearchIndex.USER);r.setIndexBuilder(st.db.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[n,o]of Object.entries(e.filters?.equal??{}))r.addEqual(n,o);r.setSort("_id"),r.setSkip(e.skip);let a=await r.run();return{users:a.rows,total:a.totalRows}}async function vM(e){return await st.users.getById(e)}async function EM(e){let t=await Ve.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new st.HTTPError("User is already synched",409);e={...t,scimInfo:(0,EA.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Ve.save(e,{requirePassword:!1})}async function RM(e,t){return await Ve.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}async function _M(e){return await Ve.destroy(e)}var br={};w(br,{create:()=>xM});var _A=P(ki());var xA=require("@budibase/backend-core");async function xM(e){let t=await go(e.name),r;if(!t)r=(await j.save(e)).id;else{if(t.scimInfo?.isSync)throw new xA.HTTPError("Group is already synched",409);r=t._id,t.users&&(await j.removeUsers(r,t.users.map(n=>n._id)),delete t.users),t.scimInfo=(0,_A.default)(t.scimInfo,e.scimInfo),await j.save(t)}return await j.get(r)}var Bt={};w(Bt,{logRequest:()=>CM,logResponse:()=>OM});var Fi=require("@budibase/backend-core");async function CM(e){Fi.logging.logWarn("SCIM request log",e)}async function OM(e){Fi.logging.logWarn("SCIM response error",e)}var Vi={};w(Vi,{doInScimContext:()=>ji,feature:()=>W,internalGroupOnly:()=>$n,licenseAuth:()=>LA,licensing:()=>CA,requireSCIM:()=>Wi,scimGroupOnly:()=>Ea,scimUserOnly:()=>va});var bt=require("@budibase/backend-core");var jn=require("@budibase/types"),LM=(e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(bt.env.SELF_HOSTED&&bt.env.DEFAULT_LICENSE)return t.user.license=yo,r();t.user.license=await je.cache.getCachedLicense(t,{populateLicense:e.populateLicense,populateFreeLicense:e.populateFreeLicense}),e.checkUsersLimit&&(bt.utils.isServingApp(t)||bt.utils.isServingBuilder(t)||bt.utils.isServingBuilderPreview(t)||bt.utils.isPublicApiRequest(t))&&await Ke.usageLimitIsExceeded(jn.StaticQuotaName.USERS,jn.QuotaUsageType.STATIC)}return r()},CA=LM;var W={};w(W,{requireFeature:()=>PM,requireFeatures:()=>UM});var PM=e=>async(t,r)=>{await mn(e),await r()},UM=(...e)=>async(t,r)=>{await us(e),await r()};var Wn=require("@budibase/backend-core");var ji=async(e,t)=>(Wn.env.DISABLE_SCIM_CALLS||await Bt.logRequest({...e.request.toJSON(),body:e.request.body}),await Wn.context.doInScimContext(async()=>{let r=await t();return await Bt.logResponse({...e.response.toJSON(),body:e.response.body}),r}));var Wi=async(e,t)=>{await ds(),await t()};var OA=require("@budibase/backend-core");var va=e=>$i(OA.users.getById,e,!0),Ea=e=>$i(M.get,e,!0),$n=e=>$i(M.get,e,!1);function $i(e,t,r){return async(a,n)=>{let o=a.params[t];return typeof o!="string"&&a.throw(404),!!(await e(o)).scimInfo?.isSync!==r&&a.throw(404),n()}}var Ra=require("@budibase/backend-core");var Ki=require("dd-trace");async function LA(e,t){await Ki.tracer.trace("licenseAuth",async r=>{let a=e.request.headers[Ra.constants.Header.LICENSE_KEY];Array.isArray(a)&&(a=a[0]),r.addTags({licenseKey:a}),a||e.throw(403,"License key not provided");let n=await ns(a);n||(r.addTags({licenseFound:!1}),e.throw(403,"License not found or invalid")),n.tenantId||e.throw(403,"License does not have a tenant ID"),Ki.tracer.setUser({id:"anonymous",tenantId:n.tenantId}),await Ra.context.doInSelfHostTenantUsingCloud(n.tenantId,async()=>{await Ra.context.doInLicenseContext(n,async()=>{await t()})})})}var ru={};w(ru,{appBackups:()=>yb,auditLogs:()=>sb,environmentVariables:()=>XA,groups:()=>jA,scim:()=>Vb,users:()=>Xb});async function PA(e){let t=e.request.body;if(t.name=t.name.trim(),delete t.roles,t._id){let a=await qt(t._id);t.roles=a.roles,t.scimInfo=a.scimInfo}let r=await dr(t);e.body={_id:r.id,_rev:r.rev}}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 users to add or to remove");let n,o;r&&(n=await ws(t,r)),a&&(o=await Ts(t,a)),e.body={added:n,removed:o}}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 objects, with appId and roleId to add or remove"),e.body=await vs(t,{appsToAdd:r,appsToRemove:a})}async function DA(e){e.body={data:await ha()}}async function NA(e){let{groupId:t,rev:r}=e.params;try{await Ss(t,r),e.body={message:"Group deleted successfully"}}catch(a){e.throw(a.status,a)}}async function BA(e){try{e.body=await qt(e.params.groupId)}catch(t){e.throw(t.status,t)}}async function MA(e){let{pageSize:t=10,bookmark:r,emailSearch:a}=e.request.query,n=e.params.groupId,o={limit:t+1},s=await Fa(n,{...o,emailSearch:a,bookmark:r}),i=a?s[t]?.email:s[t]?._id,p=!!i;e.body={users:s.slice(0,t),bookmark:i,hasNextPage:p}}async function GA(e){let{groupId:t,appId:r}=e.params;await Es(t,r),e.body={message:"Group app builder access updated."}}async function kA(e){let{groupId:t,appId:r}=e.params;await Rs(t,r),e.body={message:"group app builder access removed."}}var FA=P(require("@koa/router")),be=P(require("joi"));var _e=require("@budibase/types"),ze=require("@budibase/backend-core"),QA=new FA.default;function DM(){return ze.auth.joiValidator.body(be.default.object({_id:be.default.string().optional(),_rev:be.default.string().optional(),color:be.default.string().required(),icon:be.default.string().required(),name:be.default.string().trim().required().max(50),role:be.default.string().optional(),users:be.default.array().optional(),apps:be.default.array().optional(),roles:be.default.object().optional(),createdAt:be.default.string().optional(),updatedAt:be.default.string().optional()}).required())}QA.post("/api/global/groups",ze.auth.adminOnly,W.requireFeature(_e.Feature.USER_GROUPS),DM(),PA).get("/api/global/groups",W.requireFeature(_e.Feature.USER_GROUPS),DA).delete("/api/global/groups/:groupId/:rev",W.requireFeature(_e.Feature.USER_GROUPS),ze.auth.adminOnly,$n("groupId"),NA).get("/api/global/groups/:groupId",W.requireFeature(_e.Feature.USER_GROUPS),ze.auth.builderOrAdmin,BA).get("/api/global/groups/:groupId/users",W.requireFeature(_e.Feature.USER_GROUPS),ze.auth.builderOrAdmin,MA).post("/api/global/groups/:groupId/users",ze.auth.adminOnly,W.requireFeature(_e.Feature.USER_GROUPS),$n("groupId"),UA).post("/api/global/groups/:groupId/apps",ze.auth.builderOrAdmin,W.requireFeature(_e.Feature.USER_GROUPS),qA).post("/api/global/groups/:groupId/app/:appId/builder",ze.auth.builderOrAdmin,W.requireFeatures(_e.Feature.USER_GROUPS,_e.Feature.APP_BUILDERS),GA).delete("/api/global/groups/:groupId/app/:appId/builder",ze.auth.builderOrAdmin,W.requireFeatures(_e.Feature.USER_GROUPS,_e.Feature.APP_BUILDERS),kA);var jA=QA;var Yi=require("@budibase/types");var Hi=require("@budibase/backend-core");async function WA(e){e.body={encryptionKeyAvailable:Ye.isEncryptionKeyAvailable()}}async function $A(e){e.body={variables:await Ye.fetch()}}async function KA(e){let{name:t,production:r,development:a}=e.request.body;await Ye.update(t,{production:r,development:a});let n=[Yi.AppEnvironment.PRODUCTION];r!==a&&n.push(Yi.AppEnvironment.DEVELOPMENT),await Hi.events.environmentVariable.created(t,n),e.body={message:`Environment variable "${t}" created.`}}async function VA(e){let{production:t,development:r}=e.request.body,a=e.params.varName;await Ye.update(a,{production:t,development:r}),e.body={message:`Environment variable "${a}" updated.`}}async function YA(e){let t=e.params.varName;await Ye.remove(t),await Hi.events.environmentVariable.deleted(t),e.body={message:`Environment variable "${t}" deleted.`}}var Mt=require("@budibase/backend-core"),zA=P(require("@koa/router")),_a=P(require("joi")),JA=new zA.default;function HA(){return Mt.auth.joiValidator.body(_a.default.object({name:_a.default.string().optional(),production:_a.default.string().required(),development:_a.default.string().required()}))}JA.get("/api/env/variables/status",Mt.auth.builderOrAdmin,WA).get("/api/env/variables",Mt.auth.builderOrAdmin,$A).post("/api/env/variables",Mt.auth.builderOrAdmin,HA(),KA).patch("/api/env/variables/:varName",Mt.auth.builderOrAdmin,HA(),VA).delete("/api/env/variables/:varName",Mt.auth.builderOrAdmin,YA);var XA=JA;var zi=require("@budibase/backend-core");async function ZA(e){let t=e.request.body,r=await At.fetch(t);await zi.events.auditLog.filtered(t),e.body=r}async function eb(e){let t=e.request.body,{stream:r}=At.download(t);await zi.events.auditLog.downloaded(t),e.attachment(`audit-logs-${Date.now()}.log`),e.body=r}async function tb(e){e.body={events:At.definitions()}}var ab=require("@budibase/types"),Gt=require("@budibase/backend-core"),nb=P(require("@koa/router")),xe=P(require("joi"));function rb(){return Gt.auth.joiValidator.body(xe.default.object({userIds:xe.default.array().items(xe.default.string()).optional(),appIds:xe.default.array().items(xe.default.string()).optional(),events:xe.default.array().items(xe.default.string().valid(...Object.values(ab.Event))).optional(),startDate:xe.default.string().optional().allow(""),endDate:xe.default.string().optional().allow(""),fullSearch:xe.default.string().optional().allow(""),bookmark:xe.default.number()}))}var ob=new nb.default;ob.post("/api/global/auditlogs/search",Gt.auth.adminOnly,rb(),ZA).get("/api/global/auditlogs/download",Gt.auth.adminOnly,Gt.middleware.querystringToBody,rb(),eb).get("/api/global/auditlogs/definitions",Gt.auth.adminOnly,tb);var sb=ob;var Ji=require("@budibase/types");var ib=require("@budibase/backend-core");async function Ir(e,t){await Vt.appExists(t)||e.throw(400,`Provided app ID: ${t} - is invalid.`)}async function ub(e){let t=e.params.appId;await Ir(e,t);let r=e.request.body,a=e.user?._id,n=await Re.triggerAppBackup(t,Ji.AppBackupTrigger.MANUAL,{name:r.name,createdBy:a});n||e.throw(500,"Unable to start backup."),e.body={backupId:n,message:"Backup triggered - process starting."}}async function pb(e){let t=e.params.appId;await Ir(e,t);let r=e.params.backupId,a=e.request.body.name,n=await Re.triggerAppRestore(t,r,a,e.user?._id);n||e.throw(500,"Unable to start restore."),await ib.events.backup.appBackupRestored(n.metadata),e.body={restoredId:n?.restoreId,message:"Restore triggered - process starting."}}async function cb(e){let t=e.params.appId;await Ir(e,t);let r=e.params.backupId;await Re.deleteAppBackup(r),e.body={message:"Backup deleted successfully."}}async function lb(e){let t=e.params.appId;await Ir(e,t);let r=e.request.body;r?.trigger&&(r.trigger=r.trigger.toLowerCase(),Object.values(Ji.AppBackupTrigger).includes(r.trigger)||e.throw(400,"Provided trigger is not a valid option.")),e.body=await Re.fetchAppBackups(t,{paginate:!0,...r})}async function fb(e){let t=e.params.appId;await Ir(e,t);let r=e.params.backupId,a=e.request.body;e.body=await Re.updateAppBackup(r,a.name)}async function mb(e){let t=e.params.appId;await Ir(e,t);let r=e.params.backupId,{metadata:a,stream:n}=await Re.getBackupDownloadStream(r);e.attachment(`backup-${a.timestamp}.tar.gz`),e.body=n}var gb=P(require("@koa/router")),kt=P(require("joi")),Kn=require("@budibase/types"),It=require("@budibase/backend-core"),hb=new gb.default;function GM(){return It.auth.joiValidator.body(kt.default.object({trigger:kt.default.string().valid(...Object.values(Kn.AppBackupTrigger)),type:kt.default.string().valid(...Object.values(Kn.AppBackupType)),startDate:kt.default.date(),endDate:kt.default.date(),page:kt.default.string()}))}hb.post("/api/apps/:appId/backups",It.auth.builderOrAdmin,ub).post("/api/apps/:appId/backups/search",It.auth.builderOrAdmin,GM(),lb).get("/api/apps/:appId/backups/:backupId/file",It.auth.builderOrAdmin,mb).patch("/api/apps/:appId/backups/:backupId",It.auth.builderOrAdmin,fb).delete("/api/apps/:appId/backups/:backupId",It.auth.builderOrAdmin,cb).post("/api/apps/:appId/backups/:backupId/import",It.auth.builderOrAdmin,pb);var yb=hb;var Kb=P(require("@koa/router"));var Vn=require("scim-patch");var bb=require("@budibase/backend-core");function Ab(e,t){let r=e.request.query[t];if(r!==void 0)return+r}var Ib=async e=>{let t=Ab(e,"pageSize")??20,r=Ab(e,"startIndex"),a;e.request.query.filter&&(a=V.user.userFilters(e.request.query.filter));let n=await fe.get({pageSize:t,skip:r,filters:a});e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:n.total,Resources:n.users.map(V.user.toScimUserResponse),startIndex:(r||0)+1,itemsPerPage:t}},Sb=async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404);let r=await fe.find(t);e.body=V.user.toScimUserResponse(r)},wb=async e=>{let t=V.user.fromScimUser(e.request.body);try{let r=await fe.create(t);e.body=V.user.toScimUserResponse(r)}catch(r){throw r instanceof bb.EmailUnavailableError&&e.throw(409,"Email already in use"),r}};function kM(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}var Tb=async e=>{let t=await fe.find(e.params.id);t||e.throw(404);let r=V.user.toScimUserResponse(t),a=e.request.body;try{(0,Vn.patchBodyValidation)(a)}catch{}if(kM(a))return Xi(e);let n;try{n=(0,Vn.scimPatch)(r,a.Operations)}catch{}n||e.throw(500);let o=V.user.fromScimUser(n);await fe.update(o,{allowChangingEmail:!0}),e.body=V.user.toScimUserResponse(o)},Xi=async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404),await fe.remove(t),e.status=204};var Mb=P(Bb()),Gb=require("@budibase/shared-core"),Yn=require("scim-patch");var Hn=require("scim2-parse-filter");function kb(e,t){for(let r of t.split(","))delete e[r]}var Fb=async e=>{let r=(await j.fetch()).filter(o=>o.scimInfo?.isSync).map(V.group.toScimGroupResponse),{filter:a,excludedAttributes:n}=e.request.query;if(a){let o=(0,Hn.filter)((0,Hn.parse)(a));r=r.filter(o)}n&&r.forEach(o=>{kb(o,n)}),e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:r.length,Resources:r,startIndex:1,itemsPerPage:r.length}},Qb=async e=>{let t=V.group.fromScimGroup(e.request.body),r=await br.create(t);e.body=V.group.toScimGroupResponse(r)},jb=async e=>{let{id:t}=e.params,r=await j.get(t),a=V.group.toScimGroupResponse(r),{excludedAttributes:n}=e.request.query;n&&kb(a,n),e.body=a},Wb=async e=>{let{id:t}=e.params,r=await j.get(t);await j.remove(t,r._rev),e.status=204},$b=async e=>{let{id:t}=e.params,r=await j.get(t),a=V.group.toScimGroupResponse(r),n=e.request.body;try{(0,Yn.patchBodyValidation)(n)}catch{e.throw(400)}let{true:o,false:s}=(0,Mb.default)(n.Operations,i=>i.path==="members");if(s?.length){let i=(0,Yn.scimPatch)(a,s);i||e.throw(500);let p={...V.group.fromScimGroup(i),_rev:r._rev};await j.save(p)}if(o?.length){let i=[],p=[];for(let{op:m,value:f}of o)switch(m){case"add":case"Add":for(let h of f)i.push(await fe.find(h.value));break;case"remove":case"Remove":for(let h of f)p.push(await fe.find(h.value));break;case"replace":case"Replace":throw new Error("Replacing members is not allowed");default:Gb.utils.unreachable(m)}i.length&&await j.addUsers(t,i.map(m=>m._id)),p.length&&await j.removeUsers(t,p.map(m=>m._id))}e.body=V.group.toScimGroupResponse(await j.get(t))};var xa=require("@budibase/types"),Ie=new Kb.default({prefix:"/api/global/scim/v2"});Ie.use(Wi);Ie.use(ji);Ie.get("/users",Ib);Ie.get("/users/:id",va("id"),Sb);Ie.post("/users",wb);Ie.patch("/users/:id",va("id"),Tb);Ie.delete("/users/:id",va("id"),Xi);Ie.get("/groups",Fb);Ie.post("/groups",W.requireFeature(xa.Feature.USER_GROUPS),Qb);Ie.get("/groups/:id",W.requireFeature(xa.Feature.USER_GROUPS),Ea("id"),jb);Ie.delete("/groups/:id",W.requireFeature(xa.Feature.USER_GROUPS),Ea("id"),Wb);Ie.patch("/groups/:id",W.requireFeature(xa.Feature.USER_GROUPS),Ea("id"),$b);var Vb=Ie;var zb=P(require("@koa/router"));var Zi=require("@budibase/backend-core");async function Yb(e){let{userId:t,appId:r}=e.params,a=await at.db.getUser(t);if(Zi.users.isGlobalBuilder(a)){e.body={message:"User already admin - no permissions updated."};return}await at.addAppBuilder(a,r),e.body={message:`User "${a.email}" app builder access updated.`}}async function Hb(e){let{userId:t,appId:r}=e.params,a=await at.db.getUser(t);if(Zi.users.isGlobalBuilder(a)){e.body={message:"User already admin - no permissions removed."};return}await at.removeAppBuilder(a,r),e.body={message:`User "${a.email}" app builder access removed.`}}var eu=require("@budibase/types"),tu=require("@budibase/backend-core"),Jb=new zb.default;Jb.post("/api/global/users/:userId/app/:appId/builder",tu.auth.builderOrAdmin,W.requireFeatures(eu.Feature.APP_BUILDERS),Yb).delete("/api/global/users/:userId/app/:appId/builder",tu.auth.builderOrAdmin,W.requireFeatures(eu.Feature.APP_BUILDERS),Hb);var Xb=Jb;var V={};w(V,{group:()=>nu,user:()=>au});var au={};w(au,{fromScimUser:()=>gG,toScimUserResponse:()=>dG,userFilters:()=>hG});var zn=require("@budibase/types"),Zb=require("scim2-parse-filter"),eI=require("@budibase/backend-core"),tI=require("@budibase/shared-core"),{unreachable:lG}=tI.utils,dG=e=>{let{isSync:t,roles:r,...a}=e.scimInfo||{},n={...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===zn.UserStatus.ACTIVE};return(e.firstName||e.lastName)&&(n.name={formatted:[e.firstName,e.lastName].filter(o=>o).join(" "),familyName:e.lastName,givenName:e.firstName}),n},fG=e=>!!e?.id;function mG(e){if(eI.utils.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}var gG=e=>{let t=fG(e)?e:void 0,r=mG(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:lG(e.active)}let n,o;return e.name?.givenName?(n=e.name?.givenName,o=e.name?.familyName):n=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:n,lastName:o,scimInfo:{...e,isSync:!0},roles:{},status:a?zn.UserStatus.ACTIVE:zn.UserStatus.INACTIVE,createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},hG=e=>{let t={equal:{}},r=(0,Zb.parse)(e);function a(n){switch(n.op){case"eq":{let o=n.attrPath,s;switch(o){case"emails.value":s="email";break;default:s=`scimInfo.${o}`}t.equal[s]=n.compValue;break}case"and":for(let o of n.filters)a(o);break;default:console.warn("Filter not handled",{filter:n})}}return a(r),t};var nu={};w(nu,{fromScimGroup:()=>bG,toScimGroupResponse:()=>yG});var yG=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}))}),AG=e=>!!e?.id,bG=e=>{let t=AG(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()}};var xu={};w(xu,{LLM:()=>Je,LLMRequest:()=>$,TableGeneration:()=>_u,agentHistoryTitleSystemPrompt:()=>OG,agentSystemPrompt:()=>CG,aiColumnSchemas:()=>Eu,aiTableResponseToTableSchema:()=>Su,appendAIColumns:()=>wu,classifyText:()=>iu,cleanData:()=>uu,extractFileData:()=>EG,generateAIColumns:()=>bu,generateCode:()=>xG,generateCronExpression:()=>pu,generateData:()=>Iu,generateJs:()=>fu,generateSQL:()=>_G,generateTables:()=>Au,generationStructure:()=>vu,getLLM:()=>La,getLLMConfig:()=>yu,getLLMOrThrow:()=>lI,normalizeContentType:()=>ou,parseResponseFormat:()=>Xn,sanitiseToolName:()=>IG,searchWeb:()=>du,sentimentAnalysis:()=>lu,summarizeText:()=>Jn,tableDataStructuredOutput:()=>Ru,translate:()=>cu});var Ca=require("@budibase/types");function IG(e){if(e.length>64)throw new Error("Tool name must be under 64 characters long");return e.replace(/[^a-zA-Z0-9_-]/g,"_")}function ou(e){return e?e.includes("/")?e:{[Ca.SupportedFileType.PDF]:"application/pdf",[Ca.SupportedFileType.JPG]:"image/jpeg",[Ca.SupportedFileType.JPEG]:"image/jpeg",[Ca.SupportedFileType.PNG]:"image/png"}[e.toLowerCase()]||"application/octet-stream":"application/octet-stream"}var ao=require("@budibase/types");var Xe=require("@budibase/backend-core"),iI=require("@budibase/types");var Zn=P(require("openai"));var St=require("@budibase/types");var rI=require("@budibase/shared-core");var wt=P(require("dd-trace"));function su(e,t){return t.map(r=>e[r]).join(" ")}var Je=class{constructor({model:t,apiKey:r,maxTokens:a}){this._model=t,this._apiKey=r,this._maxTokens=a??parseInt(process.env.BUDIBASE_AI_MAX_PROMPT_TOKENS||"300")}get model(){return this._model}get apiKey(){return this._apiKey}get maxTokens(){return this._maxTokens}async prompt(t){return await wt.default.trace("prompt",async()=>{let r=typeof t=="string"?new $().addUserMessage(t):t,{messages:a,tokensUsed:n}=await wt.default.trace("chatCompletion",()=>this.chatCompletion(r));return!a||a.length===0?{message:"",tokensUsed:n}:{message:a[a.length-1].content||"",tokensUsed:n}})}async chat(t){return await wt.default.trace("chat",async()=>await this.chatCompletion(t))}async*chatStream(t){yield*this.chatCompletionStream(t)}async summarizeText(t){return wt.default.trace("summarizeText",()=>this.prompt(Jn(t)))}async generateCronExpression(t){return wt.default.trace("generateCronExpression",()=>this.prompt(pu(t)))}async operation(t,r){return wt.default.trace("operation",a=>{a.addTags({operation:t.operation,rowId:r.id});let n=this.promptForOperation(t,r);return this.prompt(n)})}promptForOperation(t,r){let{operation:a,column:n,columns:o,language:s,categories:i,prompt:p}=t;switch(a){case St.AIOperationEnum.SUMMARISE_TEXT:return Jn(su(r,o));case St.AIOperationEnum.CLEAN_DATA:return uu(r[n]);case St.AIOperationEnum.TRANSLATE:return cu(r[n],s);case St.AIOperationEnum.CATEGORISE_TEXT:if(!i)throw Error("No categories provided for categorise text operation. Please provide categories.");return iu(su(r,o),i.split(","));case St.AIOperationEnum.SENTIMENT_ANALYSIS:return lu(r[n]);case St.AIOperationEnum.PROMPT:return p;case St.AIOperationEnum.SEARCH_WEB:return du(su(r,o));default:throw rI.utils.unreachable(a)}}async generateJs(t,r){return await wt.default.trace("generateJs",async()=>{let{bindings:a=[],snippets:n=[]}=r||{};return await this.prompt(fu(a,n).addUserMessage(t))})}};var nI=require("@budibase/types"),mu=require("openai/helpers/zod");function Xn(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}function aI(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}var Ce=class extends Je{constructor(r){super(r);this.client=this.getClient(r)}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new Zn.default({apiKey:r.apiKey})}async uploadFile(r,a,n){let o=ou(n);if(nI.ImageContentTypes.includes(o.toLowerCase())){let p;if(Buffer.isBuffer(r))p=r;else{let f=[];for await(let h of r)f.push(h);p=Buffer.concat(f)}let m=p.toString("base64");return`data:${o};base64,${m}`}let s=await(0,Zn.toFile)(r,a);return(await this.client.files.create({file:s,purpose:"assistants"})).id}async chatCompletion(r){let a={model:this.model,messages:r.messages,max_tokens:this.maxTokens,response_format:Xn(r.format)};r.tools&&r.tools.length>0&&(a.tool_choice="auto",a.tools=r.tools.map(mu.zodFunction));let n=await this.client.chat.completions.create(a),o=n.choices[0]?.message;if(o?.tool_calls){r.addMessage(o);let s=[];for(let i of o.tool_calls){let p=r.findTool(i.function.name);if(!p)throw new Error(`Tool ${i.function.name} not found in prompt tools`);let m=JSON.parse(i.function.arguments);s.push(p.handler(m).then(f=>({role:"tool",tool_call_id:i.id,content:f})).catch(f=>(console.error(`[OPENAI TOOL ERROR] Tool ${i.function.name} failed in OpenAI handler:`,f),{role:"tool",tool_call_id:i.id,content:`Error: ${f.message}`})))}return r.addMessages(await Promise.all(s)),this.chatCompletion(r)}else{if(o?.content)return{messages:[...r.messages,{role:o.role,content:o.content}],tokensUsed:aI(n.usage)};throw new Error("No response found")}}async*chatCompletionStream(r){let a={model:this.model,messages:r.messages,max_tokens:this.maxTokens,response_format:Xn(r.format),stream:!0};r.tools&&r.tools.length>0&&(a.tool_choice="auto",a.tools=r.tools.map(mu.zodFunction));try{let n=await this.client.chat.completions.create(a),o=null,s="",i=null;for await(let m of n){let f=m.choices[0]?.delta;if(f){if(f.content&&(s+=f.content,yield{type:"content",content:f.content}),f.tool_calls&&f.tool_calls.length>0){let h=f.tool_calls[0];h.id?(o={id:h.id,name:h.function?.name||"",arguments:h.function?.arguments||""},yield{type:"tool_call_start",toolCall:{id:o.id,name:o.name,arguments:o.arguments}}):o&&h.function?.arguments&&(o.arguments+=h.function.arguments,yield{type:"tool_call_start",toolCall:{id:o.id,name:o.name,arguments:o.arguments}})}m.usage&&(i=m.usage)}}let p=i?aI(i):0;if(o){r.addMessage({role:"assistant",content:"",tool_calls:[{id:o.id,type:"function",function:{name:o.name,arguments:o.arguments}}]});let m=r.findTool(o.name);if(m)try{let f=JSON.parse(o.arguments),h=await m.handler(f);yield{type:"tool_call_result",toolResult:{id:o.id,result:h}},r.addMessage({role:"tool",tool_call_id:o.id,content:h}),yield*this.chatCompletionStream(r);return}catch(f){yield{type:"tool_call_result",toolResult:{id:o.id,result:`Error: ${f.message}`,error:f.message}},r.addMessage({role:"tool",tool_call_id:o.id,content:`Error: ${f.message}`}),yield*this.chatCompletionStream(r);return}else{let f=`Tool '${o.name}' not found`;yield{type:"tool_call_result",toolResult:{id:o.id,result:f,error:f}},r.addMessage({role:"tool",tool_call_id:o.id,content:f}),yield*this.chatCompletionStream(r);return}}s&&r.addMessage({role:"assistant",content:s}),yield{type:"done",messages:r.messages,tokensUsed:p}}catch(n){yield{type:"error",content:n.message}}}};var ee=require("@budibase/backend-core"),oI=require("@budibase/types");var gu=require("dd-trace"),eo=class extends Je{async prompt(t){let r=await super.prompt(t);return r.tokensUsed&&await Sn(r.tokensUsed),r}async chat(t){let r=await super.chat(t);return r.tokensUsed&&await Sn(r.tokensUsed),r}async uploadFile(t,r,a){return ee.env.SELF_HOSTED?this.uploadFileSelfHost(t,r,a):this.uploadFileCloud(t,r,a)}async uploadFileCloud(t,r,a){return new Ce({apiKey:ee.env.OPENAI_API_KEY,model:this.model,maxTokens:this.maxTokens}).uploadFile(t,r,a)}async uploadFileSelfHost(t,r,a){let n;if(Buffer.isBuffer(t))n=t;else{let p=[];for await(let m of t)p.push(m);n=Buffer.concat(p)}let o=n.toString("base64");if(a&&oI.ImageContentTypes.includes(a.toLowerCase()))return`data:image/jpeg;base64,${o}`;if(!ee.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let p=await dn();if(!p)throw new Error("No license key found");this._apiKey=p}let s=await fetch(`${ee.env.BUDICLOUD_URL}/api/ai/upload-file`,{method:"POST",headers:{"Content-Type":"application/json",[ee.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:o,filename:r,contentType:a})});if(!s.ok)throw await ee.HTTPError.fromResponse(s);return(await s.json()).fileId}async chatCompletion(t){return ee.env.SELF_HOSTED?this.chatCompletionSelfHost(t):this.chatCompletionCloud(t)}async chatCompletionCloud(t){return await gu.tracer.trace("chatCompletionCloud",async()=>await new Ce({apiKey:ee.env.OPENAI_API_KEY,model:this.model,maxTokens:this.maxTokens}).chatCompletion(t))}async chatCompletionSelfHost(t){return await gu.tracer.trace("chatCompletionSelfHost",async r=>{if(!ee.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(r.addTags({budicloudUrl:ee.env.BUDICLOUD_URL}),!this._apiKey){let o=await dn();if(!o)throw new Error("No license key found");this._apiKey=o,r.addTags({licenseKey:this._apiKey})}let a={messages:t.messages,format:t.format,useTools:t.tools.length>0},n=await fetch(`${ee.env.BUDICLOUD_URL}/api/ai/chat`,{method:"POST",headers:{"Content-Type":"application/json",[ee.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(a)});if(!n.ok)throw await ee.HTTPError.fromResponse(n);return await n.json()})}async*chatCompletionStream(t){ee.env.SELF_HOSTED?yield*this.chatCompletionStreamSelfHost(t):yield*this.chatCompletionStreamCloud(t)}async*chatCompletionStreamCloud(t){yield*new Ce({apiKey:ee.env.OPENAI_API_KEY,model:this.model,maxTokens:this.maxTokens}).chatCompletionStream(t)}async*chatCompletionStreamSelfHost(t){try{let r=await this.chatCompletionSelfHost(t);if(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){yield{type:"error",content:r.message}}}};var Oa=require("dd-trace");var hu=P(require("@anthropic-ai/sdk"));function SG(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}var to=class extends Je{constructor(r){super(r);this.client=new hu.default({apiKey:r.apiKey})}firstTextBlock(r){for(let a of r.content)if(a.type==="text")return a.text}async uploadFile(r,a,n){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:o})=>{if(o==null)return{role:"user",content:""};if(typeof o=="string")return{role:"user",content:o};let s="";for(let i of o)i.type==="text"?s+=i.text:["image_url","input_audio","file"].includes(i.type);return{role:"user",content:s}}),max_tokens:this.maxTokens}),n=this.firstTextBlock(a)||"";return{messages:[...r.messages,{role:"assistant",content:n}],tokensUsed:SG(a.usage)}}catch(a){throw a instanceof hu.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 n=a.messages[a.messages.length-1];n.content&&(yield{type:"content",content:n.content})}yield{type:"done",messages:a.messages,tokensUsed:a.tokensUsed}}catch(a){yield{type:"error",content:a.message}}}};var uI=require("zod"),pI=require("openai/helpers/zod");var sI=require("openai"),ro=class extends Ce{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 sI.AzureOpenAI({apiKey:t.apiKey,apiVersion:"2024-10-01-preview",deployment:t.model,baseURL:t.baseUrl})}};var cI="gpt-4o-mini",wG={OpenAI:Ce,TogetherAI:Ce,AzureOpenAI:ro,Custom:Ce,Anthropic:to,BudibaseAI:eo};async function TG(){return await Oa.tracer.trace("getAIConfig",async e=>{let t={type:iI.ConfigType.AI,config:{}};if(!Xe.context.isSelfHostUsingCloud()){let a=await Xe.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||cI,apiKey:r.apiKey,baseUrl:r.baseUrl}})}async function vG(){return Oa.tracer.trace("getSelfHostOpenAIKeyConfig",e=>{if(!Xe.env.SELF_HOSTED){e.addTags({enabled:!1,reason:"not self host"});return}if(!Xe.env.OPENAI_API_KEY){e.addTags({enabled:!1,reason:"no OPENAI_API_KEY"});return}return e.addTags({enabled:!0}),{provider:"OpenAI",model:cI,apiKey:Xe.env.OPENAI_API_KEY}})}async function yu(){return Oa.tracer.trace("getLLMConfig",async()=>await TG()||await vG())}async function La(e){return await Oa.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:a}=e||{},n=await yu();if(!n){t.addTags({enabled:!1,reason:"no config found"});return}r&&(n.model=r),a&&(n.maxTokens=a);let o=wG[n.provider];if(!o){t.addTags({enabled:!1,reason:"no provider found",provider:n.provider});return}return new o(n)})}async function lI(){let e=await La();if(!e)throw new Xe.HTTPError("No available LLM configurations",500);return e}var $=class e{constructor(){this.messages=[];this.tools=[]}addTool(t){return this.tools.push(t),this}addTools(t){return this.tools.push(...t),this}findTool(t){return this.tools.find(r=>r.name===t)}withFormat(t){return t instanceof uI.z.ZodType?this.format=(0,pI.zodResponseFormat)(t,"key"):this.format=t,this}addMessage(t){return this.messages.push(t),this}addMessages(t){return this.messages.push(...t),this}addUserMessage(t){return this.messages.push({role:"user",content:t}),this}addSystemMessage(t){return this.messages.push({role:"system",content:t}),this}static fromRequest(t){let r=new e;return t.messages&&r.addMessages(t.messages),t.format&&r.withFormat(t.format),r}};var it=require("zod");function Jn(e,t){let r=`Summarize this text:
|
|
38
|
+
`;n.write(i)}}),r.on("end",()=>{n.end()}),{promise:a,stream:n}}var le=require("@budibase/backend-core");var _n=require("@budibase/types"),ba=require("@budibase/string-templates"),Ia=require("@budibase/backend-core"),iC=Ia.constants.MIN_VALID_DATE.toISOString(),uC=Ia.constants.MAX_VALID_DATE.toISOString();function Ds(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||iC,e.endDate=e.endDate||uC),e}async function Yf(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(a=>Ia.db.getProdAppID(a)));let t={};function r(a,n){n?.length&&(t.oneOf={...t.oneOf,[a]:n})}return r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=Ds(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}function Ns(e,t,r){let a={_id:e,status:_n.AuditLogResourceStatus.DELETED};switch(t){case"app":a.name=r?.appName;break;case"user":a.email=r?.email;break}return a}function Bs(e){let t=(0,ba.findHBSBlocks)(e);for(let r of t){let a=` "${r}"`;e=e.replace(e.includes(a)?a:` ${r}`,""),e=(0,ba.processStringSync)(e,{})}return e}function Hf(e,t){let r=_n.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let a=(0,ba.processStringSync)(r,t);return a.includes('""')&&(a=Bs(r)),a}async function pC(e,t,r){if(!await gn()||!le.utils.isAudited(e))return;let a=Hf(e,t),n=new Date;r?.timestamp&&(n=new Date(r.timestamp));let o={timestamp:n.toISOString(),event:e,name:a,userId:r?.userId||xn.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},s={};try{if(r?.appId){o.appId=le.db.getProdAppID(r.appId);let i=await le.cache.app.getAppMetadata(r.appId);"name"in i&&(s.appName=i.name)}if(r?.userId){let i=await le.users.getById(r?.userId);s.email=i.email}}catch(i){le.logging.logAlert("Failed to retrieve fallback information for audit log",i)}return o.fallback=s,await Kf(o)}async function cC(e){let t=e.map(i=>i.userId),a=e.filter(i=>i.appId).map(i=>le.db.getDevAppID(i.appId)),n=await le.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),o=await le.db.getAppsByIDs([...new Set(a)]),s=[];for(let i of e){let p=n.find(h=>h?._id===i.userId),m=o.find(h=>le.db.isSameAppID(h?.appId,i.appId)),f={event:i.event,timestamp:i.timestamp,name:i.name,metadata:i.metadata,user:p||Ns(i.userId,"user",i.fallback)};i.appId&&(f.app=m||Ns(i.appId,"app",i.fallback)),s.push(f)}return s}async function lC(e){if(!await gn())throw new Error("Audit logs not available - license required.");let t=await Yf(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await qs(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await cC(r.rows)}}function dC(e){return e=Ds(e),Vf(e)}function fC(){let e=Object.entries(xn.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=Bs(r[1]);return t}var Cn={};w(Cn,{applications:()=>Fs,roles:()=>Gs,users:()=>Ms});var Ms={};w(Ms,{roleCheck:()=>gC});function mC(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}async function gC(e,t){return await tt()||mC(e,t),e}var Gs={};w(Gs,{assign:()=>hC,unAssign:()=>yC});var Sa=require("@budibase/backend-core");async function hC(e,t){if(!await tt())throw new Error("Unable to assign roles - license required.");let r=await Ve.bulkGet(e);for(let a of r){if(t.role&&t.role.roleId){let n=Sa.db.getProdAppID(t.role.appId);a.roles[n]=t.role.roleId}if(t.appBuilder){let n=Sa.db.getProdAppID(t.appBuilder.appId),o=a.builder?.apps||[];a.builder={apps:o.concat([n])}}t.builder&&(a.builder={global:!0}),t.admin&&(a.admin={global:!0}),a.roles}await Ve.bulkUpdate(r)}async function yC(e,t){if(!await tt())throw new Error("Unable to un-assign roles - license required.");let r=await Ve.bulkGet(e);for(let a of r){if(t.role){let n=Sa.db.getProdAppID(t.role?.appId);a.roles[n]===t.role.roleId&&delete a.roles[n]}if(t.appBuilder&&a.builder?.apps){let n=Sa.db.getProdAppID(t.appBuilder.appId);a.builder.apps=a.builder.apps.filter(o=>o!==n)}t.builder&&a.builder&&delete a.builder,t.admin&&a.admin&&delete a.admin}}var Fs={};w(Fs,{buildExportFn:()=>bC,buildImportFn:()=>AC});var ks=require("@budibase/backend-core");function AC(e){return async(t,r)=>{await tt()||t.throw(403,"Endpoint unavailable, license required."),t.request.files?.appExport||t.throw(400,"Must provide app export file for import."),await ks.context.doInAppContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}function bC(e){return async(t,r)=>{await tt()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:a,excludeRows:n}=t.request.body;await ks.context.doInAppContext(t.params.appId,async()=>{t.request.body={encryptPassword:a,excludeRows:n},t.query.appId=t.params.appId,await e(t),await r()})}}var He=require("@budibase/backend-core"),ue=require("@budibase/types");var Qs=require("@budibase/backend-core"),zf;function Jf(){zf=new Qs.queue.BudibaseQueue(Qs.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}function Dt(){return zf}var Xf=require("path"),Zf=P(require("fs"));async function Ws(e,t={}){return ve.storeAppBackupMetadata(e,t)}function em(e){let t=new Date().toISOString();switch(e){case ue.AppBackupStatus.COMPLETE:case ue.AppBackupStatus.FAILED:return{timestamp:t,finishedAt:t};case ue.AppBackupStatus.STARTED:return{timestamp:t,startedAt:t};case ue.AppBackupStatus.PENDING:return{timestamp:t,createdAt:t}}}async function IC(e,t,r,a){let n=await On(e);return await ve.storeAppBackupMetadata({...n,...em(t),contents:r,status:t,type:ue.AppBackupType.BACKUP},{filename:a,docId:e})}async function SC(e,t,r){let a=await On(e);return await ve.storeAppBackupMetadata({...a,...em(r),status:r,type:ue.AppBackupType.RESTORE,trigger:ue.AppBackupTrigger.MANUAL},{docId:e,docRev:t})}async function On(e){return ve.getAppBackupMetadata(e)}async function wC(e,t){return ve.updateAppBackupMetadata(e,t)}async function TC(e){let t=await ve.getAppBackupMetadata(e);return t.filename&&await He.objectStore.deleteFile(He.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),ve.deleteAppBackupMetadata(e)}async function vC(e,t){return ve.fetchAppBackups(e,t)}async function tm(e){let t=await ve.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let r=await He.objectStore.getReadStream(He.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}async function EC(e){let{stream:t}=await tm(e),r=(0,Xf.join)(He.objectStore.budibaseTempDir(),He.utils.newid()),a=Zf.default.createWriteStream(r);return new Promise((n,o)=>{t.on("error",o),a.on("error",o),t.pipe(a).on("close",()=>n(r))})}async function RC(e,t,r={}){let a;try{a=await Ws({appId:e,trigger:t,timestamp:new Date().toISOString(),status:ue.AppBackupStatus.PENDING,type:ue.AppBackupType.BACKUP,...r})}catch(n){if(n.status===409)return;throw n}return await Dt().add({docId:a.id,docRev:a.rev,appId:e,export:{trigger:t,...r}}),await He.events.backup.appBackupTriggered(e,a.id,ue.AppBackupType.BACKUP,t,r?.name),a.id}async function _C(e,t,r,a){let n=await On(t),o;try{o=await Ws({appId:e,timestamp:new Date().toISOString(),status:ue.AppBackupStatus.PENDING,type:ue.AppBackupType.RESTORE,createdBy:a})}catch(s){if(s?.status===409)return;throw s}return await Dt().add({appId:e,docId:o.id,docRev:o.rev,import:{nameForBackup:r,backupId:t,createdBy:a}}),{restoreId:o.id,metadata:n}}var xC={isEnabled:ps,triggerAppRestore:ye(_C),triggerAppBackup:ye(RC),getBackupDownloadStream:ye(tm),downloadAppBackup:ye(EC),fetchAppBackups:ye(vC),storeAppBackupMetadata:ye(Ws),updateBackupStatus:ye(IC),updateRestoreStatus:ye(SC),getAppBackup:ye(On),updateAppBackup:ye(wC),deleteAppBackup:ye(TC)},ot=xC;var Ks={};w(Ks,{init:()=>$s});var J=require("@budibase/backend-core");var Be=require("@budibase/types");var fr=P(require("fs"));async function $s(e){Dt().process(async t=>{let r=t.data;try{if(r.export)return LC(t,e);if(r.import)return OC(t,e)}catch(a){J.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,a)}})}async function CC(e){await J.db.getDB(e,{skip_setup:!0}).destroy()}async function rm(e,t,r,a){let n=J.db.getDevAppID(r),o=J.db.getProdAppID(r),s=new Date().toISOString(),i=async(p,m)=>{a?.doc?await ot.updateBackupStatus(a.doc.id,p,m?.contents,m?.filename):await ot.storeAppBackupMetadata({appId:o,timestamp:s,trigger:e,status:p,name:a?.name,type:Be.AppBackupType.BACKUP,contents:m?.contents,createdBy:a?.createdBy},{filename:m?.filename})};try{let p=await a.processing.exportAppFn(n,{tar:!0}),m=await a.processing.statsFn(n),f=`${o}/backup-${s}.tar.gz`,h=J.objectStore.ObjectStoreBuckets.BACKUPS,g=fr.default.createReadStream(p);await J.objectStore.streamUpload({bucket:h,filename:f,stream:g,extra:{type:"application/gzip",metadata:{name:a?.name,trigger:e,timestamp:s,appId:o}}}),await i(Be.AppBackupStatus.COMPLETE,{filename:f,contents:m}),fr.default.existsSync(p)&&fr.default.rmSync(p)}catch(p){J.logging.logAlert("App backup error",p),await i(Be.AppBackupStatus.FAILED)}}async function OC(e,t){let r=e.data,a=r.appId,n=r.import.backupId,o=r.import.nameForBackup,s=r.import.createdBy,i=J.tenancy.getTenantIDFromAppID(a);return J.tenancy.doInTenant(i,async()=>{let p=J.db.getDevAppID(a),{rev:m}=await ot.updateRestoreStatus(r.docId,r.docRev,Be.AppBackupStatus.STARTED);await rm(Be.AppBackupTrigger.RESTORING,i,a,{processing:t,createdBy:s,name:o});let f=await ot.downloadAppBackup(n);await CC(p);let h=Be.AppBackupStatus.COMPLETE;try{await t.importAppFn(p,J.db.getDB(p),{file:{type:"application/gzip",path:f},key:f})}catch(g){J.logging.logAlert("App restore error",g),h=Be.AppBackupStatus.FAILED}await ot.updateRestoreStatus(r.docId,m,h),fr.default.existsSync(f)&&fr.default.rmSync(f,{force:!0})})}async function LC(e,t){let r=e.data,a=r.appId,n=r.export.trigger,o=r.export.name,s=J.tenancy.getTenantIDFromAppID(a);await J.tenancy.doInTenant(s,async()=>{try{let{rev:i}=await ot.updateBackupStatus(r.docId,Be.AppBackupStatus.STARTED);return rm(n,s,a,{processing:t,doc:{id:r.docId,rev:i},name:o})}catch(i){J.logging.logAlert("App backup error",i)}})}var PC=async e=>{Jf(),await $s(e.processing)},Re={...ot,processing:Ks,init:PC,getBackupQueue:Dt};var am=async e=>{e.backups&&await Re.init(e.backups)};var fe={};w(fe,{create:()=>EM,find:()=>vM,get:()=>TM,remove:()=>_M,update:()=>RM});var EA=P(ki()),st=require("@budibase/backend-core");var RA=require("@budibase/types");async function TM(e){let t=st.tenancy.getGlobalDB(),r=new st.db.QueryBuilder(t.name,RA.SearchIndex.USER);r.setIndexBuilder(st.db.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[n,o]of Object.entries(e.filters?.equal??{}))r.addEqual(n,o);r.setSort("_id"),r.setSkip(e.skip);let a=await r.run();return{users:a.rows,total:a.totalRows}}async function vM(e){return await st.users.getById(e)}async function EM(e){let t=await Ve.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new st.HTTPError("User is already synched",409);e={...t,scimInfo:(0,EA.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Ve.save(e,{requirePassword:!1})}async function RM(e,t){return await Ve.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}async function _M(e){return await Ve.destroy(e)}var br={};w(br,{create:()=>xM});var _A=P(ki());var xA=require("@budibase/backend-core");async function xM(e){let t=await go(e.name),r;if(!t)r=(await j.save(e)).id;else{if(t.scimInfo?.isSync)throw new xA.HTTPError("Group is already synched",409);r=t._id,t.users&&(await j.removeUsers(r,t.users.map(n=>n._id)),delete t.users),t.scimInfo=(0,_A.default)(t.scimInfo,e.scimInfo),await j.save(t)}return await j.get(r)}var Bt={};w(Bt,{logRequest:()=>CM,logResponse:()=>OM});var Fi=require("@budibase/backend-core");async function CM(e){Fi.logging.logWarn("SCIM request log",e)}async function OM(e){Fi.logging.logWarn("SCIM response error",e)}var Vi={};w(Vi,{doInScimContext:()=>ji,feature:()=>W,internalGroupOnly:()=>$n,licenseAuth:()=>LA,licensing:()=>CA,requireSCIM:()=>Wi,scimGroupOnly:()=>Ea,scimUserOnly:()=>va});var bt=require("@budibase/backend-core");var jn=require("@budibase/types"),LM=(e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(bt.env.SELF_HOSTED&&bt.env.DEFAULT_LICENSE)return t.user.license=yo,r();t.user.license=await je.cache.getCachedLicense(t,{populateLicense:e.populateLicense,populateFreeLicense:e.populateFreeLicense}),e.checkUsersLimit&&(bt.utils.isServingApp(t)||bt.utils.isServingBuilder(t)||bt.utils.isServingBuilderPreview(t)||bt.utils.isPublicApiRequest(t))&&await Ke.usageLimitIsExceeded(jn.StaticQuotaName.USERS,jn.QuotaUsageType.STATIC)}return r()},CA=LM;var W={};w(W,{requireFeature:()=>PM,requireFeatures:()=>UM});var PM=e=>async(t,r)=>{await mn(e),await r()},UM=(...e)=>async(t,r)=>{await us(e),await r()};var Wn=require("@budibase/backend-core");var ji=async(e,t)=>(Wn.env.DISABLE_SCIM_CALLS||await Bt.logRequest({...e.request.toJSON(),body:e.request.body}),await Wn.context.doInScimContext(async()=>{let r=await t();return await Bt.logResponse({...e.response.toJSON(),body:e.response.body}),r}));var Wi=async(e,t)=>{await ds(),await t()};var OA=require("@budibase/backend-core");var va=e=>$i(OA.users.getById,e,!0),Ea=e=>$i(M.get,e,!0),$n=e=>$i(M.get,e,!1);function $i(e,t,r){return async(a,n)=>{let o=a.params[t];return typeof o!="string"&&a.throw(404),!!(await e(o)).scimInfo?.isSync!==r&&a.throw(404),n()}}var Ra=require("@budibase/backend-core");var Ki=require("dd-trace");async function LA(e,t){await Ki.tracer.trace("licenseAuth",async r=>{let a=e.request.headers[Ra.constants.Header.LICENSE_KEY];Array.isArray(a)&&(a=a[0]),r.addTags({licenseKey:a}),a||e.throw(403,"License key not provided");let n=await ns(a);n||(r.addTags({licenseFound:!1}),e.throw(403,"License not found or invalid")),n.tenantId||e.throw(403,"License does not have a tenant ID"),Ki.tracer.setUser({id:"anonymous",tenantId:n.tenantId}),await Ra.context.doInSelfHostTenantUsingCloud(n.tenantId,async()=>{await Ra.context.doInLicenseContext(n,async()=>{await t()})})})}var ru={};w(ru,{appBackups:()=>yb,auditLogs:()=>sb,environmentVariables:()=>XA,groups:()=>jA,scim:()=>Vb,users:()=>Xb});async function PA(e){let t=e.request.body;if(t.name=t.name.trim(),delete t.roles,t._id){let a=await qt(t._id);t.roles=a.roles,t.scimInfo=a.scimInfo}let r=await dr(t);e.body={_id:r.id,_rev:r.rev}}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 users to add or to remove");let n,o;r&&(n=await ws(t,r)),a&&(o=await Ts(t,a)),e.body={added:n,removed:o}}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 objects, with appId and roleId to add or remove"),e.body=await vs(t,{appsToAdd:r,appsToRemove:a})}async function DA(e){e.body={data:await ha()}}async function NA(e){let{groupId:t,rev:r}=e.params;try{await Ss(t,r),e.body={message:"Group deleted successfully"}}catch(a){e.throw(a.status,a)}}async function BA(e){try{e.body=await qt(e.params.groupId)}catch(t){e.throw(t.status,t)}}async function MA(e){let{pageSize:t=10,bookmark:r,emailSearch:a}=e.request.query,n=e.params.groupId,o={limit:t+1},s=await Fa(n,{...o,emailSearch:a,bookmark:r}),i=a?s[t]?.email:s[t]?._id,p=!!i;e.body={users:s.slice(0,t),bookmark:i,hasNextPage:p}}async function GA(e){let{groupId:t,appId:r}=e.params;await Es(t,r),e.body={message:"Group app builder access updated."}}async function kA(e){let{groupId:t,appId:r}=e.params;await Rs(t,r),e.body={message:"group app builder access removed."}}var FA=P(require("@koa/router")),be=P(require("joi"));var _e=require("@budibase/types"),ze=require("@budibase/backend-core"),QA=new FA.default;function DM(){return ze.auth.joiValidator.body(be.default.object({_id:be.default.string().optional(),_rev:be.default.string().optional(),color:be.default.string().required(),icon:be.default.string().required(),name:be.default.string().trim().required().max(50),role:be.default.string().optional(),users:be.default.array().optional(),apps:be.default.array().optional(),roles:be.default.object().optional(),createdAt:be.default.string().optional(),updatedAt:be.default.string().optional()}).required())}QA.post("/api/global/groups",ze.auth.adminOnly,W.requireFeature(_e.Feature.USER_GROUPS),DM(),PA).get("/api/global/groups",W.requireFeature(_e.Feature.USER_GROUPS),DA).delete("/api/global/groups/:groupId/:rev",W.requireFeature(_e.Feature.USER_GROUPS),ze.auth.adminOnly,$n("groupId"),NA).get("/api/global/groups/:groupId",W.requireFeature(_e.Feature.USER_GROUPS),ze.auth.builderOrAdmin,BA).get("/api/global/groups/:groupId/users",W.requireFeature(_e.Feature.USER_GROUPS),ze.auth.builderOrAdmin,MA).post("/api/global/groups/:groupId/users",ze.auth.adminOnly,W.requireFeature(_e.Feature.USER_GROUPS),$n("groupId"),UA).post("/api/global/groups/:groupId/apps",ze.auth.builderOrAdmin,W.requireFeature(_e.Feature.USER_GROUPS),qA).post("/api/global/groups/:groupId/app/:appId/builder",ze.auth.builderOrAdmin,W.requireFeatures(_e.Feature.USER_GROUPS,_e.Feature.APP_BUILDERS),GA).delete("/api/global/groups/:groupId/app/:appId/builder",ze.auth.builderOrAdmin,W.requireFeatures(_e.Feature.USER_GROUPS,_e.Feature.APP_BUILDERS),kA);var jA=QA;var Yi=require("@budibase/types");var Hi=require("@budibase/backend-core");async function WA(e){e.body={encryptionKeyAvailable:Ye.isEncryptionKeyAvailable()}}async function $A(e){e.body={variables:await Ye.fetch()}}async function KA(e){let{name:t,production:r,development:a}=e.request.body;await Ye.update(t,{production:r,development:a});let n=[Yi.AppEnvironment.PRODUCTION];r!==a&&n.push(Yi.AppEnvironment.DEVELOPMENT),await Hi.events.environmentVariable.created(t,n),e.body={message:`Environment variable "${t}" created.`}}async function VA(e){let{production:t,development:r}=e.request.body,a=e.params.varName;await Ye.update(a,{production:t,development:r}),e.body={message:`Environment variable "${a}" updated.`}}async function YA(e){let t=e.params.varName;await Ye.remove(t),await Hi.events.environmentVariable.deleted(t),e.body={message:`Environment variable "${t}" deleted.`}}var Mt=require("@budibase/backend-core"),zA=P(require("@koa/router")),_a=P(require("joi")),JA=new zA.default;function HA(){return Mt.auth.joiValidator.body(_a.default.object({name:_a.default.string().optional(),production:_a.default.string().required(),development:_a.default.string().required()}))}JA.get("/api/env/variables/status",Mt.auth.builderOrAdmin,WA).get("/api/env/variables",Mt.auth.builderOrAdmin,$A).post("/api/env/variables",Mt.auth.builderOrAdmin,HA(),KA).patch("/api/env/variables/:varName",Mt.auth.builderOrAdmin,HA(),VA).delete("/api/env/variables/:varName",Mt.auth.builderOrAdmin,YA);var XA=JA;var zi=require("@budibase/backend-core");async function ZA(e){let t=e.request.body,r=await At.fetch(t);await zi.events.auditLog.filtered(t),e.body=r}async function eb(e){let t=e.request.body,{stream:r}=At.download(t);await zi.events.auditLog.downloaded(t),e.attachment(`audit-logs-${Date.now()}.log`),e.body=r}async function tb(e){e.body={events:At.definitions()}}var ab=require("@budibase/types"),Gt=require("@budibase/backend-core"),nb=P(require("@koa/router")),xe=P(require("joi"));function rb(){return Gt.auth.joiValidator.body(xe.default.object({userIds:xe.default.array().items(xe.default.string()).optional(),appIds:xe.default.array().items(xe.default.string()).optional(),events:xe.default.array().items(xe.default.string().valid(...Object.values(ab.Event))).optional(),startDate:xe.default.string().optional().allow(""),endDate:xe.default.string().optional().allow(""),fullSearch:xe.default.string().optional().allow(""),bookmark:xe.default.number()}))}var ob=new nb.default;ob.post("/api/global/auditlogs/search",Gt.auth.adminOnly,rb(),ZA).get("/api/global/auditlogs/download",Gt.auth.adminOnly,Gt.middleware.querystringToBody,rb(),eb).get("/api/global/auditlogs/definitions",Gt.auth.adminOnly,tb);var sb=ob;var Ji=require("@budibase/types");var ib=require("@budibase/backend-core");async function Ir(e,t){await Vt.appExists(t)||e.throw(400,`Provided app ID: ${t} - is invalid.`)}async function ub(e){let t=e.params.appId;await Ir(e,t);let r=e.request.body,a=e.user?._id,n=await Re.triggerAppBackup(t,Ji.AppBackupTrigger.MANUAL,{name:r.name,createdBy:a});n||e.throw(500,"Unable to start backup."),e.body={backupId:n,message:"Backup triggered - process starting."}}async function pb(e){let t=e.params.appId;await Ir(e,t);let r=e.params.backupId,a=e.request.body.name,n=await Re.triggerAppRestore(t,r,a,e.user?._id);n||e.throw(500,"Unable to start restore."),await ib.events.backup.appBackupRestored(n.metadata),e.body={restoredId:n?.restoreId,message:"Restore triggered - process starting."}}async function cb(e){let t=e.params.appId;await Ir(e,t);let r=e.params.backupId;await Re.deleteAppBackup(r),e.body={message:"Backup deleted successfully."}}async function lb(e){let t=e.params.appId;await Ir(e,t);let r=e.request.body;r?.trigger&&(r.trigger=r.trigger.toLowerCase(),Object.values(Ji.AppBackupTrigger).includes(r.trigger)||e.throw(400,"Provided trigger is not a valid option.")),e.body=await Re.fetchAppBackups(t,{paginate:!0,...r})}async function fb(e){let t=e.params.appId;await Ir(e,t);let r=e.params.backupId,a=e.request.body;e.body=await Re.updateAppBackup(r,a.name)}async function mb(e){let t=e.params.appId;await Ir(e,t);let r=e.params.backupId,{metadata:a,stream:n}=await Re.getBackupDownloadStream(r);e.attachment(`backup-${a.timestamp}.tar.gz`),e.body=n}var gb=P(require("@koa/router")),kt=P(require("joi")),Kn=require("@budibase/types"),It=require("@budibase/backend-core"),hb=new gb.default;function GM(){return It.auth.joiValidator.body(kt.default.object({trigger:kt.default.string().valid(...Object.values(Kn.AppBackupTrigger)),type:kt.default.string().valid(...Object.values(Kn.AppBackupType)),startDate:kt.default.date(),endDate:kt.default.date(),page:kt.default.string()}))}hb.post("/api/apps/:appId/backups",It.auth.builderOrAdmin,ub).post("/api/apps/:appId/backups/search",It.auth.builderOrAdmin,GM(),lb).get("/api/apps/:appId/backups/:backupId/file",It.auth.builderOrAdmin,mb).patch("/api/apps/:appId/backups/:backupId",It.auth.builderOrAdmin,fb).delete("/api/apps/:appId/backups/:backupId",It.auth.builderOrAdmin,cb).post("/api/apps/:appId/backups/:backupId/import",It.auth.builderOrAdmin,pb);var yb=hb;var Kb=P(require("@koa/router"));var Vn=require("scim-patch");var bb=require("@budibase/backend-core");function Ab(e,t){let r=e.request.query[t];if(r!==void 0)return+r}var Ib=async e=>{let t=Ab(e,"pageSize")??20,r=Ab(e,"startIndex"),a;e.request.query.filter&&(a=V.user.userFilters(e.request.query.filter));let n=await fe.get({pageSize:t,skip:r,filters:a});e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:n.total,Resources:n.users.map(V.user.toScimUserResponse),startIndex:(r||0)+1,itemsPerPage:t}},Sb=async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404);let r=await fe.find(t);e.body=V.user.toScimUserResponse(r)},wb=async e=>{let t=V.user.fromScimUser(e.request.body);try{let r=await fe.create(t);e.body=V.user.toScimUserResponse(r)}catch(r){throw r instanceof bb.EmailUnavailableError&&e.throw(409,"Email already in use"),r}};function kM(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}var Tb=async e=>{let t=await fe.find(e.params.id);t||e.throw(404);let r=V.user.toScimUserResponse(t),a=e.request.body;try{(0,Vn.patchBodyValidation)(a)}catch{}if(kM(a))return Xi(e);let n;try{n=(0,Vn.scimPatch)(r,a.Operations)}catch{}n||e.throw(500);let o=V.user.fromScimUser(n);await fe.update(o,{allowChangingEmail:!0}),e.body=V.user.toScimUserResponse(o)},Xi=async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404),await fe.remove(t),e.status=204};var Mb=P(Bb()),Gb=require("@budibase/shared-core"),Yn=require("scim-patch");var Hn=require("scim2-parse-filter");function kb(e,t){for(let r of t.split(","))delete e[r]}var Fb=async e=>{let r=(await j.fetch()).filter(o=>o.scimInfo?.isSync).map(V.group.toScimGroupResponse),{filter:a,excludedAttributes:n}=e.request.query;if(a){let o=(0,Hn.filter)((0,Hn.parse)(a));r=r.filter(o)}n&&r.forEach(o=>{kb(o,n)}),e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:r.length,Resources:r,startIndex:1,itemsPerPage:r.length}},Qb=async e=>{let t=V.group.fromScimGroup(e.request.body),r=await br.create(t);e.body=V.group.toScimGroupResponse(r)},jb=async e=>{let{id:t}=e.params,r=await j.get(t),a=V.group.toScimGroupResponse(r),{excludedAttributes:n}=e.request.query;n&&kb(a,n),e.body=a},Wb=async e=>{let{id:t}=e.params,r=await j.get(t);await j.remove(t,r._rev),e.status=204},$b=async e=>{let{id:t}=e.params,r=await j.get(t),a=V.group.toScimGroupResponse(r),n=e.request.body;try{(0,Yn.patchBodyValidation)(n)}catch{e.throw(400)}let{true:o,false:s}=(0,Mb.default)(n.Operations,i=>i.path==="members");if(s?.length){let i=(0,Yn.scimPatch)(a,s);i||e.throw(500);let p={...V.group.fromScimGroup(i),_rev:r._rev};await j.save(p)}if(o?.length){let i=[],p=[];for(let{op:m,value:f}of o)switch(m){case"add":case"Add":for(let h of f)i.push(await fe.find(h.value));break;case"remove":case"Remove":for(let h of f)p.push(await fe.find(h.value));break;case"replace":case"Replace":throw new Error("Replacing members is not allowed");default:Gb.utils.unreachable(m)}i.length&&await j.addUsers(t,i.map(m=>m._id)),p.length&&await j.removeUsers(t,p.map(m=>m._id))}e.body=V.group.toScimGroupResponse(await j.get(t))};var xa=require("@budibase/types"),Ie=new Kb.default({prefix:"/api/global/scim/v2"});Ie.use(Wi);Ie.use(ji);Ie.get("/users",Ib);Ie.get("/users/:id",va("id"),Sb);Ie.post("/users",wb);Ie.patch("/users/:id",va("id"),Tb);Ie.delete("/users/:id",va("id"),Xi);Ie.get("/groups",Fb);Ie.post("/groups",W.requireFeature(xa.Feature.USER_GROUPS),Qb);Ie.get("/groups/:id",W.requireFeature(xa.Feature.USER_GROUPS),Ea("id"),jb);Ie.delete("/groups/:id",W.requireFeature(xa.Feature.USER_GROUPS),Ea("id"),Wb);Ie.patch("/groups/:id",W.requireFeature(xa.Feature.USER_GROUPS),Ea("id"),$b);var Vb=Ie;var zb=P(require("@koa/router"));var Zi=require("@budibase/backend-core");async function Yb(e){let{userId:t,appId:r}=e.params,a=await at.db.getUser(t);if(Zi.users.isGlobalBuilder(a)){e.body={message:"User already admin - no permissions updated."};return}await at.addAppBuilder(a,r),e.body={message:`User "${a.email}" app builder access updated.`}}async function Hb(e){let{userId:t,appId:r}=e.params,a=await at.db.getUser(t);if(Zi.users.isGlobalBuilder(a)){e.body={message:"User already admin - no permissions removed."};return}await at.removeAppBuilder(a,r),e.body={message:`User "${a.email}" app builder access removed.`}}var eu=require("@budibase/types"),tu=require("@budibase/backend-core"),Jb=new zb.default;Jb.post("/api/global/users/:userId/app/:appId/builder",tu.auth.builderOrAdmin,W.requireFeatures(eu.Feature.APP_BUILDERS),Yb).delete("/api/global/users/:userId/app/:appId/builder",tu.auth.builderOrAdmin,W.requireFeatures(eu.Feature.APP_BUILDERS),Hb);var Xb=Jb;var V={};w(V,{group:()=>nu,user:()=>au});var au={};w(au,{fromScimUser:()=>gG,toScimUserResponse:()=>dG,userFilters:()=>hG});var zn=require("@budibase/types"),Zb=require("scim2-parse-filter"),eI=require("@budibase/backend-core"),tI=require("@budibase/shared-core"),{unreachable:lG}=tI.utils,dG=e=>{let{isSync:t,roles:r,...a}=e.scimInfo||{},n={...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===zn.UserStatus.ACTIVE};return(e.firstName||e.lastName)&&(n.name={formatted:[e.firstName,e.lastName].filter(o=>o).join(" "),familyName:e.lastName,givenName:e.firstName}),n},fG=e=>!!e?.id;function mG(e){if(eI.utils.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}var gG=e=>{let t=fG(e)?e:void 0,r=mG(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:lG(e.active)}let n,o;return e.name?.givenName?(n=e.name?.givenName,o=e.name?.familyName):n=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:n,lastName:o,scimInfo:{...e,isSync:!0},roles:{},status:a?zn.UserStatus.ACTIVE:zn.UserStatus.INACTIVE,createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},hG=e=>{let t={equal:{}},r=(0,Zb.parse)(e);function a(n){switch(n.op){case"eq":{let o=n.attrPath,s;switch(o){case"emails.value":s="email";break;default:s=`scimInfo.${o}`}t.equal[s]=n.compValue;break}case"and":for(let o of n.filters)a(o);break;default:console.warn("Filter not handled",{filter:n})}}return a(r),t};var nu={};w(nu,{fromScimGroup:()=>bG,toScimGroupResponse:()=>yG});var yG=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}))}),AG=e=>!!e?.id,bG=e=>{let t=AG(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()}};var xu={};w(xu,{LLM:()=>Je,LLMRequest:()=>$,TableGeneration:()=>_u,agentHistoryTitleSystemPrompt:()=>OG,agentSystemPrompt:()=>CG,aiColumnSchemas:()=>Eu,aiTableResponseToTableSchema:()=>Su,appendAIColumns:()=>wu,classifyText:()=>iu,cleanData:()=>uu,extractFileData:()=>EG,generateAIColumns:()=>bu,generateCode:()=>xG,generateCronExpression:()=>pu,generateData:()=>Iu,generateJs:()=>fu,generateSQL:()=>_G,generateTables:()=>Au,generationStructure:()=>vu,getLLM:()=>La,getLLMConfig:()=>yu,getLLMOrThrow:()=>lI,normalizeContentType:()=>ou,parseResponseFormat:()=>Xn,sanitiseToolName:()=>IG,searchWeb:()=>du,sentimentAnalysis:()=>lu,summarizeText:()=>Jn,tableDataStructuredOutput:()=>Ru,translate:()=>cu});var Ca=require("@budibase/types");function IG(e){if(e.length>64)throw new Error("Tool name must be under 64 characters long");return e.replace(/[^a-zA-Z0-9_-]/g,"_")}function ou(e){return e?e.includes("/")?e:{[Ca.SupportedFileType.PDF]:"application/pdf",[Ca.SupportedFileType.JPG]:"image/jpeg",[Ca.SupportedFileType.JPEG]:"image/jpeg",[Ca.SupportedFileType.PNG]:"image/png"}[e.toLowerCase()]||"application/octet-stream":"application/octet-stream"}var ao=require("@budibase/types");var Xe=require("@budibase/backend-core"),iI=require("@budibase/types");var Zn=P(require("openai"));var St=require("@budibase/types");var rI=require("@budibase/shared-core");var wt=P(require("dd-trace"));function su(e,t){return t.map(r=>e[r]).join(" ")}var Je=class{constructor({model:t,apiKey:r,maxTokens:a}){this._model=t,this._apiKey=r,this._maxTokens=a??parseInt(process.env.BUDIBASE_AI_MAX_PROMPT_TOKENS||"300")}get model(){return this._model}get apiKey(){return this._apiKey}get maxTokens(){return this._maxTokens}async prompt(t){return await wt.default.trace("prompt",async()=>{let r=typeof t=="string"?new $().addUserMessage(t):t,{messages:a,tokensUsed:n}=await wt.default.trace("chatCompletion",()=>this.chatCompletion(r));return!a||a.length===0?{message:"",tokensUsed:n}:{message:a[a.length-1].content||"",tokensUsed:n}})}async chat(t){return await wt.default.trace("chat",async()=>await this.chatCompletion(t))}async*chatStream(t){yield*this.chatCompletionStream(t)}async summarizeText(t){return wt.default.trace("summarizeText",()=>this.prompt(Jn(t)))}async generateCronExpression(t){return wt.default.trace("generateCronExpression",()=>this.prompt(pu(t)))}async operation(t,r){return wt.default.trace("operation",a=>{a.addTags({operation:t.operation,rowId:r.id});let n=this.promptForOperation(t,r);return this.prompt(n)})}promptForOperation(t,r){let{operation:a,column:n,columns:o,language:s,categories:i,prompt:p}=t;switch(a){case St.AIOperationEnum.SUMMARISE_TEXT:return Jn(su(r,o));case St.AIOperationEnum.CLEAN_DATA:return uu(r[n]);case St.AIOperationEnum.TRANSLATE:return cu(r[n],s);case St.AIOperationEnum.CATEGORISE_TEXT:if(!i)throw Error("No categories provided for categorise text operation. Please provide categories.");return iu(su(r,o),i.split(","));case St.AIOperationEnum.SENTIMENT_ANALYSIS:return lu(r[n]);case St.AIOperationEnum.PROMPT:return p;case St.AIOperationEnum.SEARCH_WEB:return du(su(r,o));default:throw rI.utils.unreachable(a)}}async generateJs(t,r){return await wt.default.trace("generateJs",async()=>{let{bindings:a=[],snippets:n=[]}=r||{};return await this.prompt(fu(a,n).addUserMessage(t))})}};var nI=require("@budibase/types"),mu=require("openai/helpers/zod");function Xn(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}function aI(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}var Ce=class extends Je{constructor(r){super(r);this.client=this.getClient(r)}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new Zn.default({apiKey:r.apiKey})}async uploadFile(r,a,n){let o=ou(n);if(nI.ImageContentTypes.includes(o.toLowerCase())){let p;if(Buffer.isBuffer(r))p=r;else{let f=[];for await(let h of r)f.push(h);p=Buffer.concat(f)}let m=p.toString("base64");return`data:${o};base64,${m}`}let s=await(0,Zn.toFile)(r,a);return(await this.client.files.create({file:s,purpose:"assistants"})).id}async chatCompletion(r){let a={model:this.model,messages:r.messages,max_tokens:this.maxTokens,response_format:Xn(r.format)};r.tools&&r.tools.length>0&&(a.tool_choice="auto",a.tools=r.tools.map(mu.zodFunction));let n=await this.client.chat.completions.create(a),o=n.choices[0]?.message;if(o?.tool_calls){r.addMessage(o);let s=[];for(let i of o.tool_calls){let p=r.findTool(i.function.name);if(!p)throw new Error(`Tool ${i.function.name} not found in prompt tools`);let m=JSON.parse(i.function.arguments);s.push(p.handler(m).then(f=>({role:"tool",tool_call_id:i.id,content:f})).catch(f=>(console.error(`[OPENAI TOOL ERROR] Tool ${i.function.name} failed in OpenAI handler:`,f),{role:"tool",tool_call_id:i.id,content:`Error: ${f.message}`})))}return r.addMessages(await Promise.all(s)),this.chatCompletion(r)}else{if(o?.content)return{messages:[...r.messages,{role:o.role,content:o.content}],tokensUsed:aI(n.usage)};throw new Error("No response found")}}async*chatCompletionStream(r){let a={model:this.model,messages:r.messages,max_tokens:this.maxTokens,response_format:Xn(r.format),stream:!0};r.tools&&r.tools.length>0&&(a.tool_choice="auto",a.tools=r.tools.map(mu.zodFunction));try{let n=await this.client.chat.completions.create(a),o=null,s="",i=null;for await(let m of n){let f=m.choices[0]?.delta;if(f){if(f.content&&(s+=f.content,yield{type:"content",content:f.content}),f.tool_calls&&f.tool_calls.length>0){let h=f.tool_calls[0];h.id?(o={id:h.id,name:h.function?.name||"",arguments:h.function?.arguments||""},yield{type:"tool_call_start",toolCall:{id:o.id,name:o.name,arguments:o.arguments}}):o&&h.function?.arguments&&(o.arguments+=h.function.arguments,yield{type:"tool_call_start",toolCall:{id:o.id,name:o.name,arguments:o.arguments}})}m.usage&&(i=m.usage)}}let p=i?aI(i):0;if(o){r.addMessage({role:"assistant",content:"",tool_calls:[{id:o.id,type:"function",function:{name:o.name,arguments:o.arguments}}]});let m=r.findTool(o.name);if(m)try{let f=JSON.parse(o.arguments),h=await m.handler(f);yield{type:"tool_call_result",toolResult:{id:o.id,result:h}},r.addMessage({role:"tool",tool_call_id:o.id,content:h}),yield*this.chatCompletionStream(r);return}catch(f){yield{type:"tool_call_result",toolResult:{id:o.id,result:`Error: ${f.message}`,error:f.message}},r.addMessage({role:"tool",tool_call_id:o.id,content:`Error: ${f.message}`}),yield*this.chatCompletionStream(r);return}else{let f=`Tool '${o.name}' not found`;yield{type:"tool_call_result",toolResult:{id:o.id,result:f,error:f}},r.addMessage({role:"tool",tool_call_id:o.id,content:f}),yield*this.chatCompletionStream(r);return}}s&&r.addMessage({role:"assistant",content:s}),yield{type:"done",messages:r.messages,tokensUsed:p}}catch(n){yield{type:"error",content:n.message}}}};var ee=require("@budibase/backend-core"),oI=require("@budibase/types");var gu=require("dd-trace"),eo=class extends Je{async prompt(t){let r=await super.prompt(t);return r.tokensUsed&&await Sn(r.tokensUsed),r}async chat(t){let r=await super.chat(t);return r.tokensUsed&&await Sn(r.tokensUsed),r}async uploadFile(t,r,a){return ee.env.SELF_HOSTED?this.uploadFileSelfHost(t,r,a):this.uploadFileCloud(t,r,a)}async uploadFileCloud(t,r,a){return new Ce({apiKey:ee.env.OPENAI_API_KEY,model:this.model,maxTokens:this.maxTokens}).uploadFile(t,r,a)}async uploadFileSelfHost(t,r,a){let n;if(Buffer.isBuffer(t))n=t;else{let p=[];for await(let m of t)p.push(m);n=Buffer.concat(p)}let o=n.toString("base64");if(a&&oI.ImageContentTypes.includes(a.toLowerCase()))return`data:image/jpeg;base64,${o}`;if(!ee.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let p=await dn();if(!p)throw new Error("No license key found");this._apiKey=p}let s=await fetch(`${ee.env.BUDICLOUD_URL}/api/ai/upload-file`,{method:"POST",headers:{"Content-Type":"application/json",[ee.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:o,filename:r,contentType:a})});if(!s.ok)throw await ee.HTTPError.fromResponse(s);return(await s.json()).fileId}async chatCompletion(t){return ee.env.SELF_HOSTED?this.chatCompletionSelfHost(t):this.chatCompletionCloud(t)}async chatCompletionCloud(t){return await gu.tracer.trace("chatCompletionCloud",async()=>await new Ce({apiKey:ee.env.OPENAI_API_KEY,model:this.model,maxTokens:this.maxTokens}).chatCompletion(t))}async chatCompletionSelfHost(t){return await gu.tracer.trace("chatCompletionSelfHost",async r=>{if(!ee.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(r.addTags({budicloudUrl:ee.env.BUDICLOUD_URL}),!this._apiKey){let o=await dn();if(!o)throw new Error("No license key found");this._apiKey=o,r.addTags({licenseKey:this._apiKey})}let a={messages:t.messages,format:t.format,useTools:t.tools.length>0},n=await fetch(`${ee.env.BUDICLOUD_URL}/api/ai/chat`,{method:"POST",headers:{"Content-Type":"application/json",[ee.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(a)});if(!n.ok)throw await ee.HTTPError.fromResponse(n);return await n.json()})}async*chatCompletionStream(t){ee.env.SELF_HOSTED?yield*this.chatCompletionStreamSelfHost(t):yield*this.chatCompletionStreamCloud(t)}async*chatCompletionStreamCloud(t){yield*new Ce({apiKey:ee.env.OPENAI_API_KEY,model:this.model,maxTokens:this.maxTokens}).chatCompletionStream(t)}async*chatCompletionStreamSelfHost(t){try{let r=await this.chatCompletionSelfHost(t);if(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){yield{type:"error",content:r.message}}}};var Oa=require("dd-trace");var hu=P(require("@anthropic-ai/sdk"));function SG(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}var to=class extends Je{constructor(r){super(r);this.client=new hu.default({apiKey:r.apiKey})}firstTextBlock(r){for(let a of r.content)if(a.type==="text")return a.text}async uploadFile(r,a,n){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:o})=>{if(o==null)return{role:"user",content:""};if(typeof o=="string")return{role:"user",content:o};let s="";for(let i of o)i.type==="text"?s+=i.text:["image_url","input_audio","file"].includes(i.type);return{role:"user",content:s}}),max_tokens:this.maxTokens}),n=this.firstTextBlock(a)||"";return{messages:[...r.messages,{role:"assistant",content:n}],tokensUsed:SG(a.usage)}}catch(a){throw a instanceof hu.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 n=a.messages[a.messages.length-1];n.content&&(yield{type:"content",content:n.content})}yield{type:"done",messages:a.messages,tokensUsed:a.tokensUsed}}catch(a){yield{type:"error",content:a.message}}}};var uI=require("zod"),pI=require("openai/helpers/zod");var sI=require("openai"),ro=class extends Ce{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 sI.AzureOpenAI({apiKey:t.apiKey,apiVersion:"2024-10-01-preview",baseURL:t.baseUrl})}};var cI="gpt-4o-mini",wG={OpenAI:Ce,TogetherAI:Ce,AzureOpenAI:ro,Custom:Ce,Anthropic:to,BudibaseAI:eo};async function TG(){return await Oa.tracer.trace("getAIConfig",async e=>{let t={type:iI.ConfigType.AI,config:{}};if(!Xe.context.isSelfHostUsingCloud()){let a=await Xe.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||cI,apiKey:r.apiKey,baseUrl:r.baseUrl}})}async function vG(){return Oa.tracer.trace("getSelfHostOpenAIKeyConfig",e=>{if(!Xe.env.SELF_HOSTED){e.addTags({enabled:!1,reason:"not self host"});return}if(!Xe.env.OPENAI_API_KEY){e.addTags({enabled:!1,reason:"no OPENAI_API_KEY"});return}return e.addTags({enabled:!0}),{provider:"OpenAI",model:cI,apiKey:Xe.env.OPENAI_API_KEY}})}async function yu(){return Oa.tracer.trace("getLLMConfig",async()=>await TG()||await vG())}async function La(e){return await Oa.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:a}=e||{},n=await yu();if(!n){t.addTags({enabled:!1,reason:"no config found"});return}r&&(n.model=r),a&&(n.maxTokens=a);let o=wG[n.provider];if(!o){t.addTags({enabled:!1,reason:"no provider found",provider:n.provider});return}return new o(n)})}async function lI(){let e=await La();if(!e)throw new Xe.HTTPError("No available LLM configurations",500);return e}var $=class e{constructor(){this.messages=[];this.tools=[]}addTool(t){return this.tools.push(t),this}addTools(t){return this.tools.push(...t),this}findTool(t){return this.tools.find(r=>r.name===t)}withFormat(t){return t instanceof uI.z.ZodType?this.format=(0,pI.zodResponseFormat)(t,"key"):this.format=t,this}addMessage(t){return this.messages.push(t),this}addMessages(t){return this.messages.push(...t),this}addUserMessage(t){return this.messages.push({role:"user",content:t}),this}addSystemMessage(t){return this.messages.push({role:"system",content:t}),this}static fromRequest(t){let r=new e;return t.messages&&r.addMessages(t.messages),t.format&&r.withFormat(t.format),r}};var it=require("zod");function Jn(e,t){let r=`Summarize this text:
|
|
39
39
|
${e}`,a="";if(t)switch(t){case ao.SummariseLength.SHORT:a="In 1-2 concise sentences, ";break;case ao.SummariseLength.MEDIUM:a="In 2-3 paragraphs, ";break;case ao.SummariseLength.LONG:a="In multiple detailed paragraphs, ";break}return new $().addUserMessage(`${a}${r}.
|
|
40
40
|
Only return the summary.`)}function EG(e,t){let r=["You are a data extraction assistant.","Extract data from the attached document/image that matches the provided schema.","The schema defines the structure where values like 'string', 'number', 'boolean' indicate the expected data types.","Extract all items that match the schema from the document.","Return the data in json format","If no matching data is found, return an empty data array."].join(`
|
|
41
41
|
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"dist"
|
|
5
5
|
],
|
|
6
6
|
"license": "UNLICENSED",
|
|
7
|
-
"version": "3.12.
|
|
7
|
+
"version": "3.12.12",
|
|
8
8
|
"description": "Budibase Pro (Backend)",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"types": "dist/index.d.ts",
|
|
@@ -73,5 +73,5 @@
|
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
},
|
|
76
|
-
"gitHead": "
|
|
76
|
+
"gitHead": "77b10df86f5e46825b5e894f9eec9b8f401e4a45"
|
|
77
77
|
}
|