@budibase/server 3.18.14 → 3.18.15
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/automation.js +1 -1
- package/dist/automation.js.map +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/query.js +1 -1
- package/dist/query.js.map +2 -2
- package/package.json +2 -2
package/dist/query.js
CHANGED
|
@@ -752,7 +752,7 @@ d/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR
|
|
|
752
752
|
mwIDAQAB
|
|
753
753
|
-----END PUBLIC KEY-----
|
|
754
754
|
`;function nI(e){return gre.default.verify(e,USr,{algorithms:["RS256"]})}a(nI,"verifyLicenseToken");function jSr(e,t){return gre.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}a(jSr,"sign");var _M={};oe(_M,{getFeatures:()=>yre});var MSr={free:[...Ku.SELF_FREE_LICENSE.features],premium:void 0,premium_plus:["appBackups","branding","syncAutomations","appBuilders","viewPermissions","triggerAutomationRun","viewReadonlyColumns","aiCustomConfigs","pdf","budibaseAI"],premium_plus_trial:["appBackups","branding","syncAutomations","appBuilders","viewPermissions","triggerAutomationRun","viewReadonlyColumns","aiCustomConfigs","pdf","budibaseAI"],pro:["userGroups","appBackups"],team:["userGroups","appBackups"],business:["userGroups","appBackups","environmentVariables","auditLogs","branding","syncAutomations","appBuilders","expandedPublicApi","viewPermissions","pdf","budibaseAI"],enterprise_basic:["userGroups","appBackups","environmentVariables","enforceableSSO","auditLogs","branding","syncAutomations","offline","appBuilders","expandedPublicApi","viewPermissions","triggerAutomationRun","scim","viewReadonlyColumns","aiCustomConfigs","pwa","customAppScripts","pdf","budibaseAI","recaptcha","pkceOidc"],enterprise_basic_trial:["userGroups","appBackups","environmentVariables","enforceableSSO","branding","syncAutomations","appBuilders","expandedPublicApi","viewPermissions","triggerAutomationRun","scim","viewReadonlyColumns","aiCustomConfigs","pwa","customAppScripts","pdf","budibaseAI","recaptcha","pkceOidc"],enterprise:["userGroups","appBackups","environmentVariables","enforceableSSO","auditLogs","branding","syncAutomations","offline","appBuilders","expandedPublicApi","viewPermissions","triggerAutomationRun","scim","viewReadonlyColumns","aiCustomConfigs","pwa","customAppScripts","pdf","budibaseAI","recaptcha","pkceOidc"]},BSr={free:[...Ku.CLOUD_FREE_LICENSE.features],premium:["appBackups","branding","appBuilders","viewPermissions","pdf"],premium_plus:["appBackups","branding","syncAutomations","appBuilders","viewPermissions","triggerAutomationRun","viewReadonlyColumns","budibaseAI","pdf"],premium_plus_trial:["appBackups","branding","syncAutomations","appBuilders","viewPermissions","triggerAutomationRun","viewReadonlyColumns","budibaseAI","pdf"],pro:["userGroups","appBackups","branding"],team:["userGroups","appBackups","branding"],business:["userGroups","appBackups","environmentVariables","auditLogs","branding","syncAutomations","appBuilders","expandedPublicApi","viewPermissions","budibaseAI","pdf"],enterprise_basic:["userGroups","appBackups","environmentVariables","enforceableSSO","auditLogs","branding","syncAutomations","offline","appBuilders","expandedPublicApi","viewPermissions","triggerAutomationRun","scim","viewReadonlyColumns","aiCustomConfigs","budibaseAI","pwa","customAppScripts","pdf","recaptcha","pkceOidc"],enterprise_basic_trial:["userGroups","appBackups","environmentVariables","enforceableSSO","branding","syncAutomations","appBuilders","expandedPublicApi","viewPermissions","triggerAutomationRun","scim","viewReadonlyColumns","aiCustomConfigs","budibaseAI","pwa","customAppScripts","pdf","recaptcha","pkceOidc"],enterprise:["userGroups","appBackups","environmentVariables","enforceableSSO","auditLogs","branding","syncAutomations","appBuilders","expandedPublicApi","viewPermissions","triggerAutomationRun","scim","viewReadonlyColumns","aiCustomConfigs","budibaseAI","pwa","customAppScripts","pdf","recaptcha","pkceOidc"]};function yre(e,t){let r=[];function n(i){let o=i[t];if(!o)throw new Error(`Features do not exist for planType=${t} and hosting=${e}`);return o}switch(a(n,"readFeatures"),e){case"self":r=n(MSr);break;case"cloud":r=n(BSr);break}return r}a(yre,"getFeatures");var SM={};oe(SM,{UNLIMITED:()=>ye,getQuotas:()=>bre});var ee=fm,SXe=Ku,ye=-1,aI=a(e=>e*1e6,"millions"),qSr={free:{...SXe.CLOUD_FREE_LICENSE.quotas},premium:{usage:{monthly:{...ee.queries(ye),...ee.automations(1e3),...ee.budibaseAICredits(0),...ee.actions(ye)},static:{...ee.rows(1e4),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(0),...ee.plugins(ye),...ee.customAIConfigurations(0)}},constant:{...ee.automationLogRetentionDays(7),...ee.appBackupRetentionDays(7)}},premium_plus:{usage:{monthly:{...ee.queries(ye),...ee.automations(5e3),...ee.budibaseAICredits(aI(2)),...ee.actions(ye)},static:{...ee.rows(25e3),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(0),...ee.plugins(ye),...ee.customAIConfigurations(1)}},constant:{...ee.automationLogRetentionDays(30),...ee.appBackupRetentionDays(30)}},premium_plus_trial:{usage:{monthly:{...ee.queries(ye),...ee.automations(5e3),...ee.budibaseAICredits(aI(2)),...ee.actions(ye)},static:{...ee.rows(25e3),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(0),...ee.plugins(ye),...ee.customAIConfigurations(1)}},constant:{...ee.automationLogRetentionDays(30),...ee.appBackupRetentionDays(30)}},pro:{usage:{monthly:{...ee.queries(ye),...ee.automations(1e3),...ee.budibaseAICredits(0),...ee.actions(ye)},static:{...ee.rows(ye),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(5),...ee.plugins(ye),...ee.customAIConfigurations(0)}},constant:{...ee.automationLogRetentionDays(7),...ee.appBackupRetentionDays(7)}},team:{usage:{monthly:{...ee.queries(ye),...ee.automations(5e3),...ee.budibaseAICredits(0),...ee.actions(ye)},static:{...ee.rows(ye),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(10),...ee.plugins(ye),...ee.customAIConfigurations(0)}},constant:{...ee.automationLogRetentionDays(30),...ee.appBackupRetentionDays(90)}},business:{usage:{monthly:{...ee.queries(ye),...ee.automations(1e4),...ee.budibaseAICredits(0),...ee.actions(ye)},static:{...ee.rows(5e4),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(50),...ee.plugins(ye),...ee.customAIConfigurations(0)}},constant:{...ee.automationLogRetentionDays(365),...ee.appBackupRetentionDays(365)}},enterprise_basic:{usage:{monthly:{...ee.queries(ye),...ee.automations(ye),...ee.budibaseAICredits(aI(4)),...ee.actions(ye)},static:{...ee.rows(ye),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(ye),...ee.plugins(ye),...ee.customAIConfigurations(ye)}},constant:{...ee.automationLogRetentionDays(ye),...ee.appBackupRetentionDays(ye)}},enterprise_basic_trial:{usage:{monthly:{...ee.queries(ye),...ee.automations(ye),...ee.budibaseAICredits(aI(4)),...ee.actions(ye)},static:{...ee.rows(ye),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(ye),...ee.plugins(ye),...ee.customAIConfigurations(ye)}},constant:{...ee.automationLogRetentionDays(15),...ee.appBackupRetentionDays(15)}},enterprise:{usage:{monthly:{...ee.queries(ye),...ee.automations(ye),...ee.budibaseAICredits(aI(4)),...ee.actions(ye)},static:{...ee.rows(ye),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(ye),...ee.plugins(ye),...ee.customAIConfigurations(ye)}},constant:{...ee.automationLogRetentionDays(ye),...ee.appBackupRetentionDays(ye)}}},$Sr={free:{...SXe.SELF_FREE_LICENSE.quotas},premium:void 0,premium_plus:{usage:{monthly:{...ee.queries(ye),...ee.automations(ye),...ee.budibaseAICredits(0),...ee.actions(ye)},static:{...ee.rows(ye),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(0),...ee.plugins(ye),...ee.customAIConfigurations(1)}},constant:{...ee.automationLogRetentionDays(30),...ee.appBackupRetentionDays(30)}},premium_plus_trial:{usage:{monthly:{...ee.queries(ye),...ee.automations(ye),...ee.budibaseAICredits(0),...ee.actions(ye)},static:{...ee.rows(ye),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(0),...ee.plugins(ye),...ee.customAIConfigurations(1)}},constant:{...ee.automationLogRetentionDays(30),...ee.appBackupRetentionDays(30)}},pro:{usage:{monthly:{...ee.queries(ye),...ee.automations(ye),...ee.budibaseAICredits(0),...ee.actions(ye)},static:{...ee.rows(ye),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(5),...ee.plugins(ye),...ee.customAIConfigurations(0)}},constant:{...ee.automationLogRetentionDays(7),...ee.appBackupRetentionDays(7)}},team:{usage:{monthly:{...ee.queries(ye),...ee.automations(ye),...ee.budibaseAICredits(0),...ee.actions(ye)},static:{...ee.rows(ye),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(10),...ee.plugins(ye),...ee.customAIConfigurations(0)}},constant:{...ee.automationLogRetentionDays(30),...ee.appBackupRetentionDays(90)}},business:{usage:{monthly:{...ee.queries(ye),...ee.automations(ye),...ee.budibaseAICredits(0),...ee.actions(ye)},static:{...ee.rows(ye),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(50),...ee.plugins(ye),...ee.customAIConfigurations(0)}},constant:{...ee.automationLogRetentionDays(90),...ee.appBackupRetentionDays(365)}},enterprise_basic:{usage:{monthly:{...ee.queries(ye),...ee.automations(ye),...ee.budibaseAICredits(0),...ee.actions(ye)},static:{...ee.rows(ye),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(ye),...ee.plugins(ye),...ee.customAIConfigurations(ye)}},constant:{...ee.automationLogRetentionDays(ye),...ee.appBackupRetentionDays(ye)}},enterprise_basic_trial:{usage:{monthly:{...ee.queries(ye),...ee.automations(ye),...ee.budibaseAICredits(0),...ee.actions(ye)},static:{...ee.rows(ye),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(ye),...ee.plugins(ye),...ee.customAIConfigurations(ye)}},constant:{...ee.automationLogRetentionDays(15),...ee.appBackupRetentionDays(15)}},enterprise:{usage:{monthly:{...ee.queries(ye),...ee.automations(ye),...ee.budibaseAICredits(0),...ee.actions(ye)},static:{...ee.rows(ye),...ee.apps(ye),...ee.users(ye),...ee.creators(ye),...ee.userGroups(ye),...ee.plugins(ye),...ee.customAIConfigurations(ye)}},constant:{...ee.automationLogRetentionDays(ye),...ee.appBackupRetentionDays(ye)}}};function bre(e,t){let r;function n(i){let o=i[t];if(!o)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return o}switch(a(n,"readQuotas"),e){case"self":r=n($Sr);break;case"cloud":r=n(qSr);break}return JSON.parse(JSON.stringify(r))}a(bre,"getQuotas");var oI={};oe(oI,{encoding:()=>j_,workspaceExists:()=>zSr});async function zSr(e){return(await re.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}a(zSr,"workspaceExists");var j_={};oe(j_,{base64ToObject:()=>GSr,objectToBase64:()=>WSr});function WSr(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}a(WSr,"objectToBase64");function GSr(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}a(GSr,"base64ToObject");var xXe=te(require("lodash/union")),TXe=te(require("lodash/merge"));async function HSr(e){await Vu.save({offlineLicenseToken:e}),await vb()}a(HSr,"activateOfflineLicenseToken");async function VSr(){await Vu.save({offlineLicenseToken:void 0}),await vb()}a(VSr,"deleteOfflineLicenseToken");async function AXe(){return(await Vu.get()).offlineLicenseToken}a(AXe,"getOfflineLicenseToken");async function vre(){let t=(await Ah.getInstall()).installId,r=z.getTenantId(),n=await Tt.identification.getUniqueTenantId(r);return{installId:t,tenantId:n}}a(vre,"getIdentifier");async function KSr(){let e=await vre();return j_.objectToBase64(e)}a(KSr,"getIdentifierBase64");function QSr(e){return j_.base64ToObject(e)}a(QSr,"getIdentifierFromBase64");function RXe(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}a(RXe,"verifyExpiry");async function OXe(e){let t=await vre();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}a(OXe,"verifyInstallation");function IXe(e){let t=e.plan.type,r="self",n=yre(r,t),i=bre(r,t);return e.features=(0,xXe.default)(e.features,n),e.quotas=(0,TXe.default)(e.quotas,i),e}a(IXe,"enrichLicense");async function wre(){try{let e=await AXe();if(e){let t=await nI(e);return RXe(t),await OXe(t),IXe(t)}}catch(e){console.error("Error retrieving offline license",e)}}a(wre,"getOfflineLicense");var uI={};oe(uI,{deleteDevLicense:()=>e0r,getOfflineLicense:()=>XSr,writeDevLicenseToDisk:()=>ZSr});var _re=require("path"),kXe=require("os"),wb=te(require("fs"));var YSr=K.isTest()?".budibase-test":".budibase",Ere=(0,_re.join)((0,kXe.tmpdir)(),YSr),JSr="dev_license.txt",sI=(0,_re.join)(Ere,JSr);if(!wb.default.existsSync(Ere))try{wb.default.mkdirSync(Ere)}catch{}function XSr(){try{if(wb.default.existsSync(sI)){let e=wb.default.readFileSync(sI,{encoding:"utf-8"});return nI(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}a(XSr,"getOfflineLicense");function ZSr(e){console.log(`Writing license to: ${sI}`),wb.default.writeFileSync(sI,e,{encoding:"utf-8"})}a(ZSr,"writeDevLicenseToDisk");function e0r(){wb.default.rmSync(sI,{force:!0})}a(e0r,"deleteDevLicense");var CXe=require("dd-trace");var Sre=a(async()=>await CXe.tracer.trace("getLicense",async e=>{if(K.OFFLINE_MODE)return e.addTags({offline:!0}),wre();let t=await U_();return t||(e.addTags({offlineFallback:!0}),t=uI.getOfflineLicense()),t}),"getLicense"),DXe=a(e=>hre(e),"getLicenseFromKey"),xre=a(()=>K.SELF_HOSTED?Ku.SELF_FREE_LICENSE:Ku.CLOUD_FREE_LICENSE,"getFreeLicense");var Are={};oe(Are,{activateLicenseKey:()=>t0r,deleteLicenseKey:()=>r0r,getLicenseKey:()=>TM});var Tre=te(require("dd-trace"));async function t0r(e){await mre(e),await Vu.save({licenseKey:e}),await vb()}a(t0r,"activateLicenseKey");async function TM(){return await Tre.default.trace("getLicenseKey",async e=>{let t=await Vu.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}a(TM,"getLicenseKey");async function r0r(){return await Tre.default.trace("deleteLicenseKey",async()=>{await Vu.save({licenseKey:void 0}),await vb()})}a(r0r,"deleteLicenseKey");var AM=te(require("dd-trace"));var PXe=3600,vb=a(async()=>{await FXe(),await LXe()},"refresh"),NXe=a(async(e,t)=>{let{populateLicense:r=Sre,populateFreeLicense:n=xre}=t||{};return await AM.default.trace("getCachedLicense",async i=>{let o=z.getLicense();if(o)return i.addTags({foundInContext:!0,features:o.features,plan:o.plan,quotas:o.quotas}),o;let s=vt.getTenantId(),u=await Kte(),c=await u.get(s);return i.addTags({tenantId:s,foundInCache:!!c}),c?(i.addTags({foundInCache:!0,refreshedAt:c.refreshedAt,features:c.features,plan:c.plan,quotas:c.quotas}),c):(c=await AM.default.trace("populateLicense",async()=>await r(s)),i.addTags({populatedLicense:!!c}),c||(c=AM.default.trace("populateFreeLicense",()=>n(e,s)),i.addTags({populatedFreeLicense:!!c})),c.refreshedAt=new Date().toISOString(),i.addTags({refreshedAt:c.refreshedAt,features:c.features,plan:c.plan,quotas:c.quotas,expirySeconds:PXe}),await u.store(s,c,PXe),c)})},"_getCachedLicense");K.isJest()&&(NXe=jest.fn());var LXe=NXe,FXe=a(async()=>{let e=vt.getTenantId();await(await Kte()).delete(e)},"invalidate");async function Xa(e,t){Array.isArray(e)||(e=[e]),t||(t=await ol.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}a(Xa,"areFeaturesEnabled");async function RM(e,t){if(!await Xa(e,t))throw new pE(`${e} is not currently enabled`,e)}a(RM,"checkFeature");async function Rre(e,t){if(!await Xa(e,t)){let r=e.join(", ");throw new pE(`${r} are not currently enabled`,r)}}a(Rre,"checkFeatures");function zo(e){return async(...t)=>(await RM("appBackups"),e(...t))}a(zo,"checkBackups");async function Ore(){return Xa("appBackups")}a(Ore,"isBackupsEnabled");async function Ire(){return Xa("branding")}a(Ire,"isBrandingEnabled");async function UXe(){return Xa("enforceableSSO")}a(UXe,"isEnforceableSSO");async function i0r(){return Xa("syncAutomations")}a(i0r,"isSyncAutomationsEnabled");async function a0r(){return Xa("triggerAutomationRun")}a(a0r,"isTriggerAutomationRunEnabled");async function Eb(){return Xa("appBuilders")}a(Eb,"isAppBuildersEnabled");async function OM(){return Xa("auditLogs")}a(OM,"isAuditLogsEnabled");async function kre(){return Xa("userGroups")}a(kre,"isUserGroupsEnabled");function o0r(){return Xa("pwa")}a(o0r,"isPWAEnabled");function s0r(){return Xa("recaptcha")}a(s0r,"isRecaptchaEnabled");var u0r=a(()=>Xa("pkceOidc"),"isPkceOidcEnabled");async function Zp(){return Xa("expandedPublicApi")}a(Zp,"isExpandedPublicApiEnabled");async function c0r(e){if(K.ENABLE_SSO_MAINTENANCE_MODE||!await UXe())return!1;let r;return e?.config?r=e.config:r=await qa.getSettingsConfig(),!!r.isSSOEnforced}a(c0r,"isSSOEnforced");var Cre=a(async()=>{let e="scim",t=await Xa(e),r=await qa.getSCIMConfig();if(!t||!r?.enabled)throw new pE(`${e} is not currently enabled`,e);return!0},"checkSCIM");async function l0r(){return Xa("viewPermissions")}a(l0r,"isViewPermissionEnabled");async function f0r(){return Xa("viewReadonlyColumns")}a(f0r,"isViewReadonlyColumnsEnabled");var p0r={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 d0r(e){return await Ire()?{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}:p0r}a(d0r,"getBrandingConfig");var Nre={};oe(Nre,{enrichAIConfig:()=>Pre});var h0r="budibase_ai";async function Pre(e){if(K.SELF_HOSTED)return e;for(let t of Object.values(e.config))if(t.provider==="BudibaseAI")return e;return e.config[h0r]={provider:"BudibaseAI",active:!0,isDefault:Object.keys(e.config).every(t=>!e.config[t].isDefault),defaultModel:process.env.BUDIBASE_AI_DEFAULT_MODEL||"gpt-5-mini",name:"Budibase AI"},e}a(Pre,"enrichAIConfig");var Wn={};oe(Wn,{addAction:()=>v0r,addApp:()=>w0r,addAutomation:()=>A0r,addGroup:()=>Fre,addPlugin:()=>jre,addRow:()=>_0r,addRows:()=>x0r,addUsers:()=>IM,bustCache:()=>ere,decrement:()=>ed,decrementMany:()=>cI,getCurrentUsageValues:()=>KJe,getLicensedQuota:()=>MXe,getQuotaUsage:()=>yb,increment:()=>Zs,incrementBudibaseAICredits:()=>kM,incrementMany:()=>Sb,removeApp:()=>E0r,removeGroup:()=>Ure,removePlugin:()=>Mre,removeRow:()=>S0r,removeRows:()=>T0r,removeUsers:()=>B_,set:()=>Lre,setAllUsage:()=>rre,setAppUsageValue:()=>tre,setUsage:()=>GJe,setUsagePerApp:()=>HJe,updatePluginCount:()=>Bre,updateUsage:()=>M_,usageLimitIsExceeded:()=>b0r,utils:()=>UO});var _b=require("dd-trace");var Zs=a(async(e,t,r)=>await _b.tracer.trace("quotas.increment",async n=>(n.addTags({name:e,type:t}),await jXe({change:1,name:e,type:t,opts:r}))),"increment"),Sb=a(e=>_b.tracer.trace("quotas.incrementMany",async()=>jXe(e)),"incrementMany"),jXe=a(async e=>await _b.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await M_(r.map(i=>({usageChange:i.change,name:i.name,type:i.type,opts:{dryRun:!0,suppressErrorLog:i.opts?.suppressErrorLog,id:i.opts?.id}})));let n=[];for(let i of r)await _b.tracer.trace("quotas.incrementMany.fn",async o=>{o.addTags({actionName:i.name,actionType:i.type,actionChange:i.change});let s=i.opts?.fn;s&&n.push(await s())});return await M_(r.map(i=>({usageChange:i.change,name:i.name,type:i.type,opts:{dryRun:!1,valueFn:i.opts?.valueFn,suppressErrorLog:i.opts?.suppressErrorLog,id:i.opts?.id}}))),n[0]}),"tryIncrement"),ed=a((e,t,r={})=>M_({usageChange:-1,name:e,type:t,opts:r}),"decrement"),cI=a(e=>{let t=Array.isArray(e)?e:[e];return M_(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),Lre=a(async(e,t,r)=>gf.setUsage(r,e,t),"set"),m0r=a((e,t,r)=>{if(e=="static"){let n=r.usageQuota.triggers;return n?n[t]||{}:{}}else{let n=gf.utils.getCurrentMonthString(),i=r.monthly[n].triggers;return i?i[t]||{}:{}}},"getExistingTriggers"),g0r=a(async(e,t,r,n)=>{try{await Bc.doWithLock({type:"try_once",name:"trigger_quota",resource:e,ttl:1e4},async()=>{let i={percentage:r,name:t.name};n&&(i.resetDate=n),await hm.triggerQuota(i)})}catch(i){kt.logAlert("Error triggering quota",i)}},"triggerQuota"),y0r=a(async(e,t,r,n)=>{let i=await yb(),o=e==="monthly"?i.quotaReset:void 0,s=await m0r(e,t,i),u=n.triggers,c=r/n.value*100;c>100&&(c=100);for(let[l,f]of u.entries())if(c>=f&&n.value!==fm.UNLIMITED){if(!s[f]){s[f]=new Date().toISOString();let d=u[l+1]||100;(!(c>=d)||c===f)&&await g0r(t,n,c,o)}}else s[f]=void 0;return s},"checkTriggers"),M_=a(async e=>{await _b.tracer.trace("quotas.updateUsage",async t=>{let r=vt.getTenantId(),n=Array.isArray(e)?e:[e];t.addTags({numActions:n.length,tenantId:r});let i,o,s=[],u={},c={},l={},f={};for(let d of n)await _b.tracer.trace("quotas.updateUsage.action",async h=>{h.addTags({actionName:d.name,actionType:d.type,actionUsageChange:d.usageChange});try{i=z.getWorkspaceId()}catch{}if(Vb.includes(d.name)&&!i)throw new Error("App context required for quota update");try{o=await MXe("usage",d.name,d.type),s.push(o);let{total:g,app:y,breakdown:b}=await gf.getCurrentUsageValues(d.type,d.name,d.opts?.id);g+=d.usageChange,y!=null&&(y+=d.usageChange),b!=null&&(b+=d.usageChange);let v={};if(d.opts?.dryRun||(v=await y0r(d.type,d.name,g,o),f={...f,[d.name]:v}),o.value!==fm.UNLIMITED&&g>o.value&&d.usageChange>0)throw new DL(`Licensed ${o.name} of ${o.value} has been exceeded`,o.name);if(g=Math.max(0,g),y&&(y=Math.max(0,y)),b&&(b=Math.max(0,b),l={...l,[d.name]:b}),!d.opts?.dryRun){let w=d.opts?.valueFn;w&&(g=await w(),y=g),u={...u,[d.name]:g},c={...c,[d.name]:y}}}catch(g){throw d.opts?.suppressErrorLog||console.error(`Error updating usage quotas for ${d.name}`,g),g}});let p=n.filter(d=>!d.opts?.dryRun).map(d=>({name:d.name,type:d.type,values:{total:u[d.name],app:c[d.name],breakdown:l[d.name],triggers:f[d.name]},opts:{...d.opts,tenantId:r}}));p.length>0&&await gf.setAllUsage(p)})},"updateUsage"),MXe=a(async(e,t,r)=>{let n=await ol.getCachedLicense();if(!n){let i=vt.getTenantId();throw new Error("License not found for tenant id "+i)}if(r&&Xoe(e,r,t))return n.quotas[e][r][t];if(r&&Zoe(e,r,t))return n.quotas[e][r][t];if(ese(e,t))return n.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),b0r=a(async({name:e,type:t,usageChange:r})=>{try{return await M_({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(n){if(n.code==="usage_limit_exceeded")return!0;throw n}},"usageLimitIsExceeded");var v0r=a(async e=>Zs("actions","monthly",{fn:e}),"addAction");var BXe=a(async()=>{let e=await re.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),w0r=a(async(e,{appId:t}={})=>Zs("apps","static",{fn:e,valueFn:BXe,id:t}),"addApp"),E0r=a(async({appId:e}={})=>ed("apps","static",{valueFn:BXe,id:e}),"removeApp");var _0r=a(async(e,{tableId:t}={})=>Zs("rows","static",{fn:e,id:t}),"addRow"),S0r=a(async({tableId:e}={})=>ed("rows","static",{id:e}),"removeRow"),x0r=a(async(e,t,{tableId:r}={})=>Sb({change:e,name:"rows",type:"static",opts:{fn:t,id:r}}),"addRows"),T0r=a(async(e,{tableId:t}={})=>cI({change:e,name:"rows",type:"static",opts:{id:t}}),"removeRows");var A0r=a(async(e,{automationId:t}={})=>Zs("automations","monthly",{fn:e,id:t}),"addAutomation");var Fre=a(async e=>Zs("userGroups","static",{fn:e}),"addGroup"),Ure=a(async()=>ed("userGroups","static"),"removeGroup");var jre=a(async e=>Zs("plugins","static",{fn:e}),"addPlugin"),Mre=a(async()=>ed("plugins","static"),"removePlugin"),Bre=a(async e=>Lre("plugins","static",e),"updatePluginCount");var IM=a(async(e,t,r)=>{let n=[{change:e,name:"users",type:"static",opts:{fn:r,valueFn:zt.getUserCount}}];t>0&&n.push({change:t,name:"creators",type:"static",opts:{valueFn:zt.getCreatorCount}});let i=await Sb(n);return await U_(),i},"addUsers"),B_=a(async(e,t)=>{let r=[{change:e,name:"users",type:"static",opts:{valueFn:zt.getUserCount}}];t>0&&r.push({change:t,name:"creators",type:"static",opts:{valueFn:zt.getCreatorCount}}),await cI(r),await U_()},"removeUsers");var kM=a(async e=>Sb({change:e,name:"budibaseAICredits",type:"monthly"}),"incrementBudibaseAICredits");var ym={};oe(ym,{addAppBuilder:()=>C0r,db:()=>Yu,removeAppBuilder:()=>D0r});var on={};oe(on,{addAppBuilder:()=>Wre,addUsers:()=>DM,adjustGroupCreatorsQuotas:()=>k0r,cleanupApp:()=>I0r,enrichUserRolesFromGroups:()=>O0r,fetch:()=>lI,get:()=>gm,getBulk:()=>HXe,getGroupBuilderAppIds:()=>GXe,getGroupRoleId:()=>R0r,remove:()=>qre,removeAppBuilder:()=>Gre,removeUsers:()=>$re,save:()=>q_,updateGroupApps:()=>zre});var CM=class extends Ie{static{a(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}};async function zXe(e,t){try{let r=[];for(let u of e)if(u.roles){let c=u.roles[re.getProdWorkspaceID(t)];c&&r.push(c)}let n=await Promise.all(r.map(async u=>({[u]:await Dr.roleToNumber(u)}))),i,o,s={};n.forEach(u=>{let[c,l]=Object.entries(u)[0];s[c]={roleId:c,roleNum:l}});for(let{roleId:u,roleNum:c}of Object.values(s))(o===void 0||c>o)&&(o=c,i=u);return i}catch(r){throw kt.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}a(zXe,"findHighestRole");async function WXe(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await Zn.getBulk(e,{enriched:!1}),t}a(WXe,"groupList");async function GXe(e,t){if(!e.userGroups)return[];let r=await WXe(e.userGroups,t?.groups),n=t?.appId?re.getProdWorkspaceID(t?.appId):null,i=[];for(let o of r){let s=o.builder?.apps;n&&s?.includes(n)?i.push(n):n||(i=i.concat(s||[]))}return[...new Set(i)]}a(GXe,"getGroupBuilderAppIds");async function R0r(e,t,r){if(!e.userGroups)return null;let n=await WXe(e.userGroups,r?.groups),i=re.getProdWorkspaceID(t);return e.roles?.[i]?e.roles[i]:(n=n.filter(o=>o?.roles?Object.keys(o.roles).includes(i):!1),await zXe(n,t))}a(R0r,"getGroupRoleId");async function O0r(e){if(!e||!e.userGroups)return e;let t=await HXe(e.userGroups,{enriched:!1}),r=[];for(let i of t)i?.roles&&(r=r.concat(Object.keys(i.roles)));r=[...new Set(r)];for(let i of r)await z.doInWorkspaceContext(i,async()=>{if(e.roles[i])return;let o=await zXe(t,i);o&&(e.roles[i]=o)});let n=await GXe(e,{groups:t});if(n.length&&!e.builder?.global){let i=e.builder?.apps||[];e.builder={apps:i.concat(n)}}return e}a(O0r,"enrichUserRolesFromGroups");async function lI(){return await Zn.fetch()}a(lI,"fetch");async function gm(e){return await Zn.get(e)}a(gm,"get");async function HXe(e,t={enriched:!0}){return await Zn.getBulk(e,t)}a(HXe,"getBulk");async function qXe(e){if(await Zn.getByName(e))throw new CM(e)}a(qXe,"guardNameAvailability");async function $Xe(e){let t=await Zn.getGroupUsers(e._id);if(!t.length)return 0;let n=await vt.getGlobalDB().getMultiple(t.map(o=>o._id));return(await Ih.creatorsInList(n)).filter(o=>o).length}a($Xe,"getCreatorsCountInGroup");async function q_(e){let t=[],r=!e._id,n=0;if(delete e.users,!e._id)e._id=Zn.generateUserGroupID(),await qXe(e.name),t.push(Tt.group.created(e));else{let o=await Zn.get(e._id);if(o.name!==e.name&&await qXe(e.name),t.push(Tt.group.updated(e)),JSON.stringify(o.roles)!==JSON.stringify(e.roles)){let s=o.users?.length||0,u=0;s>0&&(u=await $Xe(o)),Object.values(e.roles).includes("CREATOR")?n=s-u:n=-s,t.push(Tt.group.permissionsEdited(e))}}await Promise.all(t);let i=a(()=>Zn.save(e),"saveGroup");if(r)return await Fre(i);{let o=await i();if(n>0)await IM(0,n);else if(n<0){let s=await $Xe(e),u=Math.abs(n)-s;u>0&&await B_(0,u)}return o}}a(q_,"save");async function qre(e,t){let r;try{r=await Zn.get(e)}catch{throw new Error("Group not found")}let n=Object.values(r.roles||{}).includes("CREATOR"),i=a(()=>{},"recalculateCreatorsQuotasFn");if(n){let s=vt.getGlobalDB(),u=await Zn.getGroupUsers(e),l=(await Promise.all(u.map(h=>s.get(h._id)))).map(h=>({...h,userGroups:h.userGroups.filter(m=>m!==e)})),p=(await Ih.creatorsInList(l)).filter(h=>h).length,d=u.length-p;d&&(i=a(()=>B_(0,d),"recalculateCreatorsQuotasFn"))}let o=await Zn.destroy(e,t);return await Tt.group.deleted(r),await Ure(),await i(),o}a(qre,"remove");async function DM(e,t){let r=await Zn.get(e),n=await zt.bulkGetGlobalUsersById(t),i=[];for(let c of n)c.userGroups||(c.userGroups=[]),c.userGroups.includes(e)||i.push(c);if(!i.length)return i;let o=i.map(c=>({...c,userGroups:[...c?.userGroups||[],e]}));if(await zt.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes("CREATOR")){let l=(await Ih.creatorsInList(i)).filter(p=>p).length,f=i.length-l;f&&await IM(0,f)}let u=[];for(let c of t)u.push(qt.user.invalidateUser(c));return await Promise.all(u),await Tt.group.usersAdded(o.length,r),o}a(DM,"addUsers");async function $re(e,t){let r=await Zn.get(e),n=await zt.bulkGetGlobalUsersById(t),i=[];for(let u of n){if(!u.userGroups||!u.userGroups.includes(e))continue;let c=u.userGroups.indexOf(e);u.userGroups.splice(c,1),i.push(u)}if(await zt.bulkUpdateGlobalUsers(i),Object.values(r.roles||{}).includes("CREATOR")){let c=(await Ih.creatorsInList(i)).filter(f=>f).length,l=i.length-c;l&&await B_(0,l)}let s=[];for(let u of t)s.push(qt.user.invalidateUser(u));return await Promise.all(s),i.length&&await Tt.group.usersDeleted(i.length,r),i}a($re,"removeUsers");async function zre(e,t){let r=await gm(e);if(r.roles||(r.roles={}),t.appsToAdd)for(let n of t.appsToAdd)r.roles[n.appId]=n.roleId;if(t.appsToRemove)for(let n of t.appsToRemove)delete r.roles[n.appId];return await q_(r)}a(zre,"updateGroupApps");async function I0r(e){let t=await lI(),r=[];for(let n of t)!n.roles||!n.roles[e]||(delete n.roles[e],r.push(n));return await Zn.bulkSave(r)}a(I0r,"cleanupApp");async function Wre(e,t){if(!await Eb())throw new Error("Feature not enabled, please check license");let r=re.getProdWorkspaceID(t),n=await gm(e);n.builder??={apps:[]},n.builder.apps.includes(t)||(n.builder.apps.push(r),await q_(n))}a(Wre,"addAppBuilder");async function Gre(e,t){if(!await Eb())throw new Error("Feature not enabled, please check license");let r=re.getProdWorkspaceID(t),n=await gm(e);n.builder?.apps.includes(t)&&(n.builder.apps=n.builder.apps.filter(i=>i!==r),await q_(n))}a(Gre,"removeAppBuilder");async function k0r(){if(!await kre()){let e=vt.getGlobalDB(),r=(await lI()||[]).filter(n=>Object.values(n?.roles||{}).includes("CREATOR"));for(let n of r){let i=await Zn.getGroupUsers(n._id),s=(await Promise.all(i.map(f=>e.get(f._id)))).map(f=>({...f,userGroups:f.userGroups.filter(p=>p!==n._id)})),c=(await Ih.creatorsInList(s)).filter(f=>f).length,l=i.length-c;await Zn.save({...n,roles:{}}),l&&await B_(0,l)}}}a(k0r,"adjustGroupCreatorsQuotas");zt.UserDB.init(Wn,on,ys);var Yu=zt.UserDB;async function C0r(e,t){if(!await Eb())throw new Error("Feature not enabled, please check license");await zt.addAppBuilder(e,t)}a(C0r,"addAppBuilder");async function D0r(e,t){if(!await Eb())throw new Error("Feature not enabled, please check license");await zt.removeAppBuilder(e,t)}a(D0r,"removeAppBuilder");var $_={};oe($_,{logs:()=>Xre});var Xre={};oe(Xre,{logSearch:()=>q0r,oldestLogDate:()=>JXe,storeLog:()=>$0r});async function VXe(e,t){let r,n=5,i=!1,o,s=!0;for(;n>0;n--)try{s?o=await e():o=await exports.randomDelay(e),i=!0;break}catch(u){r=u}return i||kt.logWarn(`Failed to backoff: ${t}`,r),o}a(VXe,"backOff");var{SEPARATOR:td,UNICODE_MAX:P0r,DocumentType:KXe,AutomationViewMode:Hre,ViewName:N0r,getQueryIndex:L0r}=re,F0r=new Date(0).toISOString(),U0r=100,Vre=a(async()=>gM("automationLogRetentionDays"),"oldestLogDate");function QXe(e,t,{status:r,automationId:n}={},i={}){let o=n?`${n}${td}`:"",s=r?`${r}${td}`:"",u;return r&&n?u=`${Hre.ALL}${td}${s}${o}`:r?u=`${Hre.STATUS}${td}${s}`:n?u=`${Hre.AUTOMATION}${td}${o}`:u=`${KXe.AUTOMATION_LOG}${td}`,{...i,descending:!0,startkey:`${u}${t}${P0r}`,endkey:`${u}${e}`}}a(QXe,"getAutomationLogParams");function j0r(e,t,r){return`${KXe.AUTOMATION_LOG}${td}${e}${td}${r}${td}${t}`}a(j0r,"generateAutomationLogID");async function Kre(e,t,r={docs:!0}){let n=z.getProdWorkspaceDB();await n.exists()||(n=z.getDevWorkspaceDB());let i={status:r.status},o=r?.limit?r.limit:r?.paginate?9+1:void 0,s=QXe(e,t,i,{include_docs:r.docs,limit:o});r?.page&&(s.startkey=r.page);let u=await n.allDocs(s);return eI(u,{paginate:r?.paginate,pageSize:9})}a(Kre,"getAllLogs");async function Qre(e,t,r={}){let n=z.getProdWorkspaceDB();await n.exists()||(n=z.getDevWorkspaceDB());let i;try{let o={automationId:r?.automationId,status:r?.status},s=QXe(e,t,o,{include_docs:!0,limit:9+1});r?.page&&(s.startkey=r.page),i=await n.query(L0r(N0r.AUTOMATION_LOGS),s)}catch(o){if(o!=null&&(o.name==="not_found"||o.error==="not_found"))return await lXe(),Qre(e,t,r);throw o}return eI(i,{paginate:!0,pageSize:9})}a(Qre,"getLogsByView");async function YXe(e,t){let r=z.getProdWorkspaceDB(),n=e._id,i=e.name,o=new Date().toISOString(),s=j0r(o,t.status,n),u={...t,automationId:n,status:t.status,automationName:i,createdAt:o,_id:s};return await r.put(u),s}a(YXe,"writeLog");async function Yre(e,{clearing:t}={clearing:!1}){let r=z.getProdWorkspaceDB();await VXe(async()=>{let n=await r.get(re.DocumentType.WORKSPACE_METADATA);for(let i of e){let o=i.split(re.SEPARATOR),s=`${o[o.length-3]}${re.SEPARATOR}${o[o.length-2]}`,u={};n.automationErrors&&(u=n.automationErrors),Array.isArray(u[s])||(u[s]=[]);let c=u[s].indexOf(i);t&&c!==-1?u[s].splice(c,1):u[s].push(i),u[s].length===0&&delete u[s],n.automationErrors=u}await r.put(n),await qt.workspace.invalidateWorkspaceMetadata(n.appId,n)},"Failed to update app metadata with automation log error")}a(Yre,"updateAppMetadataWithErrors");async function M0r(){let e=await Vre();try{return await Kre(F0r,e,{docs:!1,paginate:!1,limit:U0r})}catch{return{data:[],hasNextPage:!1}}}a(M0r,"getExpiredLogs");async function Jre(){let e=z.getProdWorkspaceDB();try{let t=await M0r();if(!t.data||t.data.length===0)return;let r=t.data.map(i=>({_id:i.id,_rev:i.value.rev,_deleted:!0})),n=t.data.filter(i=>{let o=i.id.split(re.SEPARATOR);return o[o.length-1]==="error"}).map(i=>i.id);await e.bulkDocs(r),n.length&&await Yre(n,{clearing:!0})}catch(t){kt.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}a(Jre,"clearOldHistory");var JXe=Vre;async function B0r(e,t,r,n){let i,o=new Date().toISOString(),s=await JXe();return(!e||e<s)&&(e=s),r||t?i=await Qre(e,o,{automationId:r,status:t,page:n}):i=await Kre(e,o,{status:t,page:n,docs:!0,paginate:!0}),i}a(B0r,"getLogs");async function q0r(e){return await Jre(),await B0r(e.startDate,e.status,e.automationId,e.page)}a(q0r,"logSearch");async function $0r(e,t){if(!re.isProdWorkspaceID(z.getWorkspaceId()))return;let r=await YXe(e,t);t.status==="error"&&await Yre([r]),await Jre()}a($0r,"storeLog");var Zre={};oe(Zre,{checkPluginQuotas:()=>G0r,deletePlugin:()=>W0r,storePlugin:()=>z0r});var XXe=te(require("fs")),ZXe=require("path");function eZe(e,t){return XXe.default.readFileSync((0,ZXe.join)(e,t),"utf8")}a(eZe,"loadJSFile");async function z0r(metadata,directory,source){let db=vt.getGlobalDB(),version=metadata.package.version,name=metadata.package.name,description=metadata.package.description,hash=metadata.schema.hash,bucketPath=bt.getPluginS3Dir(name),files=await bt.uploadDirectory(bt.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==="datasource"){let js=eZe(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=re.generatePluginID(name),rev;try{rev=(await db.get(pluginId))._rev}catch(e){rev=void 0}let doc={_id:pluginId,_rev:rev,...metadata,name,version,hash,description,source};iconFileName&&(doc.iconFileName=iconFileName),source&&(doc={...doc,source});let write=a(async()=>{let e=await db.put(doc);return await Tt.plugin.imported(doc),{...doc,_rev:e.rev}},"write");return rev?await write():await jre(write)}a(z0r,"storePlugin");async function W0r(e){let t=vt.getGlobalDB();try{let r=await t.get(e),n=bt.getPluginS3Dir(r.name);await bt.deleteFolder(bt.ObjectStoreBuckets.PLUGINS,n),await t.remove(e,r._rev),await Tt.plugin.deleted(r),await Mre()}catch(r){let n=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${n}`)}}a(W0r,"deletePlugin");async function G0r(){let e=vt.getGlobalDB();try{let r=(await e.allDocs(re.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await Bre(r)}catch(t){kt.logAlert("Unable to retrieve plugins for quota check",t)}}a(G0r,"checkPluginQuotas");var sl={};oe(sl,{fetch:()=>V0r,fetchValues:()=>K0r,isEncryptionKeyAvailable:()=>H0r,isValid:()=>nZe,remove:()=>Y0r,update:()=>Q0r});function H0r(){return!!K.ENCRYPTION_KEY}a(H0r,"isEncryptionKeyAvailable");async function V0r(){let e=await bb.get();return Object.keys(e.variables)}a(V0r,"fetch");async function K0r(e){let r=(await bb.get()).variables,n={};for(let[i,o]of Object.entries(r))switch(e){case"development":n[i]=o.development;break;case"production":default:n[i]=o.production;break}return n}a(K0r,"fetchValues");async function rZe(e){if(!(await pm.cache.getCachedLicense()).features.includes("environmentVariables"))throw new Error("User does not have access to environment variables feature.");let r=await bb.get();r.variables=e(r.variables),await bb.update(r)}a(rZe,"changeValues");async function Q0r(e,t){if(nZe(e))await rZe(n=>(n[e]=t,n));else throw new Error("Variable name has characters that are not allowed")}a(Q0r,"update");async function Y0r(e){await rZe(t=>(delete t[e],t))}a(Y0r,"remove");function nZe(e){return/^[a-zA-Z0-9-_]+$/.test(e)}a(nZe,"isValid");var xb={};oe(xb,{definitions:()=>sxr,download:()=>oxr,fetch:()=>axr,write:()=>nxr});var iZe=require("memorystream"),aZe=new Kt.Sql("sqlite3");async function J0r(e,t,r){let n={operation:"READ",table:ZO.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:"descending",type:"string"}}},i=aZe._query(n);if(Array.isArray(i))throw new Error("Cannot execute multiple queries for audit log search");return{sql:i.sql,bindings:i.bindings}}a(J0r,"getAuditLogSqlQuery");function X0r(e){return`al${Me}${e}${Me}${Cr.newid()}`}a(X0r,"generateAuditLogID");async function oZe(e){e._id||(e._id=X0r(e.timestamp)),e.type||(e.type=km);try{let r=await z.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){kt.logAlert("Failed to write audit log",t)}}a(oZe,"save");async function ene(e,t,r){t||(t=1);let n=z.getAuditLogsDB();try{let i=9+1,o=await J0r(e,t,i),s=ZO.searchTable(),u=aZe.convertJsonStringColumns(s,await n.sql(o.sql,o.bindings)),c;u.length>i&&(c=u.pop());let l={rows:u,hasNextPage:!!c};return l.hasNextPage&&(l.bookmark=t+1),l}catch(i){if(i.status===404&&!r?.isRetry)return await Z0r(),await QJe(),await ene(e,t,{isRetry:!0});throw i}}a(ene,"searchSQL");async function Z0r(){let e=z.getAuditLogsDB(),r=(await e.allDocs(re.getDocParams("al",null,{include_docs:!0}))).rows.map(n=>n.doc).filter(n=>n&&!n.type).map(n=>({...n,type:km}));await e.bulkDocs(r)}a(Z0r,"migrate");function sZe(e){let t=z.getAuditLogsDB(),r=new iZe,n=t.dump(r,{filter:o=>{let s=o;if(!s._id?.startsWith("al"))return!1;let u=!0,c=a((l,f)=>{!l||l.length===0||(u=!!(u&&f&&l.includes(f)))},"matcher");if(c(e.userIds,s.userId),c(e.appIds,s.appId),c(e.events,s.event),(e.startDate||e.endDate)&&(u=u&&s.timestamp>=e.startDate&&s.timestamp<=e.endDate),e.fullSearch){let l=JSON.stringify(o);u=u&&l.includes(e.fullSearch)}return u}}),i=new iZe;return r.on("data",o=>{let s=JSON.parse(Buffer.from(o).toString());if(Array.isArray(s.docs)){let u="";for(let c of s.docs)u+=JSON.stringify(c)+`
|
|
755
|
-
`;i.write(u)}}),r.on("end",()=>{i.end()}),{promise:n,stream:i}}a(sZe,"dump");var txr=gr.MIN_VALID_DATE.toISOString(),rxr=gr.MAX_VALID_DATE.toISOString();function tne(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||txr,e.endDate=e.endDate||rxr),e}a(tne,"fillDates");async function uZe(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(n=>re.getProdWorkspaceID(n)));let t={};function r(n,i){i?.length&&(t.oneOf={...t.oneOf,[n]:i})}return a(r,"addStringParams"),r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=tne(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}a(uZe,"getSearchFilters");function rne(e,t,r){let n={_id:e,status:"deleted"};switch(t){case"app":n.name=r?.appName;break;case"user":n.email=r?.email;break}return n}a(rne,"deleted");function nne(e){let t=Js(e);for(let r of t){let n=` "${r}"`;e=e.replace(e.includes(n)?n:` ${r}`,""),e=Tn(e,{})}return e}a(nne,"removeTemplateStrings");function cZe(e,t){let r=Wb[e];if(!r)throw new Error("No friendly name found.");let n=Tn(r,t);return n.includes('""')&&(n=nne(r)),n}a(cZe,"getEventFriendlyName");async function nxr(e,t,r){if(!await OM()||!Cr.isAudited(e))return;let n=cZe(e,t),i=new Date;r?.timestamp&&(i=new Date(r.timestamp));let o={timestamp:i.toISOString(),event:e,name:n,userId:r?.userId||use,metadata:{...t,...r?.hostInfo}},s={};try{if(r?.appId){o.appId=re.getProdWorkspaceID(r.appId);let u=await qt.workspace.getWorkspaceMetadata(r.appId);"name"in u&&(s.appName=u.name)}if(r?.userId){let u=await zt.getById(r?.userId);s.email=u.email}}catch(u){kt.logAlert("Failed to retrieve fallback information for audit log",u)}return o.fallback=s,await oZe(o)}a(nxr,"write");async function ixr(e){let t=e.map(u=>u.userId),n=e.filter(u=>u.appId).map(u=>re.getDevWorkspaceID(u.appId)),i=await zt.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),o=await re.getWorkspacesByIDs([...new Set(n)]),s=[];for(let u of e){let c=i.find(p=>p?._id===u.userId),l=o.find(p=>re.isSameWorkspaceID(p?.appId,u.appId)),f={event:u.event,timestamp:u.timestamp,name:u.name,metadata:u.metadata,user:c||rne(u.userId,"user",u.fallback)};u.appId&&(f.app=l||rne(u.appId,"app",u.fallback)),s.push(f)}return s}a(ixr,"enrich");async function axr(e){if(!await OM())throw new Error("Audit logs not available - license required.");let t=await uZe(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await ene(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await ixr(r.rows)}}a(axr,"fetch");function oxr(e){return e=tne(e),sZe(e)}a(oxr,"download");function sxr(){let e=Object.entries(Wb).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=nne(r[1]);return t}a(sxr,"definitions");var sne={};oe(sne,{applications:()=>one,roles:()=>ane,users:()=>ine});var ine={};oe(ine,{roleCheck:()=>cxr});function uxr(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}a(uxr,"removeRoles");async function cxr(e,t){return await Zp()||uxr(e,t),e}a(cxr,"roleCheck");var ane={};oe(ane,{assign:()=>lxr,unAssign:()=>fxr});async function lxr(e,t){if(!await Zp())throw new Error("Unable to assign roles - license required.");let r=await Yu.bulkGet(e);for(let n of r){if(t.role&&t.role.roleId){let i=re.getProdWorkspaceID(t.role.appId);n.roles[i]=t.role.roleId}if(t.appBuilder){let i=re.getProdWorkspaceID(t.appBuilder.appId),o=n.builder?.apps||[];n.builder={apps:o.concat([i])}}t.builder&&(n.builder={global:!0}),t.admin&&(n.admin={global:!0}),n.roles}await Yu.bulkUpdate(r)}a(lxr,"assign");async function fxr(e,t){if(!await Zp())throw new Error("Unable to un-assign roles - license required.");let r=await Yu.bulkGet(e);for(let n of r){if(t.role){let i=re.getProdWorkspaceID(t.role?.appId);n.roles[i]===t.role.roleId&&delete n.roles[i]}if(t.appBuilder&&n.builder?.apps){let i=re.getProdWorkspaceID(t.appBuilder.appId);n.builder.apps=n.builder.apps.filter(o=>o!==i)}t.builder&&n.builder&&delete n.builder,t.admin&&n.admin&&delete n.admin}}a(fxr,"unAssign");var one={};oe(one,{buildExportFn:()=>dxr,buildImportFn:()=>pxr});function pxr(e){return async(t,r)=>{await Zp()||t.throw(403,"Endpoint unavailable, license required."),t.request.files?.appExport||t.throw(400,"Must provide app export file for import."),await z.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}a(pxr,"buildImportFn");function dxr(e){return async(t,r)=>{await Zp()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:n,excludeRows:i}=t.request.body;await z.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:n,excludeRows:i},t.query.appId=t.params.appId,await e(t),await r()})}}a(dxr,"buildExportFn");var pZe=te(require("fs")),dZe=require("path");var lZe;function fZe(){lZe=new fo.BudibaseQueue(fo.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}a(fZe,"init");function Tb(){return lZe}a(Tb,"getBackupQueue");async function une(e,t={}){return Qu.storeAppBackupMetadata(e,t)}a(une,"storeAppBackupMetadata");function hZe(e){let t=new Date().toISOString();switch(e){case"complete":case"failed":return{timestamp:t,finishedAt:t};case"started":return{timestamp:t,startedAt:t};case"pending":return{timestamp:t,createdAt:t}}}a(hZe,"getTimestamps");async function mxr(e,t,r,n){let i=await NM(e);return await Qu.storeAppBackupMetadata({...i,...hZe(t),contents:r,status:t,type:"backup"},{filename:n,docId:e})}a(mxr,"updateBackupStatus");async function gxr(e,t,r){let n=await NM(e);return await Qu.storeAppBackupMetadata({...n,...hZe(r),status:r,type:"restore",trigger:"manual"},{docId:e,docRev:t})}a(gxr,"updateRestoreStatus");async function NM(e){return Qu.getAppBackupMetadata(e)}a(NM,"getAppBackup");async function yxr(e,t){return Qu.updateAppBackupMetadata(e,t)}a(yxr,"updateAppBackup");async function mZe(e){let t=await Qu.getAppBackupMetadata(e);return t.filename&&await bt.deleteFile(bt.ObjectStoreBuckets.BACKUPS,t.filename),Qu.deleteAppBackupMetadata(e)}a(mZe,"deleteAppBackup");async function bxr(e){let t=[];for(let r of e)try{await mZe(r),t.push({backupId:r,success:!0})}catch(n){t.push({backupId:r,success:!1,error:n instanceof Error?n.message:"Unknown error"})}return t}a(bxr,"deleteAppBackups");async function vxr(e,t){return Qu.fetchAppBackups(e,t)}a(vxr,"fetchAppBackups");async function gZe(e){let t=await Qu.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let r=await bt.getReadStream(bt.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}a(gZe,"getBackupDownloadStream");async function wxr(e){let{stream:t}=await gZe(e),r=(0,dZe.join)(bt.budibaseTempDir(),Cr.newid()),n=pZe.default.createWriteStream(r);return new Promise((i,o)=>{t.on("error",o),n.on("error",o),t.pipe(n).on("close",()=>i(r))})}a(wxr,"downloadAppBackup");async function Exr(e,t,r={}){let n;try{n=await une({appId:e,trigger:t,timestamp:new Date().toISOString(),status:"pending",type:"backup",...r})}catch(i){if(i.status===409)return;throw i}return await Tb().add({docId:n.id,docRev:n.rev,appId:e,export:{trigger:t,...r}}),await Tt.backup.appBackupTriggered(e,n.id,"backup",t,r?.name),n.id}a(Exr,"triggerAppBackup");async function _xr(e,t,r,n){let i=await NM(t),o;try{o=await une({appId:e,timestamp:new Date().toISOString(),status:"pending",type:"restore",createdBy:n})}catch(s){if(s?.status===409)return;throw s}return await Tb().add({appId:e,docId:o.id,docRev:o.rev,import:{nameForBackup:r,backupId:t,createdBy:n}}),{restoreId:o.id,metadata:i}}a(_xr,"triggerAppRestore");async function Sxr(e,t,r){let n=re.getProdWorkspaceID(e);await z.doInWorkspaceContext(n,async()=>{let i=z.getProdWorkspaceDB();if(!await i.exists())return;let s=await i.tryGet("app_metadata");s&&(s.backupErrors||(s.backupErrors={}),s.backupErrors[t]||(s.backupErrors[t]=[]),s.backupErrors[t].push(r),await i.put(s),await qt.workspace.invalidateWorkspaceMetadata(s.appId,s))})}a(Sxr,"trackBackupError");var xxr={isEnabled:Ore,triggerAppRestore:zo(_xr),triggerAppBackup:zo(Exr),getBackupDownloadStream:zo(gZe),downloadAppBackup:zo(wxr),fetchAppBackups:zo(vxr),storeAppBackupMetadata:zo(une),updateBackupStatus:zo(mxr),updateRestoreStatus:zo(gxr),getAppBackup:zo(NM),updateAppBackup:zo(yxr),deleteAppBackup:zo(mZe),deleteAppBackups:zo(bxr),trackBackupError:zo(Sxr)},Ju=xxr;var lne={};oe(lne,{init:()=>cne});var z_=te(require("fs"));async function cne(e){Tb().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),Rxr(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),Axr(t,e)}catch(n){kt.logAlert(`Failed to perform backup for app ID: ${r.appId}`,n)}})}a(cne,"init");async function Txr(e){await re.getDB(e,{skip_setup:!0}).destroy()}a(Txr,"removeExistingApp");async function yZe(e,t,r,n){let i=re.getDevWorkspaceID(r),o=re.getProdWorkspaceID(r),s=new Date().toISOString(),u=a(async(c,l)=>{n?.doc?await Ju.updateBackupStatus(n.doc.id,c,l?.contents,l?.filename):await Ju.storeAppBackupMetadata({appId:o,timestamp:s,trigger:e,status:c,name:n?.name,type:"backup",contents:l?.contents,createdBy:n?.createdBy},{filename:l?.filename})},"updateMetadata");try{let c=await n.processing.exportAppFn(i,{tar:!0}),l=await n.processing.statsFn(i),f=`${o}/backup-${s}.tar.gz`,p=bt.ObjectStoreBuckets.BACKUPS,d=z_.default.createReadStream(c);await bt.streamUpload({bucket:p,filename:f,stream:d,extra:{type:"application/gzip",metadata:{name:n?.name,trigger:e,timestamp:s,appId:o}}}),await u("complete",{filename:f,contents:l}),z_.default.existsSync(c)&&z_.default.rmSync(c)}catch(c){kt.logAlert("App backup error",c),await u("failed");let l=n?.doc?.id||`backup-${s}`,f=c instanceof Error?c.message:String(c);await Ju.trackBackupError(o,l,`Backup export failed: ${f}`)}}a(yZe,"runBackup");async function Axr(e,t){let r=e.data,n=r.appId,i=r.import.backupId,o=r.import.nameForBackup,s=r.import.createdBy,u=vt.getTenantIDFromWorkspaceID(n);return vt.doInTenant(u,async()=>{let c=re.getDevWorkspaceID(n),l=`${c}_temp_${Date.now()}`,{rev:f}=await Ju.updateRestoreStatus(r.docId,r.docRev,"started");await yZe("restoring",u,n,{processing:t,createdBy:s,name:o});let p=await Ju.downloadAppBackup(i),d="complete";try{await t.importAppFn(l,re.getDB(l),{file:{type:"application/gzip",path:p},key:p}),await Txr(c),await new re.Replication({source:l,target:c}).replicate()}catch(h){kt.logAlert("App restore error",h),d="failed";let m=h instanceof Error?h.message:String(h);await Ju.trackBackupError(n,i,`Backup restore failed: ${m}`)}finally{try{await re.getDB(l,{skip_setup:!0}).destroy()}catch{}}await Ju.updateRestoreStatus(r.docId,f,d),z_.default.existsSync(p)&&z_.default.rmSync(p,{force:!0})})}a(Axr,"importProcessor");async function Rxr(e,t){let r=e.data,n=r.appId,i=r.export.trigger,o=r.export.name,s=vt.getTenantIDFromWorkspaceID(n);await vt.doInTenant(s,async()=>{try{let{rev:u}=await Ju.updateBackupStatus(r.docId,"started");return yZe(i,s,n,{processing:t,doc:{id:r.docId,rev:u},name:o})}catch(u){kt.logAlert("App backup error",u);let c=u instanceof Error?u.message:String(u);await Ju.trackBackupError(n,r.docId,`Backup export failed: ${c}`)}})}a(Rxr,"exportProcessor");var Oxr=a(async e=>{fZe(),await cne(e.processing)},"init"),eu={...Ju,processing:lne,init:Oxr,getBackupQueue:Tb};var Ixr=a(async e=>{e.backups&&await eu.init(e.backups)},"init");var tu={};oe(tu,{create:()=>Dxr,find:()=>Cxr,get:()=>kxr,remove:()=>Nxr,update:()=>Pxr});var bZe=te(require("lodash/fp/merge"));async function kxr(e){let t=vt.getGlobalDB(),r=new re.QueryBuilder(t.name,"user");r.setIndexBuilder(re.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[i,o]of Object.entries(e.filters?.equal??{}))r.addEqual(i,o);r.setSort("_id"),r.setSkip(e.skip);let n=await r.run();return{users:n.rows,total:n.totalRows}}a(kxr,"get");async function Cxr(e){return await zt.getById(e)}a(Cxr,"find");async function Dxr(e){let t=await Yu.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new Ie("User is already synched",409);e={...t,scimInfo:(0,bZe.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Yu.save(e,{requirePassword:!1})}a(Dxr,"create");async function Pxr(e,t){return await Yu.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}a(Pxr,"update");async function Nxr(e){return await Yu.destroy(e)}a(Nxr,"remove");var fI={};oe(fI,{create:()=>Lxr});var vZe=te(require("lodash/fp/merge"));async function Lxr(e){let t=await ire(e.name),r;if(!t)r=(await on.save(e)).id;else{if(t.scimInfo?.isSync)throw new Ie("Group is already synched",409);r=t._id,t.users&&(await on.removeUsers(r,t.users.map(i=>i._id)),delete t.users),t.scimInfo=(0,vZe.default)(t.scimInfo,e.scimInfo),await on.save(t)}return await on.get(r)}a(Lxr,"create");var W_={};oe(W_,{logRequest:()=>Fxr,logResponse:()=>Uxr});async function Fxr(e){kt.logWarn("SCIM request log",e)}a(Fxr,"logRequest");async function Uxr(e){kt.logWarn("SCIM response error",e)}a(Uxr,"logResponse");var Ci={};oe(Ci,{requireFeature:()=>jxr,requireFeatures:()=>Mxr});var jxr=a(e=>async(t,r)=>{await RM(e),await r()},"requireFeature"),Mxr=a((...e)=>async(t,r)=>{await Rre(e),await r()},"requireFeatures");var wZe=a(async(e,t)=>(K.DISABLE_SCIM_CALLS||await W_.logRequest({...e.request.toJSON(),body:e.request.body}),await z.doInScimContext(async()=>{let r=await t();return await W_.logResponse({...e.response.toJSON(),body:e.response.body}),r})),"doInScimContext");var EZe=a(async(e,t)=>{await Cre(),await t()},"requireSCIM");var LM=a(e=>fne(zt.getById,e,!0),"scimUserOnly"),FM=a(e=>fne(Zn.get,e,!0),"scimGroupOnly"),UM=a(e=>fne(Zn.get,e,!1),"internalGroupOnly");function fne(e,t,r){return async(n,i)=>{let o=n.params[t];return typeof o!="string"&&n.throw(404),!!(await e(o)).scimInfo?.isSync!==r&&n.throw(404),i()}}a(fne,"scimSyncChecks");var Bxr=require("dd-trace");async function _Ze(e){let t=e.request.body;if(t.name=t.name.trim(),delete t.roles,t._id){let n=await gm(t._id);t.roles=n.roles,t.scimInfo=n.scimInfo}let r=await q_(t);e.body={_id:r.id,_rev:r.rev}}a(_Ze,"save");async function SZe(e){let t=e.params.groupId,r=e.request.body.add,n=e.request.body.remove;(r&&!Array.isArray(r)||n&&!Array.isArray(n))&&e.throw(400,"Must supply a list of users to add or to remove");let i,o;r&&(i=await DM(t,r)),n&&(o=await $re(t,n)),e.body={added:i,removed:o}}a(SZe,"updateGroupUsers");async function xZe(e){let t=e.params.groupId,r=e.request.body.add,n=e.request.body.remove;(r&&!Array.isArray(r)||n&&!Array.isArray(n))&&e.throw(400,"Must supply a list of objects, with appId and roleId to add or remove"),e.body=await zre(t,{appsToAdd:r,appsToRemove:n})}a(xZe,"updateGroupApps");async function TZe(e){e.body={data:await lI()}}a(TZe,"fetch");async function AZe(e){let{groupId:t,rev:r}=e.params;try{await qre(t,r),e.body={message:"Group deleted successfully"}}catch(n){e.throw(n.status,n)}}a(AZe,"destroy");async function RZe(e){try{e.body=await gm(e.params.groupId)}catch(t){e.throw(t.status,t)}}a(RZe,"find");async function OZe(e){let{pageSize:t=10,bookmark:r,emailSearch:n}=e.request.query,i=e.params.groupId,o={limit:t+1},s=await dM(i,{...o,emailSearch:n,bookmark:r}),u=n?s[t]?.email:s[t]?._id,c=!!u;e.body={users:s.slice(0,t),bookmark:u,hasNextPage:c}}a(OZe,"searchUsers");async function IZe(e){let{groupId:t,appId:r}=e.params;await Wre(t,r),e.body={message:"Group app builder access updated."}}a(IZe,"addAppBuilder");async function kZe(e){let{groupId:t,appId:r}=e.params;await Gre(t,r),e.body={message:"group app builder access removed."}}a(kZe,"removeAppBuilder");async function CZe(e){let{groupId:t}=e.params,{csvContent:r}=e.request.body;(r===void 0||r.trim().length===0)&&e.throw(400,"CSV is empty");let n=await HR.jsonFromCsvString(r,{allowSingleColumn:!0});(!n||n.length===0)&&e.throw(400,"CSV file is invalid");let o=Object.keys(n[0]).find(p=>/^(email|e-mail|email address|mail|e_mail)$/i.test(p.trim()));o||e.throw(400,"CSV file must contain an email column");let s=Array.from(new Set(n.map(p=>p[o]).filter(p=>p&&typeof p=="string"&&p.trim().length>0).map(p=>p.trim())));s.length===0&&e.throw(400,"No valid email addresses found in CSV");try{await gm(t)}catch(p){if(p.status===404)e.throw(404,"Group not found");else throw p}let u=[],c=[],l=[],f=await Promise.all(s.map(p=>Yu.getUserByEmail(p)));for(let p of s){let d=f.find(h=>h?.email===p);d?(u.push({_id:d._id,email:d.email}),l.push(d._id)):c.push({email:p,reason:"User not found"})}l.length>0&&await DM(t,l),e.body={added:u,skipped:c}}a(CZe,"bulkAddUsersFromCsv");var DZe=te(require("@koa/router")),Wo=te(require("joi"));var zxr=new DZe.default;function Wxr(){return $t.joiValidator.body(Wo.default.object({_id:Wo.default.string().optional(),_rev:Wo.default.string().optional(),color:Wo.default.string().required(),icon:Wo.default.string().required(),name:Wo.default.string().trim().required().max(50),role:Wo.default.string().optional(),users:Wo.default.array().optional(),apps:Wo.default.array().optional(),roles:Wo.default.object().optional(),createdAt:Wo.default.string().optional(),updatedAt:Wo.default.string().optional()}).required())}a(Wxr,"buildGroupSaveValidation");zxr.post("/api/global/groups",$t.adminOnly,Ci.requireFeature("userGroups"),Wxr(),_Ze).get("/api/global/groups",Ci.requireFeature("userGroups"),TZe).delete("/api/global/groups/:groupId/:rev",Ci.requireFeature("userGroups"),$t.adminOnly,UM("groupId"),AZe).get("/api/global/groups/:groupId",Ci.requireFeature("userGroups"),$t.builderOrAdmin,RZe).get("/api/global/groups/:groupId/users",Ci.requireFeature("userGroups"),$t.builderOrAdmin,OZe).post("/api/global/groups/:groupId/users",$t.adminOnly,Ci.requireFeature("userGroups"),UM("groupId"),SZe).post("/api/global/groups/:groupId/users/bulk",$t.adminOnly,Ci.requireFeature("userGroups"),UM("groupId"),$t.joiValidator.body(Wo.default.object({csvContent:Wo.default.string().required()}).required()),CZe).post("/api/global/groups/:groupId/apps",$t.builderOrAdmin,Ci.requireFeature("userGroups"),xZe).post("/api/global/groups/:groupId/app/:appId/builder",$t.builderOrAdmin,Ci.requireFeatures("userGroups","appBuilders"),IZe).delete("/api/global/groups/:groupId/app/:appId/builder",$t.builderOrAdmin,Ci.requireFeatures("userGroups","appBuilders"),kZe);async function PZe(e){e.body={encryptionKeyAvailable:sl.isEncryptionKeyAvailable()}}a(PZe,"status");async function NZe(e){e.body={variables:await sl.fetch()}}a(NZe,"fetch");async function LZe(e){let{name:t,production:r,development:n}=e.request.body;await sl.update(t,{production:r,development:n});let i=["production"];r!==n&&i.push("development"),await Tt.environmentVariable.created(t,i),e.body={message:`Environment variable "${t}" created.`}}a(LZe,"create");async function FZe(e){let{production:t,development:r}=e.request.body,n=e.params.varName;await sl.update(n,{production:t,development:r}),e.body={message:`Environment variable "${n}" updated.`}}a(FZe,"update");async function UZe(e){let t=e.params.varName;await sl.remove(t),await Tt.environmentVariable.deleted(t),e.body={message:`Environment variable "${t}" deleted.`}}a(UZe,"destroy");var MZe=te(require("@koa/router")),pI=te(require("joi"));var Hxr=new MZe.default;function jZe(){return $t.joiValidator.body(pI.default.object({name:pI.default.string().optional(),production:pI.default.string().required(),development:pI.default.string().required()}))}a(jZe,"buildEnvVarUpdateValidator");Hxr.get("/api/env/variables/status",$t.builderOrAdmin,PZe).get("/api/env/variables",$t.builderOrAdmin,NZe).post("/api/env/variables",$t.builderOrAdmin,jZe(),LZe).patch("/api/env/variables/:varName",$t.builderOrAdmin,jZe(),FZe).delete("/api/env/variables/:varName",$t.builderOrAdmin,UZe);async function BZe(e){let t=e.request.body,r=await xb.fetch(t);await Tt.auditLog.filtered(t),e.body=r}a(BZe,"search");async function qZe(e){let t=e.request.body,{stream:r}=xb.download(t);await Tt.auditLog.downloaded(t),e.attachment(`audit-logs-${Date.now()}.log`),e.body=r}a(qZe,"download");async function $Ze(e){e.body={events:xb.definitions()}}a($Ze,"definitions");var WZe=te(require("@koa/router")),Xu=te(require("joi"));function zZe(){return $t.joiValidator.body(Xu.default.object({userIds:Xu.default.array().items(Xu.default.string()).optional(),appIds:Xu.default.array().items(Xu.default.string()).optional(),events:Xu.default.array().items(Xu.default.string().valid(...Object.values(Er))).optional(),startDate:Xu.default.string().optional().allow(""),endDate:Xu.default.string().optional().allow(""),fullSearch:Xu.default.string().optional().allow(""),bookmark:Xu.default.number()}))}a(zZe,"buildAuditLogSearchValidator");var Kxr=new WZe.default;Kxr.post("/api/global/auditlogs/search",$t.adminOnly,zZe(),BZe).get("/api/global/auditlogs/download",$t.adminOnly,AU.querystringToBody,zZe(),qZe).get("/api/global/auditlogs/definitions",$t.adminOnly,$Ze);var XZe=te(require("@koa/router")),Ob=te(require("joi"));async function Rb(e,t){t||e.throw(400,"App ID missing"),await oI.workspaceExists(t)||e.throw(400,`Provided app ID: ${t} - is invalid.`)}a(Rb,"checkAppID");async function GZe(e){let t=e.params.appId;await Rb(e,t);let{body:r}=e.request,n=e.user?._id,i=await eu.triggerAppBackup(t,"manual",{name:r.name,createdBy:n});i||e.throw(500,"Unable to start backup."),e.body={backupId:i,message:"Backup triggered - process starting."}}a(GZe,"manualBackup");async function HZe(e){let t=e.params.appId;await Rb(e,t);let r=e.params.backupId,n=e.request.body.name,i=await eu.triggerAppRestore(t,r,n,e.user?._id);i||e.throw(500,"Unable to start restore."),await Tt.backup.appBackupRestored(i.metadata),e.body={restoreId:i?.restoreId,message:"Restore triggered - process starting."}}a(HZe,"importBackup");async function VZe(e){let t=e.params.appId;await Rb(e,t);let r=e.params.backupId;await eu.deleteAppBackup(r),e.body={message:"Backup deleted successfully."}}a(VZe,"deleteBackup");async function KZe(e){let t=z.getWorkspaceId();await Rb(e,t);let{backupIds:r}=e.request.body;(!Array.isArray(r)||r.length===0)&&e.throw(400,"backupIds must be a non-empty array");let n=await eu.deleteAppBackups(r),i=n.filter(s=>s.success).length,o=n.length-i;e.body={message:`${i} backups deleted successfully${o>0?`, ${o} failed`:""}.`,results:n,successCount:i,failureCount:o}}a(KZe,"deleteBackups");async function QZe(e){let t=e.params.appId;await Rb(e,t);let r=e.request.body;r?.trigger&&(r.trigger=r.trigger.toLowerCase(),Object.values(Cm).includes(r.trigger)||e.throw(400,"Provided trigger is not a valid option.")),e.body=await eu.fetchAppBackups(t,{paginate:!0,...r})}a(QZe,"fetchBackups");async function YZe(e){let t=e.params.appId;await Rb(e,t);let r=e.params.backupId,n=e.request.body;e.body=await eu.updateAppBackup(r,n.name)}a(YZe,"updateBackup");async function JZe(e){let t=e.params.appId;await Rb(e,t);let r=e.params.backupId,{metadata:n,stream:i}=await eu.getBackupDownloadStream(r);e.attachment(`backup-${n.timestamp}.tar.gz`),e.body=i}a(JZe,"downloadBackup");var Yxr=new XZe.default;function Jxr(){return $t.joiValidator.body(Ob.default.object({trigger:Ob.default.string().valid(...Object.values(Cm)),type:Ob.default.string().valid(...Object.values(vS)),startDate:Ob.default.date(),endDate:Ob.default.date(),page:Ob.default.string()}))}a(Jxr,"validateBackupSearch");Yxr.post("/api/apps/:appId/backups",$t.builderOrAdmin,GZe).post("/api/apps/:appId/backups/search",$t.builderOrAdmin,Jxr(),QZe).get("/api/apps/:appId/backups/:backupId/file",$t.builderOrAdmin,JZe).patch("/api/apps/:appId/backups/:backupId",$t.builderOrAdmin,YZe).delete("/api/apps/:appId/backups/:backupId",$t.builderOrAdmin,VZe).delete("/api/apps/:appId/backups",$t.builderOrAdmin,KZe).post("/api/apps/:appId/backups/:backupId/import",$t.builderOrAdmin,HZe);var Ret=te(require("@koa/router"));var WM=te(Dne());function het(e,t){let r=e.request.query[t];if(r!==void 0)return+r}a(het,"tryGetQueryAsNumber");var met=a(async e=>{let t=het(e,"pageSize")??20,r=het(e,"startIndex"),n;e.request.query.filter&&(n=la.user.userFilters(e.request.query.filter));let i=await tu.get({pageSize:t,skip:r,filters:n});e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:i.total,Resources:i.users.map(la.user.toScimUserResponse),startIndex:(r||0)+1,itemsPerPage:t}},"get"),get=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404);let r=await tu.find(t);e.body=la.user.toScimUserResponse(r)},"find"),yet=a(async e=>{let t=la.user.fromScimUser(e.request.body);try{let r=await tu.create(t);e.body=la.user.toScimUserResponse(r)}catch(r){throw r instanceof gp&&e.throw(409,"Email already in use"),r}},"create");function wTr(e){let t=e.Operations.find(r=>(r.op==="Replace"||r.op==="replace")&&r.path==="active");return t?t.value===!1||t.value?.toLowerCase?.()==="false":!1}a(wTr,"isDeactivation");var bet=a(async e=>{let t=await tu.find(e.params.id);t||e.throw(404);let r=la.user.toScimUserResponse(t),n=e.request.body;try{(0,WM.patchBodyValidation)(n)}catch{}if(wTr(n))return Pne(e);let i;try{i=(0,WM.scimPatch)(r,n.Operations)}catch{}i||e.throw(500);let o=la.user.fromScimUser(i);await tu.update(o,{allowChangingEmail:!0}),e.body=la.user.toScimUserResponse(o)},"update"),Pne=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404),await tu.remove(t),e.status=204},"remove");var vet=te(require("lodash/groupBy"));var GM=te(Dne());var HM=te(zM());function wet(e,t){for(let r of t.split(","))delete e[r]}a(wet,"cleanResponse");var Eet=a(async e=>{let r=(await on.fetch()).filter(o=>o.scimInfo?.isSync).map(la.group.toScimGroupResponse),{filter:n,excludedAttributes:i}=e.request.query;if(n){let o=(0,HM.filter)((0,HM.parse)(n));r=r.filter(o)}i&&r.forEach(o=>{wet(o,i)}),e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:r.length,Resources:r,startIndex:1,itemsPerPage:r.length}},"get"),_et=a(async e=>{let t=la.group.fromScimGroup(e.request.body),r=await fI.create(t);e.body=la.group.toScimGroupResponse(r)},"create"),xet=a(async e=>{let{id:t}=e.params,r=await on.get(t),n=la.group.toScimGroupResponse(r),{excludedAttributes:i}=e.request.query;i&&wet(n,i),e.body=n},"find"),Tet=a(async e=>{let{id:t}=e.params,r=await on.get(t);await on.remove(t,r._rev),e.status=204},"remove"),Aet=a(async e=>{let{id:t}=e.params,r=await on.get(t),n=la.group.toScimGroupResponse(r),i=e.request.body;try{(0,GM.patchBodyValidation)(i)}catch{e.throw(400)}let{true:o,false:s}=(0,vet.default)(i.Operations,u=>u.path==="members");if(s?.length){let u=(0,GM.scimPatch)(n,s);u||e.throw(500);let c={...la.group.fromScimGroup(u),_rev:r._rev};await on.save(c)}if(o?.length){let u=[],c=[];for(let{op:l,value:f}of o)switch(l){case"add":case"Add":for(let p of f)u.push(await tu.find(p.value));break;case"remove":case"Remove":for(let p of f)c.push(await tu.find(p.value));break;case"replace":case"Replace":throw new Error("Replacing members is not allowed");default:tr.unreachable(l)}u.length&&await on.addUsers(t,u.map(l=>l._id)),c.length&&await on.removeUsers(t,c.map(l=>l._id))}e.body=la.group.toScimGroupResponse(await on.get(t))},"update");var Zu=new Ret.default({prefix:"/api/global/scim/v2"});Zu.use(EZe);Zu.use(wZe);Zu.get("/users",met);Zu.get("/users/:id",LM("id"),get);Zu.post("/users",yet);Zu.patch("/users/:id",LM("id"),bet);Zu.delete("/users/:id",LM("id"),Pne);Zu.get("/groups",Eet);Zu.post("/groups",Ci.requireFeature("userGroups"),_et);Zu.get("/groups/:id",Ci.requireFeature("userGroups"),FM("id"),xet);Zu.delete("/groups/:id",Ci.requireFeature("userGroups"),FM("id"),Tet);Zu.patch("/groups/:id",Ci.requireFeature("userGroups"),FM("id"),Aet);var ket=te(require("@koa/router"));async function Oet(e){let{userId:t,appId:r}=e.params,n=await ym.db.getUser(t);if(zt.isGlobalBuilder(n)){e.body={message:"User already admin - no permissions updated."};return}await ym.addAppBuilder(n,r),e.body={message:`User "${n.email}" app builder access updated.`}}a(Oet,"addAppBuilder");async function Iet(e){let{userId:t,appId:r}=e.params,n=await ym.db.getUser(t);if(zt.isGlobalBuilder(n)){e.body={message:"User already admin - no permissions removed."};return}await ym.removeAppBuilder(n,r),e.body={message:`User "${n.email}" app builder access removed.`}}a(Iet,"removeAppBuilder");var xTr=new ket.default;xTr.post("/api/global/users/:userId/app/:appId/builder",$t.builderOrAdmin,Ci.requireFeatures("appBuilders"),Oet).delete("/api/global/users/:userId/app/:appId/builder",$t.builderOrAdmin,Ci.requireFeatures("appBuilders"),Iet);var la={};oe(la,{group:()=>Lne,user:()=>Nne});var Nne={};oe(Nne,{fromScimUser:()=>kTr,toScimUserResponse:()=>RTr,userFilters:()=>CTr});var Cet=te(zM());var{unreachable:ATr}=tr,RTr=a(e=>{let{isSync:t,roles:r,...n}=e.scimInfo||{},i={...n,schemas:["urn:ietf:params:scim:schemas:core:2.0:User"],id:e._id,meta:{resourceType:"User",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},active:e.status==="active"};return(e.firstName||e.lastName)&&(i.name={formatted:[e.firstName,e.lastName].filter(o=>o).join(" "),familyName:e.lastName,givenName:e.firstName}),i},"toScimUserResponse"),OTr=a(e=>!!e?.id,"isScimUserResponse");function ITr(e){if(Cr.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}a(ITr,"tryGetEmail");var kTr=a(e=>{let t=OTr(e)?e:void 0,r=ITr(e);if(!r)throw new Error("Email is required");let n;switch(e.active){case"True":case"true":case!0:n=!0;break;case"False":case"false":case!1:n=!1;break;default:ATr(e.active)}let i,o;return e.name?.givenName?(i=e.name?.givenName,o=e.name?.familyName):i=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:i,lastName:o,scimInfo:{...e,isSync:!0},roles:{},status:n?"active":"inactive",createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimUser"),CTr=a(e=>{let t={equal:{}},r=(0,Cet.parse)(e);function n(i){switch(i.op){case"eq":{let o=i.attrPath,s;switch(o){case"emails.value":s="email";break;default:s=`scimInfo.${o}`}t.equal[s]=i.compValue;break}case"and":for(let o of i.filters)n(o);break;default:console.warn("Filter not handled",{filter:i})}}return a(n,"parseFilters"),n(r),t},"userFilters");var Lne={};oe(Lne,{fromScimGroup:()=>NTr,toScimGroupResponse:()=>DTr});var DTr=a(e=>({schemas:["urn:ietf:params:scim:schemas:core:2.0:Group"],id:e._id,externalId:e.scimInfo.externalId,meta:{resourceType:"Group",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},displayName:e.name,members:e.users?.map(t=>({value:t._id}))}),"toScimGroupResponse"),PTr=a(e=>!!e?.id,"isScimGroup"),NTr=a(e=>{let t=PTr(e)?e:void 0;return{_id:t?.id,name:e.displayName,scimInfo:{externalId:e.externalId,isSync:!0},icon:"UserGroup",color:"var(--spectrum-global-color-blue-600)",createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimGroup");var ci={};oe(ci,{LLM:()=>wf,LLMRequest:()=>Di,TableGeneration:()=>iie,agentHistoryTitleSystemPrompt:()=>GTr,agentSystemPrompt:()=>WTr,aiColumnSchemas:()=>rie,aiTableResponseToTableSchema:()=>Xne,appendAIColumns:()=>Zne,classifyText:()=>jne,cleanData:()=>Mne,extractFileData:()=>BTr,generateAIColumns:()=>Yne,generateCode:()=>zTr,generateCronExpression:()=>Bne,generateData:()=>Jne,generateJs:()=>Wne,generateSQL:()=>$Tr,generateTables:()=>Qne,generationStructure:()=>tie,getLLM:()=>wI,getLLMConfig:()=>Kne,getLLMOrThrow:()=>jet,normalizeContentType:()=>Fne,parseResponseFormat:()=>KM,sanitiseToolName:()=>LTr,searchWeb:()=>zne,sentimentAnalysis:()=>$ne,summarizeText:()=>VM,tableDataStructuredOutput:()=>nie,translate:()=>qne});function LTr(e){if(e.length>64)throw new Error("Tool name must be under 64 characters long");return e.replace(/[^a-zA-Z0-9_-]/g,"_")}a(LTr,"sanitiseToolName");function Fne(e){return e?e.includes("/")?e:{pdf:"application/pdf",jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png"}[e.toLowerCase()]||"application/octet-stream":"application/octet-stream"}a(Fne,"normalizeContentType");var QM=te(require("openai"));var vm=te(require("dd-trace"));function Une(e,t){return t.map(r=>e[r]).join(" ")}a(Une,"extractTextFromColumns");var wf=class{static{a(this,"LLM")}constructor({model:t,apiKey:r,maxTokens:n}){this._model=t,this._apiKey=r,this._maxTokens=n??parseInt(process.env.BUDIBASE_AI_MAX_PROMPT_TOKENS||"1000")}get model(){return this._model}get apiKey(){return this._apiKey}get maxTokens(){return this._maxTokens}async prompt(t){return await vm.default.trace("prompt",async()=>{let r=typeof t=="string"?new Di().addUserMessage(t):t,{messages:n,tokensUsed:i}=await vm.default.trace("chatCompletion",()=>this.chatCompletion(r));return!n||n.length===0?{message:"",tokensUsed:i}:{message:n[n.length-1].content||"",tokensUsed:i}})}async chat(t){return await vm.default.trace("chat",async()=>await this.chatCompletion(t))}async*chatStream(t){yield*this.chatCompletionStream(t)}async summarizeText(t){return vm.default.trace("summarizeText",()=>this.prompt(VM(t)))}async generateCronExpression(t){return vm.default.trace("generateCronExpression",()=>this.prompt(Bne(t)))}async operation(t,r){return vm.default.trace("operation",n=>{n.addTags({operation:t.operation,rowId:r.id});let i=this.promptForOperation(t,r);return this.prompt(i)})}promptForOperation(t,r){let{operation:n,column:i,columns:o,language:s,categories:u,prompt:c}=t;switch(n){case"SUMMARISE_TEXT":return VM(Une(r,o));case"CLEAN_DATA":return Mne(r[i]);case"TRANSLATE":return qne(r[i],s);case"CATEGORISE_TEXT":if(!u)throw Error("No categories provided for categorise text operation. Please provide categories.");return jne(Une(r,o),u.split(","));case"SENTIMENT_ANALYSIS":return $ne(r[i]);case"PROMPT":return c;case"SEARCH_WEB":return zne(Une(r,o));default:throw tr.unreachable(n)}}async generateJs(t,r){return await vm.default.trace("generateJs",async()=>{let{bindings:n=[],snippets:i=[]}=r||{};return await this.prompt(Wne(n,i).addUserMessage(t))})}};var Gne=require("openai/helpers/zod");var Pet=(n=>(n.GPT_5_MINI="gpt-5-mini",n.GPT_5="gpt-5",n.GPT_5_NANO="gpt-5-nano",n))(Pet||{});function KM(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}a(KM,"parseResponseFormat");function Det(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}a(Det,"calculateBudibaseAICredits");var ec=class extends wf{constructor(r){super(r);this.client=this.getClient(r)}static{a(this,"OpenAI")}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new QM.default({apiKey:r.apiKey})}async uploadFile(r,n,i){let o=Fne(i);if(ok.includes(o.toLowerCase())){let c;if(Buffer.isBuffer(r))c=r;else{let f=[];for await(let p of r)f.push(new Uint8Array(p));c=Buffer.concat(f)}let l=c.toString("base64");return`data:${o};base64,${l}`}let s=await(0,QM.toFile)(r,n);return(await this.client.files.create({file:s,purpose:"assistants"})).id}async chatCompletion(r){let n={model:this.model,messages:r.messages,max_completion_tokens:this._maxTokens,response_format:KM(r.format)};Object.values(Pet).includes(this.model)&&(n.verbosity="low",n.reasoning_effort="minimal"),r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(Gne.zodFunction));let i=await this.client.chat.completions.create(n),o=i?.choices?.[0]?.message;if(o?.tool_calls){r.addMessage(o);let s=[];for(let u of o.tool_calls){if(u.type!=="function"||!u.function){console.warn(`[OPENAI TOOL WARN] Unsupported tool call type: ${u.type}`);continue}let c=u.function.name,l=r.findTool(c);if(!l)throw new Error(`Tool ${c} not found in prompt tools`);let f=JSON.parse(u.function.arguments);s.push(l.handler(f).then(p=>({role:"tool",tool_call_id:u.id,content:p})).catch(p=>(console.error(`[OPENAI TOOL ERROR] Tool ${c} failed in OpenAI handler:`,p),{role:"tool",tool_call_id:u.id,content:`Error: ${p.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:Det(i.usage)};throw new Error("No response found")}}async*chatCompletionStream(r){let n={model:this.model,messages:r.messages,max_tokens:this.maxTokens,response_format:KM(r.format),stream:!0};r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(Gne.zodFunction));try{let i=await this.client.chat.completions.create(n),o=null,s="",u=null;for await(let l of i){let f=l?.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 p=f.tool_calls[0];p.id?(o={id:p.id,name:p.function?.name||"",arguments:p.function?.arguments||""},yield{type:"tool_call_start",toolCall:{id:o.id,name:o.name,arguments:o.arguments}}):o&&p.function?.arguments&&(o.arguments+=p.function.arguments,yield{type:"tool_call_start",toolCall:{id:o.id,name:o.name,arguments:o.arguments}})}l.usage&&(u=l.usage)}}let c=u?Det(u):0;if(o){r.addMessage({role:"assistant",content:"",tool_calls:[{id:o.id,type:"function",function:{name:o.name,arguments:o.arguments}}]});let l=r.findTool(o.name);if(l)try{let f=JSON.parse(o.arguments),p=await l.handler(f);yield{type:"tool_call_result",toolResult:{id:o.id,result:p}},r.addMessage({role:"tool",tool_call_id:o.id,content:p}),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:c}}catch(i){yield{type:"error",content:i.message}}}};var Hne=require("dd-trace");var YM=class extends wf{static{a(this,"BudibaseAI")}async prompt(t){let r=await super.prompt(t);return r.tokensUsed&&await kM(r.tokensUsed),r}async chat(t){let r=await super.chat(t);return r.tokensUsed&&await kM(r.tokensUsed),r}async uploadFile(t,r,n){return K.SELF_HOSTED?this.uploadFileSelfHost(t,r,n):this.uploadFileCloud(t,r,n)}async uploadFileCloud(t,r,n){return new ec({apiKey:K.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).uploadFile(t,r,n)}async uploadFileSelfHost(t,r,n){let i;if(Buffer.isBuffer(t))i=t;else{let c=[];for await(let l of t)c.push(new Uint8Array(l));i=Buffer.concat(c)}let o=i.toString("base64");if(n&&ok.includes(n.toLowerCase()))return`data:image/jpeg;base64,${o}`;if(!K.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let c=await TM();if(!c)throw new Error("No license key found");this._apiKey=c}let s=await fetch(`${K.BUDICLOUD_URL}/api/ai/upload-file`,{method:"POST",headers:{"Content-Type":"application/json",[gr.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:o,filename:r,contentType:n})});if(!s.ok)throw await Ie.fromResponse(s);return(await s.json()).fileId}async chatCompletion(t){return K.SELF_HOSTED?this.chatCompletionSelfHost(t):this.chatCompletionCloud(t)}async chatCompletionCloud(t){return await Hne.tracer.trace("chatCompletionCloud",async()=>await new ec({apiKey:K.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletion(t))}async chatCompletionSelfHost(t){return await Hne.tracer.trace("chatCompletionSelfHost",async r=>{if(!K.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(r.addTags({budicloudUrl:K.BUDICLOUD_URL}),!this._apiKey){let o=await TM();if(!o)throw new Error("No license key found");this._apiKey=o,r.addTags({licenseKey:this._apiKey})}let n={messages:t.messages,format:t.format,useTools:t.tools.length>0},i=await fetch(`${K.BUDICLOUD_URL}/api/ai/chat`,{method:"POST",headers:{"Content-Type":"application/json",[gr.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(n)});if(!i.ok)throw await Ie.fromResponse(i);return await i.json()})}async*chatCompletionStream(t){K.SELF_HOSTED?yield*this.chatCompletionStreamSelfHost(t):yield*this.chatCompletionStreamCloud(t)}async*chatCompletionStreamCloud(t){yield*new ec({apiKey:K.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletionStream(t)}async*chatCompletionStreamSelfHost(t){try{let r=await this.chatCompletionSelfHost(t);if(r.messages.length>0){let n=r.messages[r.messages.length-1];n.content&&(yield{type:"content",content:n.content})}yield{type:"done",messages:r.messages,tokensUsed:r.tokensUsed}}catch(r){yield{type:"error",content:r.message}}}};var vI=require("dd-trace");var Vne=te(require("@anthropic-ai/sdk"));function FTr(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}a(FTr,"calculateBudibaseAICredits");var JM=class extends wf{constructor(r){super(r);this.client=new Vne.default({apiKey:r.apiKey})}static{a(this,"Anthropic")}firstTextBlock(r){for(let n of r.content)if(n.type==="text")return n.text}async uploadFile(r,n,i){throw new Error("File upload not supported for this LLM provider")}async chatCompletion(r){try{let n=await this.client.messages.create({model:this.model,messages:r.messages.map(({content:o})=>{if(o==null)return{role:"user",content:""};if(typeof o=="string")return{role:"user",content:o};let s="";for(let u of o)u.type==="text"?s+=u.text:["image_url","input_audio","file"].includes(u.type);return{role:"user",content:s}}),max_tokens:this.maxTokens}),i=this.firstTextBlock(n)||"";return{messages:[...r.messages,{role:"assistant",content:i}],tokensUsed:FTr(n.usage)}}catch(n){throw n instanceof Vne.default.APIError&&console.error(`Anthropic Prompt failed with error ${n.name} and status: ${n.status}`),n}}async*chatCompletionStream(r){try{let n=await this.chatCompletion(r);if(n.messages.length>0){let i=n.messages[n.messages.length-1];i.content&&(yield{type:"content",content:i.content})}yield{type:"done",messages:n.messages,tokensUsed:n.tokensUsed}}catch(n){yield{type:"error",content:n.message}}}};var Let=require("zod"),Fet=require("openai/helpers/zod");var Net=require("openai");var XM=class extends ec{static{a(this,"AzureOpenAI")}getClient(t){if(!t.apiKey)throw new Error("No Azure OpenAI API key found");if(!t.model)throw new Error("No Azure OpenAI model specified");return new Net.AzureOpenAI({apiKey:t.apiKey,apiVersion:"2024-10-01-preview",baseURL:t.baseUrl})}};var Uet="gpt-5-mini",UTr={OpenAI:ec,TogetherAI:ec,AzureOpenAI:XM,Custom:ec,Anthropic:JM,BudibaseAI:YM};async function jTr(){return await vI.tracer.trace("getAIConfig",async e=>{let t={type:"ai",config:{}};if(!z.isSelfHostUsingCloud()){let n=await qa.getAIConfig();n&&(t=n)}await Pre(t);let r=Object.values(t.config).find(n=>n.active&&n.isDefault);if(!r){e.addTags({enabled:!1,reason:"no provider found"});return}return e.addTags({enabled:!0}),{provider:r.provider,model:r.defaultModel||Uet,apiKey:r.apiKey,baseUrl:r.baseUrl}})}a(jTr,"getAIConfig");async function MTr(){return vI.tracer.trace("getSelfHostOpenAIKeyConfig",e=>{if(!K.SELF_HOSTED){e.addTags({enabled:!1,reason:"not self host"});return}if(!K.OPENAI_API_KEY){e.addTags({enabled:!1,reason:"no OPENAI_API_KEY"});return}return e.addTags({enabled:!0}),{provider:"OpenAI",model:Uet,apiKey:K.OPENAI_API_KEY}})}a(MTr,"getSelfHostOpenAIKeyConfig");async function Kne(){return vI.tracer.trace("getLLMConfig",async()=>await jTr()||await MTr())}a(Kne,"getLLMConfig");async function wI(e){return await vI.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:n}=e||{},i=await Kne();if(!i){t.addTags({enabled:!1,reason:"no config found"});return}r&&(i.model=r),n&&(i.maxTokens=n);let o=UTr[i.provider];if(!o){t.addTags({enabled:!1,reason:"no provider found",provider:i.provider});return}return new o(i)})}a(wI,"getLLM");async function jet(){let e=await wI();if(!e)throw new Ie("No available LLM configurations",500);return e}a(jet,"getLLMOrThrow");var Di=class e{constructor(){this.messages=[];this.tools=[]}static{a(this,"LLMRequest")}addTool(t){return this.tools.push(t),this}addTools(t){return this.tools.push(...t),this}findTool(t){return this.tools.find(r=>r.name===t)}withFormat(t){return t instanceof Let.z.ZodType?this.format=(0,Fet.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 rd=require("zod");function VM(e,t){let r=`Summarize this text:
|
|
755
|
+
`;i.write(u)}}),r.on("end",()=>{i.end()}),{promise:n,stream:i}}a(sZe,"dump");var txr=gr.MIN_VALID_DATE.toISOString(),rxr=gr.MAX_VALID_DATE.toISOString();function tne(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||txr,e.endDate=e.endDate||rxr),e}a(tne,"fillDates");async function uZe(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(n=>re.getProdWorkspaceID(n)));let t={};function r(n,i){i?.length&&(t.oneOf={...t.oneOf,[n]:i})}return a(r,"addStringParams"),r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=tne(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}a(uZe,"getSearchFilters");function rne(e,t,r){let n={_id:e,status:"deleted"};switch(t){case"app":n.name=r?.appName;break;case"user":n.email=r?.email;break}return n}a(rne,"deleted");function nne(e){let t=Js(e);for(let r of t){let n=` "${r}"`;e=e.replace(e.includes(n)?n:` ${r}`,""),e=Tn(e,{})}return e}a(nne,"removeTemplateStrings");function cZe(e,t){let r=Wb[e];if(!r)throw new Error("No friendly name found.");let n=Tn(r,t);return n.includes('""')&&(n=nne(r)),n}a(cZe,"getEventFriendlyName");async function nxr(e,t,r){if(!await OM()||!Cr.isAudited(e))return;let n=cZe(e,t),i=new Date;r?.timestamp&&(i=new Date(r.timestamp));let o={timestamp:i.toISOString(),event:e,name:n,userId:r?.userId||use,metadata:{...t,...r?.hostInfo}},s={};try{if(r?.appId){o.appId=re.getProdWorkspaceID(r.appId);let u=await qt.workspace.getWorkspaceMetadata(r.appId);"name"in u&&(s.appName=u.name)}if(r?.userId){let u=await zt.getById(r?.userId);s.email=u.email}}catch(u){kt.logAlert("Failed to retrieve fallback information for audit log",u)}return o.fallback=s,await oZe(o)}a(nxr,"write");async function ixr(e){let t=e.map(u=>u.userId),n=e.filter(u=>u.appId).map(u=>re.getDevWorkspaceID(u.appId)),i=await zt.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),o=await re.getWorkspacesByIDs([...new Set(n)]),s=[];for(let u of e){let c=i.find(p=>p?._id===u.userId),l=o.find(p=>re.isSameWorkspaceID(p?.appId,u.appId)),f={event:u.event,timestamp:u.timestamp,name:u.name,metadata:u.metadata,user:c||rne(u.userId,"user",u.fallback)};u.appId&&(f.app=l||rne(u.appId,"app",u.fallback)),s.push(f)}return s}a(ixr,"enrich");async function axr(e){if(!await OM())throw new Error("Audit logs not available - license required.");let t=await uZe(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await ene(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await ixr(r.rows)}}a(axr,"fetch");function oxr(e){return e=tne(e),sZe(e)}a(oxr,"download");function sxr(){let e=Object.entries(Wb).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=nne(r[1]);return t}a(sxr,"definitions");var sne={};oe(sne,{applications:()=>one,roles:()=>ane,users:()=>ine});var ine={};oe(ine,{roleCheck:()=>cxr});function uxr(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}a(uxr,"removeRoles");async function cxr(e,t){return await Zp()||uxr(e,t),e}a(cxr,"roleCheck");var ane={};oe(ane,{assign:()=>lxr,unAssign:()=>fxr});async function lxr(e,t){if(!await Zp())throw new Error("Unable to assign roles - license required.");let r=await Yu.bulkGet(e);for(let n of r){if(t.role&&t.role.roleId){let i=re.getProdWorkspaceID(t.role.appId);n.roles[i]=t.role.roleId}if(t.appBuilder){let i=re.getProdWorkspaceID(t.appBuilder.appId),o=n.builder?.apps||[];n.builder={apps:o.concat([i])}}t.builder&&(n.builder={global:!0}),t.admin&&(n.admin={global:!0}),n.roles}await Yu.bulkUpdate(r)}a(lxr,"assign");async function fxr(e,t){if(!await Zp())throw new Error("Unable to un-assign roles - license required.");let r=await Yu.bulkGet(e);for(let n of r){if(t.role){let i=re.getProdWorkspaceID(t.role?.appId);n.roles[i]===t.role.roleId&&delete n.roles[i]}if(t.appBuilder&&n.builder?.apps){let i=re.getProdWorkspaceID(t.appBuilder.appId);n.builder.apps=n.builder.apps.filter(o=>o!==i)}t.builder&&n.builder&&delete n.builder,t.admin&&n.admin&&delete n.admin}}a(fxr,"unAssign");var one={};oe(one,{buildExportFn:()=>dxr,buildImportFn:()=>pxr});function pxr(e){return async(t,r)=>{await Zp()||t.throw(403,"Endpoint unavailable, license required."),t.request.files?.appExport||t.throw(400,"Must provide app export file for import."),await z.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}a(pxr,"buildImportFn");function dxr(e){return async(t,r)=>{await Zp()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:n,excludeRows:i}=t.request.body;await z.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:n,excludeRows:i},t.query.appId=t.params.appId,await e(t),await r()})}}a(dxr,"buildExportFn");var pZe=te(require("fs")),dZe=require("path");var lZe;function fZe(){lZe=new fo.BudibaseQueue(fo.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}a(fZe,"init");function Tb(){return lZe}a(Tb,"getBackupQueue");async function une(e,t={}){return Qu.storeAppBackupMetadata(e,t)}a(une,"storeAppBackupMetadata");function hZe(e){let t=new Date().toISOString();switch(e){case"complete":case"failed":return{timestamp:t,finishedAt:t};case"started":return{timestamp:t,startedAt:t};case"pending":return{timestamp:t,createdAt:t}}}a(hZe,"getTimestamps");async function mxr(e,t,r,n){let i=await NM(e);return await Qu.storeAppBackupMetadata({...i,...hZe(t),contents:r,status:t,type:"backup"},{filename:n,docId:e})}a(mxr,"updateBackupStatus");async function gxr(e,t,r){let n=await NM(e);return await Qu.storeAppBackupMetadata({...n,...hZe(r),status:r,type:"restore",trigger:"manual"},{docId:e,docRev:t})}a(gxr,"updateRestoreStatus");async function NM(e){return Qu.getAppBackupMetadata(e)}a(NM,"getAppBackup");async function yxr(e,t){return Qu.updateAppBackupMetadata(e,t)}a(yxr,"updateAppBackup");async function mZe(e){let t=await Qu.getAppBackupMetadata(e);return t.filename&&await bt.deleteFile(bt.ObjectStoreBuckets.BACKUPS,t.filename),Qu.deleteAppBackupMetadata(e)}a(mZe,"deleteAppBackup");async function bxr(e){let t=[];for(let r of e)try{await mZe(r),t.push({backupId:r,success:!0})}catch(n){t.push({backupId:r,success:!1,error:n instanceof Error?n.message:"Unknown error"})}return t}a(bxr,"deleteAppBackups");async function vxr(e,t){return Qu.fetchAppBackups(e,t)}a(vxr,"fetchAppBackups");async function gZe(e){let t=await Qu.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let r=await bt.getReadStream(bt.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}a(gZe,"getBackupDownloadStream");async function wxr(e){let{stream:t}=await gZe(e),r=(0,dZe.join)(bt.budibaseTempDir(),Cr.newid()),n=pZe.default.createWriteStream(r);return new Promise((i,o)=>{t.on("error",o),n.on("error",o),t.pipe(n).on("close",()=>i(r))})}a(wxr,"downloadAppBackup");async function Exr(e,t,r={}){let n;try{n=await une({appId:e,trigger:t,timestamp:new Date().toISOString(),status:"pending",type:"backup",...r})}catch(i){if(i.status===409)return;throw i}return await Tb().add({docId:n.id,docRev:n.rev,appId:e,export:{trigger:t,...r}}),await Tt.backup.appBackupTriggered(e,n.id,"backup",t,r?.name),n.id}a(Exr,"triggerAppBackup");async function _xr(e,t,r,n){let i=await NM(t),o;try{o=await une({appId:e,timestamp:new Date().toISOString(),status:"pending",type:"restore",createdBy:n})}catch(s){if(s?.status===409)return;throw s}return await Tb().add({appId:e,docId:o.id,docRev:o.rev,import:{nameForBackup:r,backupId:t,createdBy:n}}),{restoreId:o.id,metadata:i}}a(_xr,"triggerAppRestore");async function Sxr(e,t,r){let n=re.getProdWorkspaceID(e);await z.doInWorkspaceContext(n,async()=>{let i=z.getProdWorkspaceDB();if(!await i.exists())return;let s=await i.tryGet("app_metadata");s&&(s.backupErrors||(s.backupErrors={}),s.backupErrors[t]||(s.backupErrors[t]=[]),s.backupErrors[t].push(r),await i.put(s),await qt.workspace.invalidateWorkspaceMetadata(s.appId,s))})}a(Sxr,"trackBackupError");var xxr={isEnabled:Ore,triggerAppRestore:zo(_xr),triggerAppBackup:zo(Exr),getBackupDownloadStream:zo(gZe),downloadAppBackup:zo(wxr),fetchAppBackups:zo(vxr),storeAppBackupMetadata:zo(une),updateBackupStatus:zo(mxr),updateRestoreStatus:zo(gxr),getAppBackup:zo(NM),updateAppBackup:zo(yxr),deleteAppBackup:zo(mZe),deleteAppBackups:zo(bxr),trackBackupError:zo(Sxr)},Ju=xxr;var lne={};oe(lne,{init:()=>cne});var z_=te(require("fs"));async function cne(e){Tb().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),Rxr(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),Axr(t,e)}catch(n){kt.logAlert(`Failed to perform backup for app ID: ${r.appId}`,n)}})}a(cne,"init");async function Txr(e){await re.getDB(e,{skip_setup:!0}).destroy()}a(Txr,"removeExistingApp");async function yZe(e,t,r,n){let i=re.getDevWorkspaceID(r),o=re.getProdWorkspaceID(r),s=new Date().toISOString(),u=a(async(c,l)=>{n?.doc?await Ju.updateBackupStatus(n.doc.id,c,l?.contents,l?.filename):await Ju.storeAppBackupMetadata({appId:o,timestamp:s,trigger:e,status:c,name:n?.name,type:"backup",contents:l?.contents,createdBy:n?.createdBy},{filename:l?.filename})},"updateMetadata");try{let c=await n.processing.exportAppFn(i,{tar:!0}),l=await n.processing.statsFn(i),f=`${o}/backup-${s}.tar.gz`,p=bt.ObjectStoreBuckets.BACKUPS,d=z_.default.createReadStream(c);await bt.streamUpload({bucket:p,filename:f,stream:d,extra:{type:"application/gzip",metadata:{name:n?.name,trigger:e,timestamp:s,appId:o}}}),await u("complete",{filename:f,contents:l}),z_.default.existsSync(c)&&z_.default.rmSync(c)}catch(c){kt.logAlert("App backup error",c),await u("failed");let l=n?.doc?.id||`backup-${s}`,f=c instanceof Error?c.message:String(c);await Ju.trackBackupError(o,l,`Backup export failed: ${f}`)}}a(yZe,"runBackup");async function Axr(e,t){let r=e.data,n=r.appId,i=r.import.backupId,o=r.import.nameForBackup,s=r.import.createdBy,u=vt.getTenantIDFromWorkspaceID(n);return vt.doInTenant(u,async()=>{let c=re.getDevWorkspaceID(n),l=`${c}_temp_${Date.now()}`,{rev:f}=await Ju.updateRestoreStatus(r.docId,r.docRev,"started");await yZe("restoring",u,n,{processing:t,createdBy:s,name:o});let p=await Ju.downloadAppBackup(i),d="complete";try{await t.importAppFn(l,re.getDB(l),{file:{type:"application/gzip",path:p},key:p}),await Txr(c),await new re.Replication({source:l,target:c}).replicate()}catch(h){kt.logAlert("App restore error",h),d="failed";let m=h instanceof Error?h.message:String(h);await Ju.trackBackupError(n,i,`Backup restore failed: ${m}`)}finally{try{await re.getDB(l,{skip_setup:!0}).destroy()}catch{}}await Ju.updateRestoreStatus(r.docId,f,d),z_.default.existsSync(p)&&z_.default.rmSync(p,{force:!0})})}a(Axr,"importProcessor");async function Rxr(e,t){let r=e.data,n=r.appId,i=r.export.trigger,o=r.export.name,s=vt.getTenantIDFromWorkspaceID(n);await vt.doInTenant(s,async()=>{try{let{rev:u}=await Ju.updateBackupStatus(r.docId,"started");return yZe(i,s,n,{processing:t,doc:{id:r.docId,rev:u},name:o})}catch(u){kt.logAlert("App backup error",u);let c=u instanceof Error?u.message:String(u);await Ju.trackBackupError(n,r.docId,`Backup export failed: ${c}`)}})}a(Rxr,"exportProcessor");var Oxr=a(async e=>{fZe(),await cne(e.processing)},"init"),eu={...Ju,processing:lne,init:Oxr,getBackupQueue:Tb};var Ixr=a(async e=>{e.backups&&await eu.init(e.backups)},"init");var tu={};oe(tu,{create:()=>Dxr,find:()=>Cxr,get:()=>kxr,remove:()=>Nxr,update:()=>Pxr});var bZe=te(require("lodash/fp/merge"));async function kxr(e){let t=vt.getGlobalDB(),r=new re.QueryBuilder(t.name,"user");r.setIndexBuilder(re.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[i,o]of Object.entries(e.filters?.equal??{}))r.addEqual(i,o);r.setSort("_id"),r.setSkip(e.skip);let n=await r.run();return{users:n.rows,total:n.totalRows}}a(kxr,"get");async function Cxr(e){return await zt.getById(e)}a(Cxr,"find");async function Dxr(e){let t=await Yu.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new Ie("User is already synched",409);e={...t,scimInfo:(0,bZe.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Yu.save(e,{requirePassword:!1})}a(Dxr,"create");async function Pxr(e,t){return await Yu.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}a(Pxr,"update");async function Nxr(e){return await Yu.destroy(e)}a(Nxr,"remove");var fI={};oe(fI,{create:()=>Lxr});var vZe=te(require("lodash/fp/merge"));async function Lxr(e){let t=await ire(e.name),r;if(!t)r=(await on.save(e)).id;else{if(t.scimInfo?.isSync)throw new Ie("Group is already synched",409);r=t._id,t.users&&(await on.removeUsers(r,t.users.map(i=>i._id)),delete t.users),t.scimInfo=(0,vZe.default)(t.scimInfo,e.scimInfo),await on.save(t)}return await on.get(r)}a(Lxr,"create");var W_={};oe(W_,{logRequest:()=>Fxr,logResponse:()=>Uxr});async function Fxr(e){kt.logWarn("SCIM request log",e)}a(Fxr,"logRequest");async function Uxr(e){kt.logWarn("SCIM response error",e)}a(Uxr,"logResponse");var Ci={};oe(Ci,{requireFeature:()=>jxr,requireFeatures:()=>Mxr});var jxr=a(e=>async(t,r)=>{await RM(e),await r()},"requireFeature"),Mxr=a((...e)=>async(t,r)=>{await Rre(e),await r()},"requireFeatures");var wZe=a(async(e,t)=>(K.DISABLE_SCIM_CALLS||await W_.logRequest({...e.request.toJSON(),body:e.request.body}),await z.doInScimContext(async()=>{let r=await t();return await W_.logResponse({...e.response.toJSON(),body:e.response.body}),r})),"doInScimContext");var EZe=a(async(e,t)=>{await Cre(),await t()},"requireSCIM");var LM=a(e=>fne(zt.getById,e,!0),"scimUserOnly"),FM=a(e=>fne(Zn.get,e,!0),"scimGroupOnly"),UM=a(e=>fne(Zn.get,e,!1),"internalGroupOnly");function fne(e,t,r){return async(n,i)=>{let o=n.params[t];return typeof o!="string"&&n.throw(404),!!(await e(o)).scimInfo?.isSync!==r&&n.throw(404),i()}}a(fne,"scimSyncChecks");var Bxr=require("dd-trace");async function _Ze(e){let t=e.request.body;if(t.name=t.name.trim(),delete t.roles,t._id){let n=await gm(t._id);t.roles=n.roles,t.scimInfo=n.scimInfo}let r=await q_(t);e.body={_id:r.id,_rev:r.rev}}a(_Ze,"save");async function SZe(e){let t=e.params.groupId,r=e.request.body.add,n=e.request.body.remove;(r&&!Array.isArray(r)||n&&!Array.isArray(n))&&e.throw(400,"Must supply a list of users to add or to remove");let i,o;r&&(i=await DM(t,r)),n&&(o=await $re(t,n)),e.body={added:i,removed:o}}a(SZe,"updateGroupUsers");async function xZe(e){let t=e.params.groupId,r=e.request.body.add,n=e.request.body.remove;(r&&!Array.isArray(r)||n&&!Array.isArray(n))&&e.throw(400,"Must supply a list of objects, with appId and roleId to add or remove"),e.body=await zre(t,{appsToAdd:r,appsToRemove:n})}a(xZe,"updateGroupApps");async function TZe(e){e.body={data:await lI()}}a(TZe,"fetch");async function AZe(e){let{groupId:t,rev:r}=e.params;try{await qre(t,r),e.body={message:"Group deleted successfully"}}catch(n){e.throw(n.status,n)}}a(AZe,"destroy");async function RZe(e){try{e.body=await gm(e.params.groupId)}catch(t){e.throw(t.status,t)}}a(RZe,"find");async function OZe(e){let{pageSize:t=10,bookmark:r,emailSearch:n}=e.request.query,i=e.params.groupId,o={limit:t+1},s=await dM(i,{...o,emailSearch:n,bookmark:r}),u=n?s[t]?.email:s[t]?._id,c=!!u;e.body={users:s.slice(0,t),bookmark:u,hasNextPage:c}}a(OZe,"searchUsers");async function IZe(e){let{groupId:t,appId:r}=e.params;await Wre(t,r),e.body={message:"Group app builder access updated."}}a(IZe,"addAppBuilder");async function kZe(e){let{groupId:t,appId:r}=e.params;await Gre(t,r),e.body={message:"group app builder access removed."}}a(kZe,"removeAppBuilder");async function CZe(e){let{groupId:t}=e.params,{csvContent:r}=e.request.body;(r===void 0||r.trim().length===0)&&e.throw(400,"CSV is empty");let n=await HR.jsonFromCsvString(r,{allowSingleColumn:!0});(!n||n.length===0)&&e.throw(400,"CSV file is invalid");let o=Object.keys(n[0]).find(p=>/^(email|e-mail|email address|mail|e_mail)$/i.test(p.trim()));o||e.throw(400,"CSV file must contain an email column");let s=Array.from(new Set(n.map(p=>p[o]).filter(p=>p&&typeof p=="string"&&p.trim().length>0).map(p=>p.trim())));s.length===0&&e.throw(400,"No valid email addresses found in CSV");try{await gm(t)}catch(p){if(p.status===404)e.throw(404,"Group not found");else throw p}let u=[],c=[],l=[],f=await Promise.all(s.map(p=>Yu.getUserByEmail(p)));for(let p of s){let d=f.find(h=>h?.email===p);d?(u.push({_id:d._id,email:d.email}),l.push(d._id)):c.push({email:p,reason:"User not found"})}l.length>0&&await DM(t,l),e.body={added:u,skipped:c}}a(CZe,"bulkAddUsersFromCsv");var DZe=te(require("@koa/router")),Wo=te(require("joi"));var zxr=new DZe.default;function Wxr(){return $t.joiValidator.body(Wo.default.object({_id:Wo.default.string().optional(),_rev:Wo.default.string().optional(),color:Wo.default.string().required(),icon:Wo.default.string().required(),name:Wo.default.string().trim().required().max(50),role:Wo.default.string().optional(),users:Wo.default.array().optional(),apps:Wo.default.array().optional(),roles:Wo.default.object().optional(),createdAt:Wo.default.string().optional(),updatedAt:Wo.default.string().optional()}).required())}a(Wxr,"buildGroupSaveValidation");zxr.post("/api/global/groups",$t.adminOnly,Ci.requireFeature("userGroups"),Wxr(),_Ze).get("/api/global/groups",Ci.requireFeature("userGroups"),TZe).delete("/api/global/groups/:groupId/:rev",Ci.requireFeature("userGroups"),$t.adminOnly,UM("groupId"),AZe).get("/api/global/groups/:groupId",Ci.requireFeature("userGroups"),$t.builderOrAdmin,RZe).get("/api/global/groups/:groupId/users",Ci.requireFeature("userGroups"),$t.builderOrAdmin,OZe).post("/api/global/groups/:groupId/users",$t.adminOnly,Ci.requireFeature("userGroups"),UM("groupId"),SZe).post("/api/global/groups/:groupId/users/bulk",$t.adminOnly,Ci.requireFeature("userGroups"),UM("groupId"),$t.joiValidator.body(Wo.default.object({csvContent:Wo.default.string().required()}).required()),CZe).post("/api/global/groups/:groupId/apps",$t.builderOrAdmin,Ci.requireFeature("userGroups"),xZe).post("/api/global/groups/:groupId/app/:appId/builder",$t.builderOrAdmin,Ci.requireFeatures("userGroups","appBuilders"),IZe).delete("/api/global/groups/:groupId/app/:appId/builder",$t.builderOrAdmin,Ci.requireFeatures("userGroups","appBuilders"),kZe);async function PZe(e){e.body={encryptionKeyAvailable:sl.isEncryptionKeyAvailable()}}a(PZe,"status");async function NZe(e){e.body={variables:await sl.fetch()}}a(NZe,"fetch");async function LZe(e){let{name:t,production:r,development:n}=e.request.body;await sl.update(t,{production:r,development:n});let i=["production"];r!==n&&i.push("development"),await Tt.environmentVariable.created(t,i),e.body={message:`Environment variable "${t}" created.`}}a(LZe,"create");async function FZe(e){let{production:t,development:r}=e.request.body,n=e.params.varName;await sl.update(n,{production:t,development:r}),e.body={message:`Environment variable "${n}" updated.`}}a(FZe,"update");async function UZe(e){let t=e.params.varName;await sl.remove(t),await Tt.environmentVariable.deleted(t),e.body={message:`Environment variable "${t}" deleted.`}}a(UZe,"destroy");var MZe=te(require("@koa/router")),pI=te(require("joi"));var Hxr=new MZe.default;function jZe(){return $t.joiValidator.body(pI.default.object({name:pI.default.string().optional(),production:pI.default.string().required(),development:pI.default.string().required()}))}a(jZe,"buildEnvVarUpdateValidator");Hxr.get("/api/env/variables/status",$t.builderOrAdmin,PZe).get("/api/env/variables",$t.builderOrAdmin,NZe).post("/api/env/variables",$t.builderOrAdmin,jZe(),LZe).patch("/api/env/variables/:varName",$t.builderOrAdmin,jZe(),FZe).delete("/api/env/variables/:varName",$t.builderOrAdmin,UZe);async function BZe(e){let t=e.request.body,r=await xb.fetch(t);await Tt.auditLog.filtered(t),e.body=r}a(BZe,"search");async function qZe(e){let t=e.request.body,{stream:r}=xb.download(t);await Tt.auditLog.downloaded(t),e.attachment(`audit-logs-${Date.now()}.log`),e.body=r}a(qZe,"download");async function $Ze(e){e.body={events:xb.definitions()}}a($Ze,"definitions");var WZe=te(require("@koa/router")),Xu=te(require("joi"));function zZe(){return $t.joiValidator.body(Xu.default.object({userIds:Xu.default.array().items(Xu.default.string()).optional(),appIds:Xu.default.array().items(Xu.default.string()).optional(),events:Xu.default.array().items(Xu.default.string().valid(...Object.values(Er))).optional(),startDate:Xu.default.string().optional().allow(""),endDate:Xu.default.string().optional().allow(""),fullSearch:Xu.default.string().optional().allow(""),bookmark:Xu.default.number()}))}a(zZe,"buildAuditLogSearchValidator");var Kxr=new WZe.default;Kxr.post("/api/global/auditlogs/search",$t.adminOnly,zZe(),BZe).get("/api/global/auditlogs/download",$t.adminOnly,AU.querystringToBody,zZe(),qZe).get("/api/global/auditlogs/definitions",$t.adminOnly,$Ze);var XZe=te(require("@koa/router")),Ob=te(require("joi"));async function Rb(e,t){t||e.throw(400,"App ID missing"),await oI.workspaceExists(t)||e.throw(400,`Provided app ID: ${t} - is invalid.`)}a(Rb,"checkAppID");async function GZe(e){let t=e.params.appId;await Rb(e,t);let{body:r}=e.request,n=e.user?._id,i=await eu.triggerAppBackup(t,"manual",{name:r.name,createdBy:n});i||e.throw(500,"Unable to start backup."),e.body={backupId:i,message:"Backup triggered - process starting."}}a(GZe,"manualBackup");async function HZe(e){let t=e.params.appId;await Rb(e,t);let r=e.params.backupId,n=e.request.body.name,i=await eu.triggerAppRestore(t,r,n,e.user?._id);i||e.throw(500,"Unable to start restore."),await Tt.backup.appBackupRestored(i.metadata),e.body={restoreId:i?.restoreId,message:"Restore triggered - process starting."}}a(HZe,"importBackup");async function VZe(e){let t=e.params.appId;await Rb(e,t);let r=e.params.backupId;await eu.deleteAppBackup(r),e.body={message:"Backup deleted successfully."}}a(VZe,"deleteBackup");async function KZe(e){let t=z.getWorkspaceId();await Rb(e,t);let{backupIds:r}=e.request.body;(!Array.isArray(r)||r.length===0)&&e.throw(400,"backupIds must be a non-empty array");let n=await eu.deleteAppBackups(r),i=n.filter(s=>s.success).length,o=n.length-i;e.body={message:`${i} backups deleted successfully${o>0?`, ${o} failed`:""}.`,results:n,successCount:i,failureCount:o}}a(KZe,"deleteBackups");async function QZe(e){let t=e.params.appId;await Rb(e,t);let r=e.request.body;r?.trigger&&(r.trigger=r.trigger.toLowerCase(),Object.values(Cm).includes(r.trigger)||e.throw(400,"Provided trigger is not a valid option.")),e.body=await eu.fetchAppBackups(t,{paginate:!0,...r})}a(QZe,"fetchBackups");async function YZe(e){let t=e.params.appId;await Rb(e,t);let r=e.params.backupId,n=e.request.body;e.body=await eu.updateAppBackup(r,n.name)}a(YZe,"updateBackup");async function JZe(e){let t=e.params.appId;await Rb(e,t);let r=e.params.backupId,{metadata:n,stream:i}=await eu.getBackupDownloadStream(r);e.attachment(`backup-${n.timestamp}.tar.gz`),e.body=i}a(JZe,"downloadBackup");var Yxr=new XZe.default;function Jxr(){return $t.joiValidator.body(Ob.default.object({trigger:Ob.default.string().valid(...Object.values(Cm)),type:Ob.default.string().valid(...Object.values(vS)),startDate:Ob.default.date(),endDate:Ob.default.date(),page:Ob.default.string()}))}a(Jxr,"validateBackupSearch");Yxr.post("/api/apps/:appId/backups",$t.builderOrAdmin,GZe).post("/api/apps/:appId/backups/search",$t.builderOrAdmin,Jxr(),QZe).get("/api/apps/:appId/backups/:backupId/file",$t.builderOrAdmin,JZe).patch("/api/apps/:appId/backups/:backupId",$t.builderOrAdmin,YZe).delete("/api/apps/:appId/backups/:backupId",$t.builderOrAdmin,VZe).delete("/api/apps/:appId/backups",$t.builderOrAdmin,KZe).post("/api/apps/:appId/backups/:backupId/import",$t.builderOrAdmin,HZe);var Ret=te(require("@koa/router"));var WM=te(Dne());function het(e,t){let r=e.request.query[t];if(r!==void 0)return+r}a(het,"tryGetQueryAsNumber");var met=a(async e=>{let t=het(e,"pageSize")??20,r=het(e,"startIndex"),n;e.request.query.filter&&(n=la.user.userFilters(e.request.query.filter));let i=await tu.get({pageSize:t,skip:r,filters:n});e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:i.total,Resources:i.users.map(la.user.toScimUserResponse),startIndex:(r||0)+1,itemsPerPage:t}},"get"),get=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404);let r=await tu.find(t);e.body=la.user.toScimUserResponse(r)},"find"),yet=a(async e=>{let t=la.user.fromScimUser(e.request.body);try{let r=await tu.create(t);e.body=la.user.toScimUserResponse(r)}catch(r){throw r instanceof gp&&e.throw(409,"Email already in use"),r}},"create");function wTr(e){let t=e.Operations.find(r=>(r.op==="Replace"||r.op==="replace")&&r.path==="active");return t?t.value===!1||t.value?.toLowerCase?.()==="false":!1}a(wTr,"isDeactivation");var bet=a(async e=>{let t=await tu.find(e.params.id);t||e.throw(404);let r=la.user.toScimUserResponse(t),n=e.request.body;try{(0,WM.patchBodyValidation)(n)}catch{}if(wTr(n))return Pne(e);let i;try{i=(0,WM.scimPatch)(r,n.Operations)}catch{}i||e.throw(500);let o=la.user.fromScimUser(i);await tu.update(o,{allowChangingEmail:!0}),e.body=la.user.toScimUserResponse(o)},"update"),Pne=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404),await tu.remove(t),e.status=204},"remove");var vet=te(require("lodash/groupBy"));var GM=te(Dne());var HM=te(zM());function wet(e,t){for(let r of t.split(","))delete e[r]}a(wet,"cleanResponse");var Eet=a(async e=>{let r=(await on.fetch()).filter(o=>o.scimInfo?.isSync).map(la.group.toScimGroupResponse),{filter:n,excludedAttributes:i}=e.request.query;if(n){let o=(0,HM.filter)((0,HM.parse)(n));r=r.filter(o)}i&&r.forEach(o=>{wet(o,i)}),e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:r.length,Resources:r,startIndex:1,itemsPerPage:r.length}},"get"),_et=a(async e=>{let t=la.group.fromScimGroup(e.request.body),r=await fI.create(t);e.body=la.group.toScimGroupResponse(r)},"create"),xet=a(async e=>{let{id:t}=e.params,r=await on.get(t),n=la.group.toScimGroupResponse(r),{excludedAttributes:i}=e.request.query;i&&wet(n,i),e.body=n},"find"),Tet=a(async e=>{let{id:t}=e.params,r=await on.get(t);await on.remove(t,r._rev),e.status=204},"remove"),Aet=a(async e=>{let{id:t}=e.params,r=await on.get(t),n=la.group.toScimGroupResponse(r),i=e.request.body;try{(0,GM.patchBodyValidation)(i)}catch{e.throw(400)}let{true:o,false:s}=(0,vet.default)(i.Operations,u=>u.path==="members");if(s?.length){let u=(0,GM.scimPatch)(n,s);u||e.throw(500);let c={...la.group.fromScimGroup(u),_rev:r._rev};await on.save(c)}if(o?.length){let u=[],c=[];for(let{op:l,value:f}of o)switch(l){case"add":case"Add":for(let p of f)u.push(await tu.find(p.value));break;case"remove":case"Remove":for(let p of f)c.push(await tu.find(p.value));break;case"replace":case"Replace":throw new Error("Replacing members is not allowed");default:tr.unreachable(l)}u.length&&await on.addUsers(t,u.map(l=>l._id)),c.length&&await on.removeUsers(t,c.map(l=>l._id))}e.body=la.group.toScimGroupResponse(await on.get(t))},"update");var Zu=new Ret.default({prefix:"/api/global/scim/v2"});Zu.use(EZe);Zu.use(wZe);Zu.get("/users",met);Zu.get("/users/:id",LM("id"),get);Zu.post("/users",yet);Zu.patch("/users/:id",LM("id"),bet);Zu.delete("/users/:id",LM("id"),Pne);Zu.get("/groups",Eet);Zu.post("/groups",Ci.requireFeature("userGroups"),_et);Zu.get("/groups/:id",Ci.requireFeature("userGroups"),FM("id"),xet);Zu.delete("/groups/:id",Ci.requireFeature("userGroups"),FM("id"),Tet);Zu.patch("/groups/:id",Ci.requireFeature("userGroups"),FM("id"),Aet);var ket=te(require("@koa/router"));async function Oet(e){let{userId:t,appId:r}=e.params,n=await ym.db.getUser(t);if(zt.isGlobalBuilder(n)){e.body={message:"User already admin - no permissions updated."};return}await ym.addAppBuilder(n,r),e.body={message:`User "${n.email}" app builder access updated.`}}a(Oet,"addAppBuilder");async function Iet(e){let{userId:t,appId:r}=e.params,n=await ym.db.getUser(t);if(zt.isGlobalBuilder(n)){e.body={message:"User already admin - no permissions removed."};return}await ym.removeAppBuilder(n,r),e.body={message:`User "${n.email}" app builder access removed.`}}a(Iet,"removeAppBuilder");var xTr=new ket.default;xTr.post("/api/global/users/:userId/app/:appId/builder",$t.builderOrAdmin,Ci.requireFeatures("appBuilders"),Oet).delete("/api/global/users/:userId/app/:appId/builder",$t.builderOrAdmin,Ci.requireFeatures("appBuilders"),Iet);var la={};oe(la,{group:()=>Lne,user:()=>Nne});var Nne={};oe(Nne,{fromScimUser:()=>kTr,toScimUserResponse:()=>RTr,userFilters:()=>CTr});var Cet=te(zM());var{unreachable:ATr}=tr,RTr=a(e=>{let{isSync:t,roles:r,...n}=e.scimInfo||{},i={...n,schemas:["urn:ietf:params:scim:schemas:core:2.0:User"],id:e._id,meta:{resourceType:"User",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},active:e.status==="active"};return(e.firstName||e.lastName)&&(i.name={formatted:[e.firstName,e.lastName].filter(o=>o).join(" "),familyName:e.lastName,givenName:e.firstName}),i},"toScimUserResponse"),OTr=a(e=>!!e?.id,"isScimUserResponse");function ITr(e){if(Cr.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}a(ITr,"tryGetEmail");var kTr=a(e=>{let t=OTr(e)?e:void 0,r=ITr(e);if(!r)throw new Error("Email is required");let n;switch(e.active){case"True":case"true":case!0:n=!0;break;case"False":case"false":case!1:n=!1;break;default:ATr(e.active)}let i,o;return e.name?.givenName?(i=e.name?.givenName,o=e.name?.familyName):i=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:i,lastName:o,scimInfo:{...e,isSync:!0},roles:{},status:n?"active":"inactive",createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimUser"),CTr=a(e=>{let t={equal:{}},r=(0,Cet.parse)(e);function n(i){switch(i.op){case"eq":{let o=i.attrPath,s;switch(o){case"emails.value":s="email";break;default:s=`scimInfo.${o}`}t.equal[s]=i.compValue;break}case"and":for(let o of i.filters)n(o);break;default:console.warn("Filter not handled",{filter:i})}}return a(n,"parseFilters"),n(r),t},"userFilters");var Lne={};oe(Lne,{fromScimGroup:()=>NTr,toScimGroupResponse:()=>DTr});var DTr=a(e=>({schemas:["urn:ietf:params:scim:schemas:core:2.0:Group"],id:e._id,externalId:e.scimInfo.externalId,meta:{resourceType:"Group",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},displayName:e.name,members:e.users?.map(t=>({value:t._id}))}),"toScimGroupResponse"),PTr=a(e=>!!e?.id,"isScimGroup"),NTr=a(e=>{let t=PTr(e)?e:void 0;return{_id:t?.id,name:e.displayName,scimInfo:{externalId:e.externalId,isSync:!0},icon:"UserGroup",color:"var(--spectrum-global-color-blue-600)",createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimGroup");var ci={};oe(ci,{LLM:()=>wf,LLMRequest:()=>Di,TableGeneration:()=>iie,agentHistoryTitleSystemPrompt:()=>GTr,agentSystemPrompt:()=>WTr,aiColumnSchemas:()=>rie,aiTableResponseToTableSchema:()=>Xne,appendAIColumns:()=>Zne,classifyText:()=>jne,cleanData:()=>Mne,extractFileData:()=>BTr,generateAIColumns:()=>Yne,generateCode:()=>zTr,generateCronExpression:()=>Bne,generateData:()=>Jne,generateJs:()=>Wne,generateSQL:()=>$Tr,generateTables:()=>Qne,generationStructure:()=>tie,getLLM:()=>wI,getLLMConfig:()=>Kne,getLLMOrThrow:()=>jet,normalizeContentType:()=>Fne,parseResponseFormat:()=>KM,sanitiseToolName:()=>LTr,searchWeb:()=>zne,sentimentAnalysis:()=>$ne,summarizeText:()=>VM,tableDataStructuredOutput:()=>nie,translate:()=>qne});function LTr(e){if(e.length>64)throw new Error("Tool name must be under 64 characters long");return e.replace(/[^a-zA-Z0-9_-]/g,"_")}a(LTr,"sanitiseToolName");function Fne(e){return e?e.includes("/")?e:{pdf:"application/pdf",jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png"}[e.toLowerCase()]||"application/octet-stream":"application/octet-stream"}a(Fne,"normalizeContentType");var QM=te(require("openai"));var vm=te(require("dd-trace"));function Une(e,t){return t.map(r=>e[r]).join(" ")}a(Une,"extractTextFromColumns");var wf=class{static{a(this,"LLM")}constructor({model:t,apiKey:r,maxTokens:n}){this._model=t,this._apiKey=r,this._maxTokens=n??parseInt(process.env.BUDIBASE_AI_MAX_PROMPT_TOKENS||"1000")}get model(){return this._model}get apiKey(){return this._apiKey}get maxTokens(){return this._maxTokens}async prompt(t){return await vm.default.trace("prompt",async()=>{let r=typeof t=="string"?new Di().addUserMessage(t):t,{messages:n,tokensUsed:i}=await vm.default.trace("chatCompletion",()=>this.chatCompletion(r));return!n||n.length===0?{message:"",tokensUsed:i}:{message:n[n.length-1].content||"",tokensUsed:i}})}async chat(t){return await vm.default.trace("chat",async()=>await this.chatCompletion(t))}async*chatStream(t){yield*this.chatCompletionStream(t)}async summarizeText(t){return vm.default.trace("summarizeText",()=>this.prompt(VM(t)))}async generateCronExpression(t){return vm.default.trace("generateCronExpression",()=>this.prompt(Bne(t)))}async operation(t,r){return vm.default.trace("operation",n=>{n.addTags({operation:t.operation,rowId:r.id});let i=this.promptForOperation(t,r);return this.prompt(i)})}promptForOperation(t,r){let{operation:n,column:i,columns:o,language:s,categories:u,prompt:c}=t;switch(n){case"SUMMARISE_TEXT":return VM(Une(r,o));case"CLEAN_DATA":return Mne(r[i]);case"TRANSLATE":return qne(r[i],s);case"CATEGORISE_TEXT":if(!u)throw Error("No categories provided for categorise text operation. Please provide categories.");return jne(Une(r,o),u.split(","));case"SENTIMENT_ANALYSIS":return $ne(r[i]);case"PROMPT":return c;case"SEARCH_WEB":return zne(Une(r,o));default:throw tr.unreachable(n)}}async generateJs(t,r){return await vm.default.trace("generateJs",async()=>{let{bindings:n=[],snippets:i=[]}=r||{};return await this.prompt(Wne(n,i).addUserMessage(t))})}};var Gne=require("openai/helpers/zod");var Pet=(n=>(n.GPT_5_MINI="gpt-5-mini",n.GPT_5="gpt-5",n.GPT_5_NANO="gpt-5-nano",n))(Pet||{});function KM(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}a(KM,"parseResponseFormat");function Det(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}a(Det,"calculateBudibaseAICredits");var ec=class extends wf{constructor(r){super(r);this.client=this.getClient(r)}static{a(this,"OpenAI")}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new QM.default({apiKey:r.apiKey})}async uploadFile(r,n,i){let o=Fne(i);if(ok.includes(o.toLowerCase())){let c;if(Buffer.isBuffer(r))c=r;else{let f=[];for await(let p of r)f.push(new Uint8Array(p));c=Buffer.concat(f)}let l=c.toString("base64");return`data:${o};base64,${l}`}let s=await(0,QM.toFile)(r,n);return(await this.client.files.create({file:s,purpose:"assistants"})).id}async chatCompletion(r){let n={model:this.model,messages:r.messages,max_completion_tokens:this._maxTokens,response_format:KM(r.format)};Object.values(Pet).includes(this.model)&&(n.verbosity="low",n.reasoning_effort="minimal"),r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(Gne.zodFunction));let i=await this.client.chat.completions.create(n),o=i?.choices?.[0]?.message;if(o?.tool_calls){r.addMessage(o);let s=[];for(let u of o.tool_calls){if(u.type!=="function"||!u.function){console.warn(`[OPENAI TOOL WARN] Unsupported tool call type: ${u.type}`);continue}let c=u.function.name,l=r.findTool(c);if(!l)throw new Error(`Tool ${c} not found in prompt tools`);let f=JSON.parse(u.function.arguments);s.push(l.handler(f).then(p=>({role:"tool",tool_call_id:u.id,content:p})).catch(p=>(console.error(`[OPENAI TOOL ERROR] Tool ${c} failed in OpenAI handler:`,p),{role:"tool",tool_call_id:u.id,content:`Error: ${p.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:Det(i.usage)};throw new Error("No response found")}}async*chatCompletionStream(r){let n={model:this.model,messages:r.messages,max_tokens:this.maxTokens,response_format:KM(r.format),stream:!0};r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(Gne.zodFunction));try{let i=await this.client.chat.completions.create(n),o=null,s="",u=null;for await(let l of i){let f=l?.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 p=f.tool_calls[0];p.id?(o={id:p.id,name:p.function?.name||"",arguments:p.function?.arguments||""},yield{type:"tool_call_start",toolCall:{id:o.id,name:o.name,arguments:o.arguments}}):o&&p.function?.arguments&&(o.arguments+=p.function.arguments,yield{type:"tool_call_start",toolCall:{id:o.id,name:o.name,arguments:o.arguments}})}l.usage&&(u=l.usage)}}let c=u?Det(u):0;if(o){r.addMessage({role:"assistant",content:"",tool_calls:[{id:o.id,type:"function",function:{name:o.name,arguments:o.arguments}}]});let l=r.findTool(o.name);if(l)try{let f=JSON.parse(o.arguments),p=await l.handler(f);yield{type:"tool_call_result",toolResult:{id:o.id,result:p}},r.addMessage({role:"tool",tool_call_id:o.id,content:p}),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:c}}catch(i){yield{type:"error",content:i.message}}}};var Hne=require("dd-trace");var YM=class extends wf{static{a(this,"BudibaseAI")}async prompt(t){let r=await super.prompt(t);return r.tokensUsed&&await kM(r.tokensUsed),r}async chat(t){let r=await super.chat(t);return r.tokensUsed&&await kM(r.tokensUsed),r}async uploadFile(t,r,n){return K.SELF_HOSTED?this.uploadFileSelfHost(t,r,n):this.uploadFileCloud(t,r,n)}async uploadFileCloud(t,r,n){return new ec({apiKey:K.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).uploadFile(t,r,n)}async uploadFileSelfHost(t,r,n){let i;if(Buffer.isBuffer(t))i=t;else{let f=[];for await(let p of t)f.push(new Uint8Array(p));i=Buffer.concat(f)}let o=i.toString("base64");if(n&&ok.includes(n.toLowerCase()))return`data:image/jpeg;base64,${o}`;if(!K.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let f=await TM();if(!f)throw new Error("No license key found");this._apiKey=f}let s=`${K.BUDICLOUD_URL}/api/ai/upload-file`,u={method:"POST",headers:{"Content-Type":"application/json",[gr.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:o,filename:r,contentType:n})};console.debug("[BudibaseAI] uploadFileSelfHost - Making network call",{url:s,method:u.method,headers:u.headers,bodyKeys:["data","filename","contentType"],filename:r,contentType:n});let c=await fetch(s,u);if(console.debug("[BudibaseAI] uploadFileSelfHost - Network response",{url:s,status:c.status,statusText:c.statusText,ok:c.ok}),!c.ok)throw await Ie.fromResponse(c);return(await c.json()).fileId}async chatCompletion(t){return K.SELF_HOSTED?this.chatCompletionSelfHost(t):this.chatCompletionCloud(t)}async chatCompletionCloud(t){return await Hne.tracer.trace("chatCompletionCloud",async()=>await new ec({apiKey:K.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletion(t))}async chatCompletionSelfHost(t){return await Hne.tracer.trace("chatCompletionSelfHost",async r=>{if(!K.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(r.addTags({budicloudUrl:K.BUDICLOUD_URL}),!this._apiKey){let c=await TM();if(!c)throw new Error("No license key found");this._apiKey=c,r.addTags({licenseKey:this._apiKey})}let n={messages:t.messages,format:t.format,useTools:t.tools.length>0},i=`${K.BUDICLOUD_URL}/api/ai/chat`,o={method:"POST",headers:{"Content-Type":"application/json",[gr.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(n)};console.debug("[BudibaseAI] chatCompletionSelfHost - Making network call",{url:i,method:o.method,headers:o.headers,bodyKeys:Object.keys(n),messagesCount:t.messages.length,useTools:n.useTools,format:n.format});let s=await fetch(i,o);if(console.debug("[BudibaseAI] chatCompletionSelfHost - Network response",{url:i,status:s.status,statusText:s.statusText,ok:s.ok}),!s.ok)throw await Ie.fromResponse(s);let u=await s.json();return console.debug("[BudibaseAI] chatCompletionSelfHost - Response data",{url:i,tokensUsed:u.tokensUsed,messagesCount:u.messages?.length}),u})}async*chatCompletionStream(t){K.SELF_HOSTED?yield*this.chatCompletionStreamSelfHost(t):yield*this.chatCompletionStreamCloud(t)}async*chatCompletionStreamCloud(t){yield*new ec({apiKey:K.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletionStream(t)}async*chatCompletionStreamSelfHost(t){console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Starting streaming (fallback to non-streaming)",{messagesCount:t.messages.length,toolsCount:t.tools.length});try{let r=await this.chatCompletionSelfHost(t);if(console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Yielding response chunks",{responseMessagesCount:r.messages.length,tokensUsed:r.tokensUsed}),r.messages.length>0){let n=r.messages[r.messages.length-1];n.content&&(yield{type:"content",content:n.content})}yield{type:"done",messages:r.messages,tokensUsed:r.tokensUsed}}catch(r){console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Error occurred",{error:r.message}),yield{type:"error",content:r.message}}}};var vI=require("dd-trace");var Vne=te(require("@anthropic-ai/sdk"));function FTr(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}a(FTr,"calculateBudibaseAICredits");var JM=class extends wf{constructor(r){super(r);this.client=new Vne.default({apiKey:r.apiKey})}static{a(this,"Anthropic")}firstTextBlock(r){for(let n of r.content)if(n.type==="text")return n.text}async uploadFile(r,n,i){throw new Error("File upload not supported for this LLM provider")}async chatCompletion(r){try{let n=await this.client.messages.create({model:this.model,messages:r.messages.map(({content:o})=>{if(o==null)return{role:"user",content:""};if(typeof o=="string")return{role:"user",content:o};let s="";for(let u of o)u.type==="text"?s+=u.text:["image_url","input_audio","file"].includes(u.type);return{role:"user",content:s}}),max_tokens:this.maxTokens}),i=this.firstTextBlock(n)||"";return{messages:[...r.messages,{role:"assistant",content:i}],tokensUsed:FTr(n.usage)}}catch(n){throw n instanceof Vne.default.APIError&&console.error(`Anthropic Prompt failed with error ${n.name} and status: ${n.status}`),n}}async*chatCompletionStream(r){try{let n=await this.chatCompletion(r);if(n.messages.length>0){let i=n.messages[n.messages.length-1];i.content&&(yield{type:"content",content:i.content})}yield{type:"done",messages:n.messages,tokensUsed:n.tokensUsed}}catch(n){yield{type:"error",content:n.message}}}};var Let=require("zod"),Fet=require("openai/helpers/zod");var Net=require("openai");var XM=class extends ec{static{a(this,"AzureOpenAI")}getClient(t){if(!t.apiKey)throw new Error("No Azure OpenAI API key found");if(!t.model)throw new Error("No Azure OpenAI model specified");return new Net.AzureOpenAI({apiKey:t.apiKey,apiVersion:"2024-10-01-preview",baseURL:t.baseUrl})}};var Uet="gpt-5-mini",UTr={OpenAI:ec,TogetherAI:ec,AzureOpenAI:XM,Custom:ec,Anthropic:JM,BudibaseAI:YM};async function jTr(){return await vI.tracer.trace("getAIConfig",async e=>{let t={type:"ai",config:{}};if(!z.isSelfHostUsingCloud()){let n=await qa.getAIConfig();n&&(t=n)}await Pre(t);let r=Object.values(t.config).find(n=>n.active&&n.isDefault);if(!r){e.addTags({enabled:!1,reason:"no provider found"});return}return e.addTags({enabled:!0}),{provider:r.provider,model:r.defaultModel||Uet,apiKey:r.apiKey,baseUrl:r.baseUrl}})}a(jTr,"getAIConfig");async function MTr(){return vI.tracer.trace("getSelfHostOpenAIKeyConfig",e=>{if(!K.SELF_HOSTED){e.addTags({enabled:!1,reason:"not self host"});return}if(!K.OPENAI_API_KEY){e.addTags({enabled:!1,reason:"no OPENAI_API_KEY"});return}return e.addTags({enabled:!0}),{provider:"OpenAI",model:Uet,apiKey:K.OPENAI_API_KEY}})}a(MTr,"getSelfHostOpenAIKeyConfig");async function Kne(){return vI.tracer.trace("getLLMConfig",async()=>await jTr()||await MTr())}a(Kne,"getLLMConfig");async function wI(e){return await vI.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:n}=e||{},i=await Kne();if(!i){t.addTags({enabled:!1,reason:"no config found"});return}r&&(i.model=r),n&&(i.maxTokens=n);let o=UTr[i.provider];if(!o){t.addTags({enabled:!1,reason:"no provider found",provider:i.provider});return}return new o(i)})}a(wI,"getLLM");async function jet(){let e=await wI();if(!e)throw new Ie("No available LLM configurations",500);return e}a(jet,"getLLMOrThrow");var Di=class e{constructor(){this.messages=[];this.tools=[]}static{a(this,"LLMRequest")}addTool(t){return this.tools.push(t),this}addTools(t){return this.tools.push(...t),this}findTool(t){return this.tools.find(r=>r.name===t)}withFormat(t){return t instanceof Let.z.ZodType?this.format=(0,Fet.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 rd=require("zod");function VM(e,t){let r=`Summarize this text:
|
|
756
756
|
${e}`,n="";if(t)switch(t){case"short":n="In 1-2 concise sentences, ";break;case"medium":n="In 2-3 paragraphs, ";break;case"long":n="In multiple detailed paragraphs, ";break}return new Di().addUserMessage(`${n}${r}.
|
|
757
757
|
Only return the summary.`)}a(VM,"summarizeText");function BTr(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(`
|
|
758
758
|
|