@budibase/pro 3.39.19 → 3.39.21
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/ai/prompts/index.d.ts +2 -2
- package/dist/index.js +6 -6
- package/package.json +2 -2
|
@@ -9,13 +9,13 @@ export declare function summarizeText(text: string, length?: SummariseLength): L
|
|
|
9
9
|
export declare function classifyText(text: string, categories: string[]): LLMRequest;
|
|
10
10
|
export declare function cleanData(text: string): LLMRequest;
|
|
11
11
|
export declare function generateCronExpression(text: string): LLMRequest;
|
|
12
|
-
interface
|
|
12
|
+
interface GenerateOperationInstructionsOptions {
|
|
13
13
|
prompt: string;
|
|
14
14
|
agentName?: string;
|
|
15
15
|
goal?: string;
|
|
16
16
|
toolReferences: string[];
|
|
17
17
|
}
|
|
18
|
-
export declare function
|
|
18
|
+
export declare function generateOperationInstructionsPrompt({ prompt, agentName, goal, toolReferences, }: GenerateOperationInstructionsOptions): LLMRequest;
|
|
19
19
|
export declare function translate(text: string, language: string): LLMRequest;
|
|
20
20
|
export declare function sentimentAnalysis(text: string): LLMRequest;
|
|
21
21
|
export declare function searchWeb(text: string): LLMRequest;
|
package/dist/index.js
CHANGED
|
@@ -36,7 +36,7 @@ d/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR
|
|
|
36
36
|
mwIDAQAB
|
|
37
37
|
-----END PUBLIC KEY-----
|
|
38
38
|
`;function dn(e){return Ei.default.verify(e,vE,{algorithms:["RS256"]})}n(dn,"verifyLicenseToken");function bE(e,t){return Ei.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}n(bE,"sign");var To={};F(To,{getOfflineFeatures:()=>Ri});var v=require("@budibase/types");var dd=[v.Feature.BUDIBASE_AI,v.Feature.SYNC_AUTOMATIONS],fd=[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PDF,v.Feature.BUDIBASE_AI],md=[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.ENFORCEABLE_SSO,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.SYNC_AUTOMATIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.VIEW_PERMISSIONS,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PWA,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS],wE={[v.PlanType.FREE]:[...Tt.SELF_FREE_LICENSE.features],[v.PlanType.PREMIUM]:[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.VIEW_PERMISSIONS,v.Feature.PDF],[v.PlanType.PREMIUM_PLUS]:fd,[v.PlanType.PREMIUM_MAX]:fd,[v.PlanType.PREMIUM_PLUS_TRIAL]:[v.Feature.WORKSPACE_BACKUPS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PDF,v.Feature.BUDIBASE_AI],[v.PlanType.PRO]:dd,[v.PlanType.PRO_MAX]:dd,[v.PlanType.TEAM]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS],[v.PlanType.BUSINESS]:md,[v.PlanType.BUSINESS_PLUS]:md,[v.PlanType.ENTERPRISE_BASIC]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.AUDIT_LOGS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.OFFLINE,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS,v.Feature.MICROFRONTEND],[v.PlanType.ENTERPRISE_BASIC_TRIAL]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.EMBED_AUTH,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS,v.Feature.MICROFRONTEND],[v.PlanType.ENTERPRISE]:[v.Feature.USER_GROUPS,v.Feature.WORKSPACE_BACKUPS,v.Feature.ENVIRONMENT_VARIABLES,v.Feature.ENFORCEABLE_SSO,v.Feature.EMBED_AUTH,v.Feature.AUDIT_LOGS,v.Feature.BRANDING,v.Feature.SYNC_AUTOMATIONS,v.Feature.OFFLINE,v.Feature.EXPANDED_PUBLIC_API,v.Feature.WORKSPACE_IMPORT_EXPORT,v.Feature.VIEW_PERMISSIONS,v.Feature.TRIGGER_AUTOMATION_RUN,v.Feature.SCIM,v.Feature.VIEW_READONLY_COLUMNS,v.Feature.AI_CUSTOM_CONFIGS,v.Feature.PWA,v.Feature.CUSTOM_APP_SCRIPTS,v.Feature.PDF,v.Feature.BUDIBASE_AI,v.Feature.RECAPTCHA,v.Feature.PKCE_OIDC,v.Feature.TRANSLATIONS,v.Feature.MICROFRONTEND]};function Ri(e){function t(r){let a=r[e];if(!a)throw new Error(`Features do not exist for planType=${e}`);return a}return n(t,"readFeatures"),t(wE)}n(Ri,"getOfflineFeatures");var So={};F(So,{UNLIMITED:()=>g,getQuotas:()=>Oi});var se=require("@budibase/types");var p=Zt,gd=Tt,g=-1,St=n(e=>e*1e6,"millions"),IE={[se.PlanType.FREE]:{...gd.CLOUD_FREE_LICENSE.quotas},[se.PlanType.PREMIUM]:{usage:{monthly:{...p.queries(g),...p.automations(1e3),...p.budibaseAICredits(0),...p.actions(5e3)},static:{...p.rows(1e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(St(10)),...p.actions(2e4)},static:{...p.rows(25e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.PREMIUM_MAX]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(St(10)),...p.actions(5e4)},static:{...p.rows(25e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(75e4),...p.actions(2e4)},static:{...p.rows(25e4),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.PRO]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(St(2)),...p.actions(5e3)},static:{...p.rows(5e4),...p.apps(g),...p.users(g),...p.creators(1),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(1),...p.automationLogRetentionDays(1),...p.appBackupRetentionDays(0)}},[se.PlanType.PRO_MAX]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(St(2)),...p.actions(1e4)},static:{...p.rows(5e4),...p.apps(g),...p.users(g),...p.creators(1),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(1),...p.automationLogRetentionDays(1),...p.appBackupRetentionDays(0)}},[se.PlanType.TEAM]:{usage:{monthly:{...p.queries(g),...p.automations(1e4),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(10),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(90)}},[se.PlanType.BUSINESS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(St(50)),...p.actions(25e4)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(g)}},[se.PlanType.BUSINESS_PLUS]:void 0,[se.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(St(50)),...p.actions(25e4)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}},[se.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(75e4),...p.actions(25e4)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(1),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(15),...p.automationLogRetentionDays(15),...p.appBackupRetentionDays(15)}},[se.PlanType.ENTERPRISE]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(St(50)),...p.actions(25e4)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}}},TE={[se.PlanType.FREE]:{...gd.SELF_FREE_LICENSE.quotas},[se.PlanType.PREMIUM]:void 0,[se.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(St(2)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[se.PlanType.PREMIUM_MAX]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(St(2)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[se.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(0),...p.plugins(g),...p.customAIConfigurations(1)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(30)}},[se.PlanType.PRO]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(5),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.PRO_MAX]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(5),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(7),...p.automationLogRetentionDays(7),...p.appBackupRetentionDays(7)}},[se.PlanType.TEAM]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(10),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(90)}},[se.PlanType.BUSINESS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(0),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(50),...p.plugins(g),...p.customAIConfigurations(0)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}},[se.PlanType.BUSINESS_PLUS]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(St(50)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(30),...p.automationLogRetentionDays(30),...p.appBackupRetentionDays(g)}},[se.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(St(50)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}},[se.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(75e4),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(15),...p.automationLogRetentionDays(15),...p.appBackupRetentionDays(15)}},[se.PlanType.ENTERPRISE]:{usage:{monthly:{...p.queries(g),...p.automations(g),...p.budibaseAICredits(St(50)),...p.actions(g)},static:{...p.rows(g),...p.apps(g),...p.users(g),...p.creators(g),...p.userGroups(g),...p.plugins(g),...p.customAIConfigurations(g)}},constant:{...p.agentLogRetentionDays(g),...p.automationLogRetentionDays(g),...p.appBackupRetentionDays(g)}}};function Oi(e,t){let r;function a(o){let s=o[t];if(!s)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return s}switch(n(a,"readQuotas"),e){case se.Hosting.SELF:r=a(TE);break;case se.Hosting.CLOUD:r=a(IE);break}return JSON.parse(JSON.stringify(r))}n(Oi,"getQuotas");var _o={};F(_o,{encoding:()=>Xr,workspaceExists:()=>SE});var hd=require("@budibase/backend-core");async function SE(e){return(await hd.db.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}n(SE,"workspaceExists");var Xr={};F(Xr,{base64ToObject:()=>xE,objectToBase64:()=>_E});function _E(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}n(_E,"objectToBase64");function xE(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}n(xE,"base64ToObject");var th=require("@budibase/types"),pa=require("@budibase/backend-core"),rh=Ie(km()),ah=Ie(rl());async function ek(e){await nt.save({offlineLicenseToken:e}),await kr()}n(ek,"activateOfflineLicenseToken");async function tk(){await nt.save({offlineLicenseToken:void 0}),await kr()}n(tk,"deleteOfflineLicenseToken");async function nh(){return(await nt.get()).offlineLicenseToken}n(nh,"getOfflineLicenseToken");async function al(){let t=(await pa.installation.getInstall()).installId,r=pa.context.getTenantId(),a=await pa.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:a}}n(al,"getIdentifier");async function rk(){let e=await al();return Xr.objectToBase64(e)}n(rk,"getIdentifierBase64");function ak(e){return Xr.base64ToObject(e)}n(ak,"getIdentifierFromBase64");function oh(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}n(oh,"verifyExpiry");async function sh(e){let t=await al();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}n(sh,"verifyInstallation");function ih(e){let t=e.plan.type,r=th.Hosting.SELF,a=Ri(t),o=Oi(r,t);return e.features=(0,rh.default)(e.features,a),e.quotas=(0,ah.default)(e.quotas,o),e}n(ih,"enrichLicense");async function nl(){try{let e=await nh();if(e){let t=await dn(e);return oh(t),await sh(t),ih(t)}}catch(e){console.error("Error retrieving offline license",e)}}n(nl,"getOfflineLicense");var Pn={};F(Pn,{deleteDevLicense:()=>lk,getOfflineLicense:()=>sk,writeDevLicenseToDisk:()=>ik});var lh=require("@budibase/backend-core"),sl=require("path"),uh=require("os"),Nr=Ie(require("fs"));var nk=lh.env.isTest()?".budibase-test":".budibase",ol=(0,sl.join)((0,uh.tmpdir)(),nk),ok="dev_license.txt",Mn=(0,sl.join)(ol,ok);if(!Nr.default.existsSync(ol))try{Nr.default.mkdirSync(ol)}catch{}function sk(){try{if(Nr.default.existsSync(Mn)){let e=Nr.default.readFileSync(Mn,{encoding:"utf-8"});return dn(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}n(sk,"getOfflineLicense");function ik(e){console.log(`Writing license to: ${Mn}`),Nr.default.writeFileSync(Mn,e,{encoding:"utf-8"})}n(ik,"writeDevLicenseToDisk");function lk(){Nr.default.rmSync(Mn,{force:!0})}n(lk,"deleteDevLicense");var ch=require("dd-trace");var ll=n(async()=>await ch.tracer.trace("getLicense",async e=>{if(il.env.OFFLINE_MODE)return e.addTags({offline:!0}),nl();let t=await Zr();return t||(e.addTags({offlineFallback:!0}),t=Pn.getOfflineLicense()),t}),"getLicense"),ul=n(e=>xi(e),"getLicenseFromKey"),cl=n(()=>il.env.SELF_HOSTED?Tt.SELF_FREE_LICENSE:Tt.CLOUD_FREE_LICENSE,"getFreeLicense");var dl={};F(dl,{activateLicenseKey:()=>uk,deleteLicenseKey:()=>pk,getLicenseKey:()=>ck});var pl=Ie(require("dd-trace"));async function uk(e){await Ai(e),await nt.save({licenseKey:e}),await kr()}n(uk,"activateLicenseKey");async function ck(){return await pl.default.trace("getLicenseKey",async e=>{let t=await nt.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}n(ck,"getLicenseKey");async function pk(){return await pl.default.trace("deleteLicenseKey",async()=>{await nt.save({licenseKey:void 0}),await kr()})}n(pk,"deleteLicenseKey");var jo=require("@budibase/backend-core");var kn,fk=n(async()=>{kn=await jo.RedisClient.init(jo.redis.utils.Databases.LICENSES)},"init"),mk=n(async()=>{kn&&await kn.finish()},"shutdown");process.on("exit",async()=>{await mk()});var Go=n(async()=>(kn||await fk(),kn),"getClient");var dh=require("@budibase/shared-core");var ml=yt.Duration.fromHours(1).toSeconds(),fh=yt.Duration.fromHours(1).toSeconds(),hk=ml+fh,kr=n(async()=>{await hh(),await gh()},"refresh"),ph=n(async e=>{let{result:t}=await yt.locks.doWithLock({type:Wo.LockType.DEFAULT,name:Wo.LockName.SYNC_ACCOUNT_LICENSE,resource:e,ttl:yt.Duration.fromSeconds(10).toMs()},async()=>{let r=await Go(),a=await r.get(e);if(a&&!mh(a))return a;let o=await $o.default.trace("populateLicense",async()=>await ll());return o||(o=$o.default.trace("populateFreeLicense",()=>cl())),o.refreshedAt=new Date().toISOString(),await r.store(e,o,hk),o});return t},"populateAndStoreLicense"),mh=n(e=>{let t=e.refreshedAt?Date.parse(e.refreshedAt):0;return Date.now()-t>=ml*1e3},"shouldRefreshLicense"),fl=n(async()=>await $o.default.trace("getCachedLicense",async e=>{let t=yt.context.getLicense();if(t)return e.addTags({foundInContext:!0,features:t.features,plan:t.plan,quotas:t.quotas}),t;let r=yt.tenancy.getTenantId(),o=await(await Go()).get(r);return e.addTags({tenantId:r,foundInCache:!!o}),o?(e.addTags({foundInCache:!0,refreshedAt:o.refreshedAt,features:o.features,plan:o.plan,quotas:o.quotas}),mh(o)&&ph(r).catch(()=>{}),o):(o=await dh.helpers.retry(()=>ph(r)),e.addTags({refreshedAt:o.refreshedAt,features:o.features,plan:o.plan,quotas:o.quotas,expirySeconds:ml,staleGraceSeconds:fh}),o)}),"_getCachedLicense");yt.env.isJest()&&(fl=jest.fn().mockImplementation(fl));var gh=fl,hh=n(async()=>{let e=yt.tenancy.getTenantId();await(await Go()).delete(e)},"invalidate");async function Me(e,t){Array.isArray(e)||(e=[e]),t||(t=await Ct.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}n(Me,"areFeaturesEnabled");async function Vo(e,t){if(!await Me(e,t))throw new Xt.FeatureDisabledWarning(e)}n(Vo,"checkFeature");async function gl(e,t){if(!await Me(e,t)){let r=e.join(", ");throw new Xt.FeatureDisabledWarning(r)}}n(gl,"checkFeatures");function ze(e){return async(...t)=>(await Vo(Ee.Feature.WORKSPACE_BACKUPS),e(...t))}n(ze,"checkBackups");async function hl(){return Me(Ee.Feature.WORKSPACE_BACKUPS)}n(hl,"isBackupsEnabled");async function yl(){return Me(Ee.Feature.BRANDING)}n(yl,"isBrandingEnabled");async function yk(e){return Me(Ee.Feature.MICROFRONTEND,e)}n(yk,"isMicrofrontendFeatureEnabled");async function yh(){return Me(Ee.Feature.ENFORCEABLE_SSO)}n(yh,"isEnforceableSSO");async function vk(){return Me(Ee.Feature.EMBED_AUTH)}n(vk,"isEmbedAuthEnabled");async function bk(){return Me(Ee.Feature.SYNC_AUTOMATIONS)}n(bk,"isSyncAutomationsEnabled");async function wk(){return Me(Ee.Feature.TRIGGER_AUTOMATION_RUN)}n(wk,"isTriggerAutomationRunEnabled");async function Ko(){return Me(Ee.Feature.AUDIT_LOGS)}n(Ko,"isAuditLogsEnabled");async function vl(){return Me(Ee.Feature.USER_GROUPS)}n(vl,"isUserGroupsEnabled");function Ik(){return Me(Ee.Feature.PWA)}n(Ik,"isPWAEnabled");function Tk(){return Me(Ee.Feature.RECAPTCHA)}n(Tk,"isRecaptchaEnabled");var Sk=n(()=>Me(Ee.Feature.PKCE_OIDC),"isPkceOidcEnabled");async function _k(){return Me(Ee.Feature.TRANSLATIONS)}n(_k,"isTranslationsEnabled");async function da(){return Me(Ee.Feature.EXPANDED_PUBLIC_API)}n(da,"isExpandedPublicApiEnabled");async function xk(){return Me(Ee.Feature.WORKSPACE_IMPORT_EXPORT)}n(xk,"isWorkspaceImportExportEnabled");async function Qo(){return Me([Ee.Feature.EXPANDED_PUBLIC_API,Ee.Feature.WORKSPACE_IMPORT_EXPORT])}n(Qo,"isWorkspaceImportExportPublicApiEnabled");async function Ak(e){if(Xt.env.ENABLE_SSO_MAINTENANCE_MODE||!await yh())return!1;let r;return e?.config?r=e.config:r=await Xt.configs.getSettingsConfig(),!!r.isSSOEnforced}n(Ak,"isSSOEnforced");var bl=n(async()=>{let e=Ee.Feature.SCIM,t=await Me(e),r=await Xt.configs.getSCIMConfig();if(!t||!r?.enabled)throw new Xt.FeatureDisabledWarning(e);return!0},"checkSCIM");async function Ek(){return Me(Ee.Feature.VIEW_PERMISSIONS)}n(Ek,"isViewPermissionEnabled");async function Rk(){return Me(Ee.Feature.VIEW_READONLY_COLUMNS)}n(Rk,"isViewReadonlyColumnsEnabled");var Ok={faviconUrl:void 0,faviconUrlEtag:void 0,emailBrandingEnabled:!0,platformTitle:void 0,loginHeading:void 0,loginButton:void 0,metaDescription:void 0,metaImageUrl:void 0,metaTitle:void 0};async function Ck(e){return await yl()?{faviconUrl:e.faviconUrl,faviconUrlEtag:e.faviconUrlEtag,emailBrandingEnabled:e.emailBrandingEnabled,platformTitle:e.platformTitle,loginHeading:e.loginHeading,loginButton:e.loginButton,metaDescription:e.metaDescription,metaImageUrl:e.metaImageUrl,metaTitle:e.metaTitle}:Ok}n(Ck,"getBrandingConfig");var Ht={};F(Ht,{addAction:()=>Nk,addApp:()=>Dk,addAutomation:()=>jk,addGroup:()=>Il,addPlugin:()=>Sl,addRow:()=>Uk,addRows:()=>Fk,addUsers:()=>Zo,bustCache:()=>gi,decrement:()=>er,decrementMany:()=>Nn,getCurrentUsageValues:()=>Bp,getLicensedQuota:()=>Jo,getQuotaUsage:()=>Or,increment:()=>vt,incrementBudibaseAICredits:()=>Gk,incrementMany:()=>qr,removeApp:()=>qk,removeGroup:()=>Tl,removePlugin:()=>_l,removeRow:()=>Lk,removeRows:()=>Bk,removeUsers:()=>ha,set:()=>Dn,setAllUsage:()=>yi,setAppUsageValue:()=>hi,setBudibaseAICredits:()=>Ih,setUsage:()=>qp,setUsagePerApp:()=>Up,throwIfBudibaseAICreditsExceeded:()=>Wk,updatePluginCount:()=>xl,updateUsage:()=>fa,usageLimitIsExceeded:()=>wl,utils:()=>Wa});var Yo=require("@budibase/types");var kt=require("@budibase/backend-core"),Le=require("@budibase/types"),Dr=require("dd-trace");var vt=n(async(e,t,r)=>await Dr.tracer.trace("quotas.increment",async a=>(a.addTags({name:e,type:t}),await vh({change:1,name:e,type:t,opts:r}))),"increment"),qr=n(e=>Dr.tracer.trace("quotas.incrementMany",async()=>vh(e)),"incrementMany"),vh=n(async e=>await Dr.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await fa(r.map(o=>({usageChange:o.change,name:o.name,type:o.type,opts:{dryRun:!0,suppressErrorLog:o.opts?.suppressErrorLog,id:o.opts?.id}})));let a=[];for(let o of r)await Dr.tracer.trace("quotas.incrementMany.fn",async s=>{s.addTags({actionName:o.name,actionType:o.type,actionChange:o.change});let i=o.opts?.fn;i&&a.push(await i())});return await fa(r.map(o=>({usageChange:o.change,name:o.name,type:o.type,opts:{dryRun:!1,valueFn:o.opts?.valueFn,suppressErrorLog:o.opts?.suppressErrorLog,id:o.opts?.id}}))),a[0]}),"tryIncrement"),er=n((e,t,r={})=>fa({usageChange:-1,name:e,type:t,opts:r}),"decrement"),Nn=n(e=>{let t=Array.isArray(e)?e:[e];return fa(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),Dn=n(async(e,t,r)=>It.setUsage(r,e,t),"set"),Mk=n((e,t,r)=>{if(e==Le.QuotaUsageType.STATIC){let a=r.usageQuota.triggers;return a?a[t]||{}:{}}else{let a=It.utils.getCurrentMonthString(),o=r.monthly[a].triggers;return o?o[t]||{}:{}}},"getExistingTriggers"),Pk=n(async(e,t,r,a)=>{try{await kt.locks.doWithLock({type:Le.LockType.TRY_ONCE,name:Le.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let o={percentage:r,name:t.name};a&&(o.resetDate=a),await vr.triggerQuota(o)})}catch(o){kt.logging.logAlert("Error triggering quota",o)}},"triggerQuota"),kk=n(async(e,t,r,a)=>{let o=await Or(),s=e===Le.QuotaUsageType.MONTHLY?o.quotaReset:void 0,i=await Mk(e,t,o),l=a.triggers,u=r/a.value*100;u>100&&(u=100);for(let[c,d]of l.entries())if(u>=d&&a.value!==Zt.UNLIMITED){if(!i[d]){i[d]=new Date().toISOString();let h=l[c+1]||100;(!(u>=h)||u===d)&&await Pk(t,a,u,s)}}else i[d]=void 0;return i},"checkTriggers"),fa=n(async e=>{await Dr.tracer.trace("quotas.updateUsage",async t=>{let r=kt.tenancy.getTenantId(),a=Array.isArray(e)?e:[e];t.addTags({numActions:a.length,tenantId:r});let o,s,i=[],l={},u={},c={},d={};for(let h of a)await Dr.tracer.trace("quotas.updateUsage.action",async b=>{b.addTags({actionName:h.name,actionType:h.type,actionUsageChange:h.usageChange});try{o=kt.context.getWorkspaceId()}catch{}if(Le.APP_QUOTA_NAMES.includes(h.name)&&!o)throw new Error("App context required for quota update");try{s=await Jo(Le.QuotaType.USAGE,h.name,h.type),i.push(s);let{total:w,app:T,breakdown:A}=await It.getCurrentUsageValues(h.type,h.name,h.opts?.id);w+=h.usageChange,T!=null&&(T+=h.usageChange),A!=null&&(A+=h.usageChange);let D={};if(h.opts?.dryRun||(D=await kk(h.type,h.name,w,s),d={...d,[h.name]:D}),s.value!==Zt.UNLIMITED&&w>s.value&&h.usageChange>0)throw new kt.UsageLimitWarning(`${h.name}`);if(w=Math.max(0,w),T&&(T=Math.max(0,T)),A!=null&&(A=Math.max(0,A),c={...c,[h.name]:A}),!h.opts?.dryRun){let W=h.opts?.valueFn;W&&(w=await W(),T=w),l={...l,[h.name]:w},u={...u,[h.name]:T}}}catch(w){throw h.opts?.suppressErrorLog||console.warn(`Error updating usage quotas for ${h.name}`,w),w}});let y=a.filter(h=>!h.opts?.dryRun).map(h=>({name:h.name,type:h.type,values:{total:l[h.name],app:u[h.name],breakdown:c[h.name],triggers:d[h.name]},opts:{...h.opts,tenantId:r}}));y.length>0&&await It.setAllUsage(y)})},"updateUsage"),Jo=n(async(e,t,r)=>{let a=await Ct.getCachedLicense();if(!a){let o=kt.tenancy.getTenantId();throw new Error("License not found for tenant id "+o)}if(r&&(0,Le.isStaticQuota)(e,r,t))return a.quotas[e][r][t];if(r&&(0,Le.isMonthlyQuota)(e,r,t))return a.quotas[e][r][t];if((0,Le.isConstantQuota)(e,t))return a.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),wl=n(async({name:e,type:t,usageChange:r})=>{try{return await fa({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(a){if(a.code===Le.APIWarningCode.USAGE_LIMIT_EXCEEDED)return!0;throw a}},"usageLimitIsExceeded");var Nk=n(async(e,t)=>vt(Yo.MonthlyQuotaName.ACTIONS,Yo.QuotaUsageType.MONTHLY,{fn:t,id:e}),"addAction");var bh=require("@budibase/backend-core"),ma=require("@budibase/types");var wh=n(async()=>{let e=await bh.db.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),Dk=n(async(e,{appId:t}={})=>vt(ma.StaticQuotaName.WORKSPACES,ma.QuotaUsageType.STATIC,{fn:e,valueFn:wh,id:t}),"addApp"),qk=n(async({appId:e}={})=>er(ma.StaticQuotaName.WORKSPACES,ma.QuotaUsageType.STATIC,{valueFn:wh,id:e}),"removeApp");var Kt=require("@budibase/types");var Uk=n(async(e,{tableId:t}={})=>vt(Kt.StaticQuotaName.ROWS,Kt.QuotaUsageType.STATIC,{fn:e,id:t}),"addRow"),Lk=n(async({tableId:e}={})=>er(Kt.StaticQuotaName.ROWS,Kt.QuotaUsageType.STATIC,{id:e}),"removeRow"),Fk=n(async(e,t,{tableId:r}={})=>qr({change:e,name:Kt.StaticQuotaName.ROWS,type:Kt.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),"addRows"),Bk=n(async(e,{tableId:t}={})=>Nn({change:e,name:Kt.StaticQuotaName.ROWS,type:Kt.QuotaUsageType.STATIC,opts:{id:t}}),"removeRows");var zo=require("@budibase/types");var jk=n(async(e,{automationId:t}={})=>vt(zo.MonthlyQuotaName.AUTOMATIONS,zo.QuotaUsageType.MONTHLY,{fn:e,id:t}),"addAutomation");var ga=require("@budibase/types");var Il=n(async e=>vt(ga.StaticQuotaName.USER_GROUPS,ga.QuotaUsageType.STATIC,{fn:e}),"addGroup"),Tl=n(async()=>er(ga.StaticQuotaName.USER_GROUPS,ga.QuotaUsageType.STATIC),"removeGroup");var Tr=require("@budibase/types");var Sl=n(async e=>vt(Tr.StaticQuotaName.PLUGINS,Tr.QuotaUsageType.STATIC,{fn:e}),"addPlugin"),_l=n(async()=>er(Tr.StaticQuotaName.PLUGINS,Tr.QuotaUsageType.STATIC),"removePlugin"),xl=n(async e=>Dn(Tr.StaticQuotaName.PLUGINS,Tr.QuotaUsageType.STATIC,e),"updatePluginCount");var Qt=require("@budibase/types"),qn=require("@budibase/backend-core");var Zo=n(async(e,t,r)=>{if(e===0&&t===0)return r?await r():void 0;let a=[{change:e,name:Qt.StaticQuotaName.USERS,type:Qt.QuotaUsageType.STATIC,opts:{fn:r,valueFn:qn.users.getUserCount}}];t>0&&a.push({change:t,name:Qt.StaticQuotaName.CREATORS,type:Qt.QuotaUsageType.STATIC,opts:{valueFn:qn.users.getCreatorCount}});let o=await qr(a);return Promise.resolve(Zr()).catch(s=>{console.log("Failed to sync license after adding users",s)}),o},"addUsers"),ha=n(async(e,t)=>{let r=[{change:e,name:Qt.StaticQuotaName.USERS,type:Qt.QuotaUsageType.STATIC,opts:{valueFn:qn.users.getUserCount}}];t>0&&r.push({change:t,name:Qt.StaticQuotaName.CREATORS,type:Qt.QuotaUsageType.STATIC,opts:{valueFn:qn.users.getCreatorCount}}),await Nn(r),Promise.resolve(Zr()).catch(a=>{console.log("Failed to sync license after removing users",a)})},"removeUsers");var ot=require("@budibase/types");var Al=require("@budibase/backend-core"),ts=require("@budibase/types");var Xo=class extends Al.HTTPError{static{n(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}},es=class extends Al.HTTPError{static{n(this,"AICreditsExhaustedError")}constructor(){super("You have reached your Budibase AI Credits limit for this billing cycle.",402),this.code=ts.APIWarningCode.USAGE_LIMIT_EXCEEDED}getPublicError(){return{quota:ts.MonthlyQuotaName.BUDIBASE_AI_CREDITS}}};var Gk=n(async e=>{try{return await qr({change:e,name:ot.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:ot.QuotaUsageType.MONTHLY})}catch(t){throw t.code===ot.APIWarningCode.USAGE_LIMIT_EXCEEDED&&await $k().catch(()=>{}),t}},"incrementBudibaseAICredits"),$k=n(async()=>{let e=await Jo(ot.QuotaType.USAGE,ot.MonthlyQuotaName.BUDIBASE_AI_CREDITS,ot.QuotaUsageType.MONTHLY);e.value>=0&&await Ih(e.value)},"capBudibaseAICreditsAtLimit"),Wk=n(async()=>{if(await wl({name:ot.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:ot.QuotaUsageType.MONTHLY,usageChange:1}))throw new es},"throwIfBudibaseAICreditsExceeded"),Ih=n(async e=>Dn(ot.MonthlyQuotaName.BUDIBASE_AI_CREDITS,ot.QuotaUsageType.MONTHLY,e),"setBudibaseAICredits");var rs={};F(rs,{db:()=>Dt});var Ol=require("@budibase/backend-core");var Nt={};F(Nt,{addUsers:()=>zk,adjustGroupCreatorsQuotas:()=>tN,cleanupApp:()=>eN,enrichUserRolesFromGroups:()=>Kk,fetch:()=>Rl,get:()=>Eh,getBulk:()=>Rh,getDefaultGroup:()=>Qk,getGroupBuilderAppIds:()=>Ah,getGroupRoleId:()=>Vk,remove:()=>Yk,removeUsers:()=>Zk,save:()=>Oh,updateGroupApps:()=>Xk});var K=require("@budibase/backend-core");async function El(e,t){try{let r=[];for(let l of e)if(l.roles){let u=l.roles[K.db.getProdWorkspaceID(t)];u&&r.push(u)}let a=await Promise.all(r.map(async l=>({[l]:await K.roles.roleToNumber(l)}))),o,s,i={};a.forEach(l=>{let[u,c]=Object.entries(l)[0];i[u]={roleId:u,roleNum:c}});for(let{roleId:l,roleNum:u}of Object.values(i))(s===void 0||u>s)&&(s=u,o=l);return o}catch(r){throw K.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}n(El,"findHighestRole");async function xh(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await oe.getBulk(e,{enriched:!1}),t}n(xh,"groupList");async function Ah(e,t){if(!e.userGroups)return[];let r=await xh(e.userGroups,t?.groups),a=t?.appId?K.db.getProdWorkspaceID(t?.appId):null,o=[];for(let s of r){let i=s.builder?.apps;a&&i?.includes(a)?o.push(a):a||(o=o.concat(i||[]))}return[...new Set(o)]}n(Ah,"getGroupBuilderAppIds");async function Vk(e,t,r){if(!e.userGroups)return null;let a=await xh(e.userGroups,r?.groups),o=K.db.getProdWorkspaceID(t);return e.roles?.[o]?e.roles[o]:(a=a.filter(l=>l?.roles?Object.keys(l.roles).includes(o):!1),K.context.getCurrentContext()?.appId===t?El(a,t):await K.context.doInWorkspaceContext(t,async()=>El(a,t)))}n(Vk,"getGroupRoleId");async function Kk(e){if(!e||!e.userGroups)return e;let t=await Rh(e.userGroups,{enriched:!1}),r=[];for(let o of t)o?.roles&&(r=r.concat(Object.keys(o.roles)));r=[...new Set(r)];for(let o of r)await K.context.doInWorkspaceContext(o,async()=>{if(e.roles[o])return;let s=await El(t,o);s&&(e.roles[o]=s)});let a=await Ah(e,{groups:t});if(a.length&&!e.builder?.global){let o=e.builder?.apps||[];e.builder={...e.builder,apps:o.concat(a)}}return e}n(Kk,"enrichUserRolesFromGroups");async function Rl(){return await oe.fetch()}n(Rl,"fetch");async function Eh(e){return await oe.get(e)}n(Eh,"get");async function Qk(){return(await oe.getAll()).find(t=>t.isDefault)}n(Qk,"getDefaultGroup");async function Rh(e,t={enriched:!0}){return oe.getBulk(e,t)}n(Rh,"getBulk");async function Th(e){if(await oe.getByName(e))throw new Xo(e)}n(Th,"guardNameAvailability");async function Sh(e){let t=await oe.getGroupUsers(e._id);if(!t.length)return 0;let a=await K.tenancy.getGlobalDB().getMultiple(t.map(s=>s._id));return(await K.userUtils.creatorsInList(a)).filter(s=>s).length}n(Sh,"getCreatorsCountInGroup");function _h(e){return Object.values(e.roles||{}).includes("CREATOR")}n(_h,"isCreatorGroup");function Hk(e){let{users:t,...r}=e;return r}n(Hk,"stripEnrichedFields");async function Jk(e){if(!e.isDefault)return oe.save(e);let r=(await oe.getAll()).filter(i=>i._id!==e._id).filter(i=>i.isDefault);if(!r.length)return oe.save(e);let o=(await oe.bulkSave([...r.map(i=>({...i,isDefault:!1})),e])).find(i=>i.id===e._id);if(o?.rev)return{id:e._id,rev:o.rev};let s=await oe.get(e._id);return{id:s._id,rev:s._rev}}n(Jk,"saveGroupWithDefaultUpdates");async function Oh(e){let t=[],r=!e._id,a=0;if(!e._id)e._id=oe.generateUserGroupID(),await Th(e.name),t.push(K.events.group.created(e));else{let i=await oe.get(e._id);if(i.name!==e.name&&await Th(e.name),t.push(K.events.group.updated(e)),JSON.stringify(i.roles)!==JSON.stringify(e.roles)){let l=_h(i),u=_h(e);if(l!==u){let c=i.users?.length||0,d=0;c>0&&(d=await Sh(i)),u?a=c-d:a=-c}t.push(K.events.group.permissionsEdited(e))}}await Promise.all(t);let o=Hk(e),s=n(()=>Jk(o),"saveGroup");if(r)return await Il(s);{let i=await s();if(a>0)await Zo(0,a);else if(a<0){let l=await Sh(e),u=Math.abs(a)-l;u>0&&await ha(0,u)}return i}}n(Oh,"save");async function Yk(e,t){let r;try{r=await oe.get(e)}catch{throw new Error("Group not found")}let a=Object.values(r.roles||{}).includes("CREATOR"),o=n(()=>{},"recalculateCreatorsQuotasFn");if(a){let i=K.tenancy.getGlobalDB(),l=await oe.getGroupUsers(e),c=(await Promise.all(l.map(b=>i.get(b._id)))).map(b=>({...b,userGroups:b.userGroups.filter(R=>R!==e)})),y=(await K.userUtils.creatorsInList(c)).filter(b=>b).length,h=l.length-y;h&&(o=n(()=>ha(0,h),"recalculateCreatorsQuotasFn"))}let s=await oe.destroy(e,t);return await K.events.group.deleted(r),await Tl(),await o(),s}n(Yk,"remove");async function zk(e,t){let r=await oe.get(e),a=await K.users.bulkGetGlobalUsersById(t),o=[];for(let u of a)u.userGroups||(u.userGroups=[]),u.userGroups.includes(e)||o.push(u);if(!o.length)return o;let s=o.map(u=>({...u,userGroups:[...u?.userGroups||[],e]}));if(await K.users.bulkUpdateGlobalUsers(s),Object.values(r.roles||{}).includes("CREATOR")){let c=(await K.userUtils.creatorsInList(o)).filter(y=>y).length,d=o.length-c;d&&await Zo(0,d)}let l=[];for(let u of t)l.push(K.cache.user.invalidateUser(u));return await Promise.all(l),await K.events.group.usersAdded(s.length,r,t),s}n(zk,"addUsers");async function Zk(e,t){let r=await oe.get(e),a=await K.users.bulkGetGlobalUsersById(t),o=[];for(let l of a){if(!l.userGroups||!l.userGroups.includes(e))continue;let u=l.userGroups.indexOf(e);l.userGroups.splice(u,1),o.push(l)}if(await K.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes("CREATOR")){let u=(await K.userUtils.creatorsInList(o)).filter(d=>d).length,c=o.length-u;c&&await ha(0,c)}let i=[];for(let l of t)i.push(K.cache.user.invalidateUser(l));return await Promise.all(i),o.length&&await K.events.group.usersDeleted(o.length,r,t),o}n(Zk,"removeUsers");async function Xk(e,t){let r=await Eh(e);if(r.roles||(r.roles={}),t.appsToAdd)for(let a of t.appsToAdd)r.roles[a.appId]=a.roleId;if(t.appsToRemove)for(let a of t.appsToRemove)delete r.roles[a.appId];return r.builder={apps:Object.entries(r.roles).filter(([a,o])=>o==="CREATOR").map(([a])=>a)},await Oh(r)}n(Xk,"updateGroupApps");async function eN(e){let t=await Rl(),r=[];for(let a of t)!a.roles||!a.roles[e]||(delete a.roles[e],r.push(a));return await oe.bulkSave(r)}n(eN,"cleanupApp");async function tN(){if(!await vl()){let e=K.tenancy.getGlobalDB(),r=(await Rl()||[]).filter(a=>Object.values(a?.roles||{}).includes("CREATOR"));for(let a of r){let o=await oe.getGroupUsers(a._id),i=(await Promise.all(o.map(d=>e.get(d._id)))).map(d=>({...d,userGroups:d.userGroups.filter(y=>y!==a._id)})),u=(await K.userUtils.creatorsInList(i)).filter(d=>d).length,c=o.length-u;await oe.save({...a,roles:{}}),c&&await ha(0,c)}}}n(tN,"adjustGroupCreatorsQuotas");Ol.users.UserDB.init(Ht,Nt,Pt);var Dt=Ol.users.UserDB;var ss={};F(ss,{logs:()=>ql});var ql={};F(ql,{logSearch:()=>cN,oldestLogDate:()=>qh,storeLog:()=>pN});var os=require("@budibase/backend-core"),Dh=require("@budibase/types");var Ge=require("@budibase/backend-core"),ns=require("@budibase/types");var Ch=require("@budibase/backend-core");async function Mh(e,t){let r,a=5,o=!1,s,i=!0;for(;a>0;a--)try{i?s=await e():s=await exports.randomDelay(e),o=!0;break}catch(l){r=l}return o||Ch.logging.logWarn(`Failed to backoff: ${t}`,r),s}n(Mh,"backOff");var{SEPARATOR:tr,UNICODE_MAX:rN,DocumentType:Ph,AutomationViewMode:Cl,ViewName:aN,getQueryIndex:nN}=Ge.db,oN=new Date(0).toISOString(),sN=100,as=10,Ml=n(async()=>vo(ns.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS),"oldestLogDate");function kh(e,t,{status:r,automationId:a}={},o={}){let s=a?`${a}${tr}`:"",i=r?`${r}${tr}`:"",l;return r&&a?l=`${Cl.ALL}${tr}${i}${s}`:r?l=`${Cl.STATUS}${tr}${i}`:a?l=`${Cl.AUTOMATION}${tr}${s}`:l=`${Ph.AUTOMATION_LOG}${tr}`,{...o,descending:!0,startkey:`${l}${t}${rN}`,endkey:`${l}${e}`}}n(kh,"getAutomationLogParams");function iN(e,t,r){return`${Ph.AUTOMATION_LOG}${tr}${e}${tr}${r}${tr}${t}`}n(iN,"generateAutomationLogID");async function Pl(e,t,r={docs:!0}){let a=Ge.context.getProdWorkspaceDB();await a.exists()||(a=Ge.context.getDevWorkspaceDB());let o={status:r.status},s=r?.limit?r.limit:r?.paginate?as+1:void 0,i=kh(e,t,o,{include_docs:r.docs,limit:s});r?.page&&(i.startkey=r.page);let l=await a.allDocs(i),u=pn(l,{paginate:r?.paginate,pageSize:as});return{...u,totalLogs:u.totalRows}}n(Pl,"getAllLogs");async function kl(e,t,r={}){let a=Ge.context.getProdWorkspaceDB();await a.exists()||(a=Ge.context.getDevWorkspaceDB());let o;try{let i={automationId:r?.automationId,status:r?.status},l=kh(e,t,i,{include_docs:!0,limit:as+1});r?.page&&(l.startkey=r.page),o=await a.query(nN(aN.AUTOMATION_LOGS),l)}catch(i){if(i!=null&&(i.name==="not_found"||i.error==="not_found"))return await td(),kl(e,t,r);throw i}let s=pn(o,{paginate:!0,pageSize:as});return{...s,totalLogs:s.totalRows/3}}n(kl,"getLogsByView");async function Nh(e,t){let r=Ge.context.getProdWorkspaceDB(),a=e._id,o=e.name,s=new Date().toISOString(),i=iN(s,t.status,a),l={...t,automationId:a,status:t.status,automationName:o,createdAt:s,_id:i};return await r.put(l),i}n(Nh,"writeLog");async function Nl(e,{clearing:t}={clearing:!1}){let r=Ge.context.getProdWorkspaceDB();await Mh(async()=>{let a=await r.get(Ge.db.DocumentType.WORKSPACE_METADATA);for(let o of e){let s=o.split(Ge.db.SEPARATOR),i=`${s[s.length-3]}${Ge.db.SEPARATOR}${s[s.length-2]}`,l={};a.automationErrors&&(l=a.automationErrors),Array.isArray(l[i])||(l[i]=[]);let u=l[i].indexOf(o);t&&u!==-1?l[i].splice(u,1):l[i].push(o),l[i].length===0&&delete l[i],a.automationErrors=l}await r.put(a),await Ge.cache.workspace.invalidateWorkspaceMetadata(a.appId,a)},"Failed to update app metadata with automation log error")}n(Nl,"updateAppMetadataWithErrors");async function lN(){let e=await Ml();try{return await Pl(oN,e,{docs:!1,paginate:!1,limit:sN})}catch{return{data:[],hasNextPage:!1,totalLogs:0}}}n(lN,"getExpiredLogs");async function Dl(){let e=Ge.context.getProdWorkspaceDB();try{let t=await lN();if(!t.data||t.data.length===0)return;let r=t.data.map(o=>({_id:o.id,_rev:o.value.rev,_deleted:!0})),a=t.data.filter(o=>{let s=o.id.split(Ge.db.SEPARATOR);return s[s.length-1]===ns.AutomationStatus.ERROR}).map(o=>o.id);await e.bulkDocs(r),a.length&&await Nl(a,{clearing:!0})}catch(t){Ge.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}n(Dl,"clearOldHistory");var qh=Ml;async function uN(e,t,r,a){let o,s=new Date().toISOString(),i=await qh();return(!e||e<i)&&(e=i),r||t?o=await kl(e,s,{automationId:r,status:t,page:a}):o=await Pl(e,s,{status:t,page:a,docs:!0,paginate:!0}),o}n(uN,"getLogs");async function cN(e){return await Dl(),await uN(e.startDate,e.status,e.automationId,e.page)}n(cN,"logSearch");async function pN(e,t){if(!os.db.isProdWorkspaceID(os.context.getWorkspaceId()))return;let r=await Nh(e,t);t.status===Dh.AutomationStatus.ERROR&&await Nl([r]),await Dl()}n(pN,"storeLog");var is={};F(is,{checkPluginQuotas:()=>mN,deletePlugin:()=>fN,storePlugin:()=>dN});var Bh=require("@budibase/types"),Fe=require("@budibase/backend-core"),jh=Ie(require("module")),Gh=Ie(require("isolated-vm"));var Uh=Ie(require("fs")),Lh=require("path");function Fh(e,t){return Uh.default.readFileSync((0,Lh.join)(e,t),"utf8")}n(Fh,"loadJSFile");async function dN(e,t,r,a){let o=Fe.tenancy.getGlobalDB(),s=e.package.version,i=e.package.name,l=e.package.description,u=e.schema.hash,c=Fe.objectStore.getPluginS3Dir(i),d=await Fe.objectStore.uploadDirectory(Fe.objectStore.ObjectStoreBuckets.PLUGINS,t,c),y=d.find(D=>D.name.endsWith(".js")),h=d.find(D=>D.name.endsWith(".svg"));if(!y)throw new Error("Plugin missing .js file.");if(e.schema.type===Bh.PluginType.DATASOURCE){let D=Fh(t,y.name),W=new Gh.default.Isolate({memoryLimit:8});try{W.compileScriptSync(jh.default.wrap(D),{filename:y.name})}catch(ne){let H=ne?.message?ne.message:JSON.stringify(ne);throw new Error(`JS invalid: ${H}`)}finally{W.dispose()}}let b=h?h.name:null,R=Fe.db.generatePluginID(i),w;try{w=(await o.get(R))._rev}catch{w=void 0}let T={_id:R,_rev:w,...e,name:i,version:s,hash:u,description:l,source:r};b&&(T.iconFileName=b),r&&(T={...T,source:r}),a&&a.source==="github"&&(T.origin=a);let A=n(async()=>{let D=await o.put(T);return await Fe.events.plugin.imported(T),{...T,_rev:D.rev}},"write");return w?await A():await Sl(A)}n(dN,"storePlugin");async function fN(e){let t=Fe.tenancy.getGlobalDB();try{let r=await t.get(e),a=Fe.objectStore.getPluginS3Dir(r.name);await Fe.objectStore.deleteFolder(Fe.objectStore.ObjectStoreBuckets.PLUGINS,a),await t.remove(e,r._rev),await Fe.events.plugin.deleted(r),await _l()}catch(r){let a=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${a}`)}}n(fN,"deletePlugin");async function mN(){let e=Fe.tenancy.getGlobalDB();try{let r=(await e.allDocs(Fe.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await xl(r)}catch(t){Fe.logging.logAlert("Unable to retrieve plugins for quota check",t)}}n(mN,"checkPluginQuotas");var ls={};F(ls,{fetch:()=>hN,fetchValues:()=>yN,isEncryptionKeyAvailable:()=>gN,isValid:()=>Vh,remove:()=>bN,update:()=>vN});var $h=require("@budibase/backend-core"),Un=require("@budibase/types");function gN(){return!!$h.env.ENCRYPTION_KEY}n(gN,"isEncryptionKeyAvailable");async function hN(){let e=await hr.get();return Object.keys(e.variables)}n(hN,"fetch");async function yN(e){let r=(await hr.get()).variables,a={};for(let[o,s]of Object.entries(r))switch(e){case Un.Environment.DEVELOPMENT:a[o]=s.development;break;case Un.Environment.PRODUCTION:default:a[o]=s.production;break}return a}n(yN,"fetchValues");async function Wh(e){if(!(await Wt.cache.getCachedLicense()).features.includes(Un.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await hr.get();r.variables=e(r.variables),await hr.update(r)}n(Wh,"changeValues");async function vN(e,t){if(Vh(e))await Wh(a=>(a[e]=t,a));else throw new Error("Variable name has characters that are not allowed")}n(vN,"update");async function bN(e){await Wh(t=>(delete t[e],t))}n(bN,"remove");function Vh(e){return/^[a-zA-Z0-9-_]+$/.test(e)}n(Vh,"isValid");var ps={};F(ps,{definitions:()=>CN,download:()=>ON,fetch:()=>RN,write:()=>AN});var st=require("@budibase/backend-core"),cs=require("@budibase/types");var Ne=require("@budibase/backend-core"),qt=require("@budibase/types");var Kh=require("memorystream"),Qh=new Ne.sql.Sql(qt.SqlClient.SQL_LITE);async function wN(e,t,r){let a={operation:qt.Operation.READ,table:Jr.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:qt.SortOrder.DESCENDING,type:qt.SortType.STRING}}},o=Qh._query(a);if(Array.isArray(o))throw new Error("Cannot execute multiple queries for audit log search");return{sql:o.sql,bindings:o.bindings}}n(wN,"getAuditLogSqlQuery");function IN(e){return`${Ne.DocumentType.AUDIT_LOG}${Ne.SEPARATOR}${e}${Ne.SEPARATOR}${Ne.utils.newid()}`}n(IN,"generateAuditLogID");async function Hh(e){e._id||(e._id=IN(e.timestamp)),e.type||(e.type=qt.AUDIT_LOG_TYPE);try{let r=await Ne.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){Ne.logging.logAlert("Failed to write audit log",t)}}n(Hh,"save");async function Ul(e,t,r){t||(t=1);let a=Ne.context.getAuditLogsDB();try{let o=10,s=await wN(e,t,o),i=Jr.searchTable(),l=Qh.convertJsonStringColumns(i,await a.sql(s.sql,s.bindings)),u;l.length>o&&(u=l.pop());let c={rows:l,hasNextPage:!!u};return c.hasNextPage&&(c.bookmark=t+1),c}catch(o){if(o.status===404&&!r?.isRetry)return await TN(),await jp(),await Ul(e,t,{isRetry:!0});throw o}}n(Ul,"searchSQL");async function TN(){let e=Ne.context.getAuditLogsDB(),r=(await e.allDocs(Ne.db.getDocParams(Ne.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(a=>a.doc).filter(a=>a&&!a.type).map(a=>({...a,type:qt.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}n(TN,"migrate");function Jh(e){let t=Ne.context.getAuditLogsDB(),r=new Kh,a=t.dump(r,{filter:n(s=>{let i=s;if(!i._id?.startsWith(Ne.DocumentType.AUDIT_LOG))return!1;let l=!0,u=n((c,d)=>{!c||c.length===0||(l=!!(l&&d&&c.includes(d)))},"matcher");if(u(e.userIds,i.userId),u(e.appIds,i.appId),u(e.events,i.event),(e.startDate||e.endDate)&&(l=l&&i.timestamp>=e.startDate&&i.timestamp<=e.endDate),e.fullSearch){let c=JSON.stringify(s);l=l&&c.includes(e.fullSearch)}return l},"filter")}),o=new Kh;return r.on("data",s=>{let i=JSON.parse(Buffer.from(s).toString());if(Array.isArray(i.docs)){let l="";for(let u of i.docs)l+=JSON.stringify(u)+`
|
|
39
|
-
`;o.write(l)}}),r.on("end",()=>{o.end()}),{promise:a,stream:o}}n(Jh,"dump");var Ln=require("@budibase/backend-core"),Fn=require("@budibase/string-templates"),us=require("@budibase/types");var _N=Ln.constants.MIN_VALID_DATE.toISOString(),xN=Ln.constants.MAX_VALID_DATE.toISOString();function Ll(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||_N,e.endDate=e.endDate||xN),e}n(Ll,"fillDates");async function Yh(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(a=>Ln.db.getProdWorkspaceID(a)));let t={};function r(a,o){o?.length&&(t.oneOf={...t.oneOf,[a]:o})}return n(r,"addStringParams"),r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=Ll(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}n(Yh,"getSearchFilters");function Fl(e,t,r){let a={_id:e,status:us.AuditLogResourceStatus.DELETED};switch(t){case"app":a.name=r?.appName;break;case"user":a.email=r?.email;break}return a}n(Fl,"deleted");function Bl(e){let t=(0,Fn.findHBSBlocks)(e);for(let r of t){let a=` "${r}"`;e=e.replace(e.includes(a)?a:` ${r}`,""),e=(0,Fn.processStringSync)(e,{})}return e}n(Bl,"removeTemplateStrings");function zh(e,t){let r=us.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let a=(0,Fn.processStringSync)(r,t);return a.includes('""')&&(a=Bl(r)),a}n(zh,"getEventFriendlyName");async function AN(e,t,r){if(!await Ko()||!st.utils.isAudited(e))return;let a=zh(e,t),o=new Date;r?.timestamp&&(o=new Date(r.timestamp));let s={timestamp:o.toISOString(),event:e,name:a,userId:r?.userId||cs.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){s.appId=st.db.getProdWorkspaceID(r.appId);let l=await st.cache.workspace.getWorkspaceMetadata(r.appId);"name"in l&&(i.appName=l.name)}if(r?.userId){let l=await st.users.getById(r?.userId);i.email=l.email}}catch(l){st.logging.logAlert("Failed to retrieve fallback information for audit log",l)}return s.fallback=i,await Hh(s)}n(AN,"write");async function EN(e){let t=e.map(l=>l.userId),a=e.filter(l=>l.appId).map(l=>st.db.getDevWorkspaceID(l.appId)),o=await st.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),s=await st.db.getWorkspacesByIDs([...new Set(a)]),i=[];for(let l of e){let u=o.find(y=>y?._id===l.userId),c=s.find(y=>st.db.isSameWorkspaceID(y?.appId,l.appId)),d={event:l.event,timestamp:l.timestamp,name:l.name,metadata:l.metadata,user:u||Fl(l.userId,"user",l.fallback)};l.appId&&(d.app=c||Fl(l.appId,"app",l.fallback)),i.push(d)}return i}n(EN,"enrich");async function RN(e){if(!await Ko())throw new Error("Audit logs not available - license required.");let t=await Yh(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await Ul(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await EN(r.rows)}}n(RN,"fetch");function ON(e){return e=Ll(e),Jh(e)}n(ON,"download");function CN(){let e=Object.entries(cs.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=Bl(r[1]);return t}n(CN,"definitions");var ds={};F(ds,{applications:()=>Wl,roles:()=>Gl,users:()=>jl});var jl={};F(jl,{roleCheck:()=>PN});function MN(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}n(MN,"removeRoles");async function PN(e,t){return await da()||MN(e,t),e}n(PN,"roleCheck");var Gl={};F(Gl,{assign:()=>kN,unAssign:()=>NN});var Bn=require("@budibase/backend-core");async function kN(e,t){if(!await da())throw new Error("Unable to assign roles - license required.");let r=await Dt.bulkGet(e);for(let a of r){if(t.role&&t.role.roleId){let o=Bn.db.getProdWorkspaceID(t.role.appId);a.roles[o]=t.role.roleId}if(t.appBuilder){let o=Bn.db.getProdWorkspaceID(t.appBuilder.appId),s=a.builder?.apps||[];a.builder={apps:s.concat([o])}}t.builder&&(a.builder={global:!0}),t.admin&&(a.admin={global:!0}),a.roles}await Dt.bulkUpdate(r)}n(kN,"assign");async function NN(e,t){if(!await da())throw new Error("Unable to un-assign roles - license required.");let r=await Dt.bulkGet(e);for(let a of r){if(t.role){let o=Bn.db.getProdWorkspaceID(t.role?.appId);a.roles[o]===t.role.roleId&&delete a.roles[o]}if(t.appBuilder&&a.builder?.apps){let o=Bn.db.getProdWorkspaceID(t.appBuilder.appId);a.builder.apps=a.builder.apps.filter(s=>s!==o)}t.builder&&a.builder&&delete a.builder,t.admin&&a.admin&&delete a.admin}await Dt.bulkUpdate(r)}n(NN,"unAssign");var Wl={};F(Wl,{buildExportFn:()=>UN,buildImportFn:()=>qN});var $l=require("@budibase/backend-core");var DN=n(e=>{if(e){if(e.appExport)return e.appExport;if(e.file)return e.file}},"ensureAppExportFile");function qN(e){return async(t,r)=>{await Qo()||t.throw(403,"Endpoint unavailable, enterprise license required."),DN(t.request.files)||t.throw(400,"Must provide app export file for import."),await $l.context.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}n(qN,"buildImportFn");function UN(e){return async(t,r)=>{await Qo()||t.throw(403,"Endpoint unavailable, enterprise license required.");let{encryptPassword:a,excludeRows:o}=t.request.body;await $l.context.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:a,excludeRows:o},t.query.appId=t.params.appId,await e(t),await r()})}}n(UN,"buildExportFn");var Ve=require("@budibase/backend-core"),We=require("@budibase/types"),ey=Ie(require("fs")),ty=require("path");var Vl=require("@budibase/backend-core");var Zh;function Xh(){Zh=new Vl.queue.BudibaseQueue(Vl.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}n(Xh,"init");function Ur(){return Zh}n(Ur,"getBackupQueue");async function Kl(e,t={}){return gt.storeWorkspaceBackupMetadata(e,t)}n(Kl,"storeWorkspaceBackupMetadata");function ry(e){let t=new Date().toISOString();switch(e){case We.BackupStatus.COMPLETE:case We.BackupStatus.FAILED:return{timestamp:t,finishedAt:t};case We.BackupStatus.STARTED:return{timestamp:t,startedAt:t};case We.BackupStatus.PENDING:return{timestamp:t,createdAt:t}}}n(ry,"getTimestamps");async function LN(e,t,r,a){let o=await fs(e);return await gt.storeWorkspaceBackupMetadata({...o,...ry(t),contents:r,status:t,type:We.BackupType.BACKUP},{filename:a,docId:e})}n(LN,"updateBackupStatus");async function FN(e,t,r){let a=await fs(e);return await gt.storeWorkspaceBackupMetadata({...a,...ry(r),status:r,type:We.BackupType.RESTORE,trigger:We.BackupTrigger.MANUAL},{docId:e,docRev:t})}n(FN,"updateRestoreStatus");async function fs(e){return gt.getWorkspaceBackupMetadata(e)}n(fs,"getWorkspaceBackup");async function BN(e,t){return gt.updateWorkspaceBackupMetadata(e,t)}n(BN,"updateWorkspaceBackup");async function ay(e){let t=await gt.getWorkspaceBackupMetadata(e);return t.filename&&await Ve.objectStore.deleteFile(Ve.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),gt.deleteWorkspaceBackupMetadata(e)}n(ay,"deleteWorkspaceBackup");async function jN(e){let t=[];for(let r of e)try{await ay(r),t.push({backupId:r,success:!0})}catch(a){t.push({backupId:r,success:!1,error:a instanceof Error?a.message:"Unknown error"})}return t}n(jN,"deleteWorkspaceBackups");async function GN(e,t){return gt.fetchWorkspaceBackups(e,t)}n(GN,"fetchWorkspaceBackups");async function ny(e){let t=await gt.getWorkspaceBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let{stream:r}=await Ve.objectStore.getReadStream(Ve.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}n(ny,"getBackupDownloadStream");async function $N(e){let{stream:t}=await ny(e),r=(0,ty.join)(Ve.objectStore.budibaseTempDir(),Ve.utils.newid()),a=ey.default.createWriteStream(r);return new Promise((o,s)=>{t.on("error",s),a.on("error",s),t.pipe(a).on("close",()=>o(r))})}n($N,"downloadWorkspaceBackup");async function WN(e,t,r={}){let a;try{a=await Kl({appId:e,trigger:t,timestamp:new Date().toISOString(),status:We.BackupStatus.PENDING,type:We.BackupType.BACKUP,...r})}catch(o){if(o.status===409)return;throw o}return await Ur().add({docId:a.id,docRev:a.rev,appId:e,export:{trigger:t,...r}}),await Ve.events.backup.workspaceBackupTriggered(e,a.id,We.BackupType.BACKUP,t,r?.name),a.id}n(WN,"triggerWorkspaceBackup");async function VN(e,t,r,a){let o=await fs(t),s;try{s=await Kl({appId:e,timestamp:new Date().toISOString(),status:We.BackupStatus.PENDING,type:We.BackupType.RESTORE,createdBy:a})}catch(i){if(i?.status===409)return;throw i}return await Ur().add({appId:e,docId:s.id,docRev:s.rev,import:{nameForBackup:r,backupId:t,createdBy:a}}),{restoreId:s.id,metadata:o}}n(VN,"triggerWorkspaceRestore");async function KN(e,t,r){let a=Ve.db.getProdWorkspaceID(e);await Ve.context.doInWorkspaceContext(a,async()=>{let o=Ve.context.getProdWorkspaceDB();if(!await o.exists())return;let i=await o.tryGet(We.DocumentType.WORKSPACE_METADATA);i&&(i.backupErrors||(i.backupErrors={}),i.backupErrors[t]||(i.backupErrors[t]=[]),i.backupErrors[t].push(r),await o.put(i),await Ve.cache.workspace.invalidateWorkspaceMetadata(i.appId,i))})}n(KN,"trackBackupError");var QN={isEnabled:hl,triggerWorkspaceRestore:ze(VN),triggerWorkspaceBackup:ze(WN),getBackupDownloadStream:ze(ny),downloadWorkspaceBackup:ze($N),fetchWorkspaceBackups:ze(GN),storeWorkspaceBackupMetadata:ze(Kl),updateBackupStatus:ze(LN),updateRestoreStatus:ze(FN),getWorkspaceBackup:ze(fs),updateWorkspaceBackup:ze(BN),deleteWorkspaceBackup:ze(ay),deleteWorkspaceBackups:ze(jN),trackBackupError:ze(KN)},xt=QN;var Yl={};F(Yl,{init:()=>Hl});var z=require("@budibase/backend-core"),Ut=require("@budibase/types"),ya=Ie(require("fs"));async function Hl(e){Ur().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),XN(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),ZN(t,e)}catch(a){z.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,a)}})}n(Hl,"init");async function HN(e){await z.db.getDB(e,{skip_setup:!0}).destroy()}n(HN,"removeExistingApp");var oy=1e3;async function ms(e){for(let t=0;t<e.length;t+=oy)await z.objectStore.deleteFiles(z.objectStore.ObjectStoreBuckets.APPS,e.slice(t,t+oy))}n(ms,"deleteAppFiles");async function Jl(e){let t=[];for await(let r of z.objectStore.listAllObjects(z.objectStore.ObjectStoreBuckets.APPS,e))r.Key&&t.push(r.Key);return t}n(Jl,"listAppFiles");async function JN(e){let t=z.db.getProdWorkspaceID(e),r=await Jl(`${t}/`);r.length&&await ms(r)}n(JN,"clearWorkspaceFiles");async function Ql(e,t){let{stream:r}=await z.objectStore.getReadStream(z.objectStore.ObjectStoreBuckets.APPS,e);await z.objectStore.streamUpload({bucket:z.objectStore.ObjectStoreBuckets.APPS,filename:t,stream:r})}n(Ql,"copyAppFile");async function sy(e,t){let r=new Map;for(let o of t)r.set(o.targetKey,o.rollbackKey);let a=[];for(let o of e){let s=r.get(o);s?await Ql(s,o):a.push(o)}a.length&&await ms(a)}n(sy,"rollbackPromotedWorkspaceFiles");async function YN(e,t){let r=z.db.getProdWorkspaceID(e),a=z.db.getProdWorkspaceID(t),o=`${r}/`,s=`${a}/`,i=`${o}__restore_rollback/${Date.now()}/`,l=await Jl(o),u=new Set,c=[];try{for(let d of l){let y=d.startsWith(o)?d.slice(o.length):d,h=`${s}${y}`;if(await z.objectStore.objectExists(z.objectStore.ObjectStoreBuckets.APPS,h)){let R=`${i}${y}`;await Ql(h,R),c.push({targetKey:h,rollbackKey:R})}await Ql(d,h),u.add(h)}}catch(d){if(u.size)try{await sy([...u],c)}catch(y){console.log("Failed to rollback partially promoted restore files:",y)}throw d}return{sourceFileKeys:l,targetFileKeys:[...u],rollbackFiles:c}}n(YN,"promoteWorkspaceFiles");async function zN(e,t,r){let o=`${z.db.getProdWorkspaceID(r)}/`,s=await Jl(o),i=new Set(t),l=s.filter(u=>!i.has(u));l.length&&await ms(l),e.length&&await ms(e)}n(zN,"cleanupPromotedWorkspaceFiles");async function iy(e,t,r,a){let o=z.db.getDevWorkspaceID(r),s=z.db.getProdWorkspaceID(r),i=new Date().toISOString(),l=n(async(u,c)=>{a?.doc?await xt.updateBackupStatus(a.doc.id,u,c?.contents,c?.filename):await xt.storeWorkspaceBackupMetadata({appId:s,timestamp:i,trigger:e,status:u,name:a?.name,type:Ut.BackupType.BACKUP,contents:c?.contents,createdBy:a?.createdBy},{filename:c?.filename})},"updateMetadata");try{let u=await a.processing.exportWorkspaceFn(o,{tar:!0}),c=await a.processing.statsFn(o),d=`${s}/backup-${i}.tar.gz`,y=z.objectStore.ObjectStoreBuckets.BACKUPS,h=ya.default.createReadStream(u);await z.objectStore.streamUpload({bucket:y,filename:d,stream:h,extra:{type:"application/gzip",metadata:{name:a?.name,trigger:e,timestamp:i,appId:s}}}),await l(Ut.BackupStatus.COMPLETE,{filename:d,contents:c}),ya.default.existsSync(u)&&ya.default.rmSync(u)}catch(u){z.logging.logAlert("App backup error",u),await l(Ut.BackupStatus.FAILED);let c=a?.doc?.id||`backup-${i}`,d=u instanceof Error?u.message:String(u);await xt.trackBackupError(s,c,`Backup export failed: ${d}`)}}n(iy,"runBackup");async function ZN(e,t){let r=e.data,a=r.appId,o=r.import.backupId,s=r.import.nameForBackup,i=r.import.createdBy,l=z.tenancy.getTenantIDFromWorkspaceID(a);return z.tenancy.doInTenant(l,async()=>{let u=z.db.getDevWorkspaceID(a),c=`${u}_temp_${Date.now()}`,{rev:d}=await xt.updateRestoreStatus(r.docId,r.docRev,Ut.BackupStatus.STARTED);await iy(Ut.BackupTrigger.RESTORING,l,a,{processing:t,createdBy:i,name:s});let y=await xt.downloadWorkspaceBackup(o),h=Ut.BackupStatus.COMPLETE,b=null;try{await t.importWorkspaceFn(u,z.db.getDB(c),{file:{type:"application/gzip",path:y},key:y},{objectStoreAppId:c,preserveLiteLLMConfig:!0}),b=await YN(c,u),await HN(u),await new z.db.Replication({source:c,target:u}).replicate();try{await zN(b.sourceFileKeys,b.targetFileKeys,u)}catch(R){console.log("Failed to cleanup promoted restore files:",R)}}catch(R){if(b)try{await sy(b.targetFileKeys,b.rollbackFiles)}catch(T){console.log("Failed to rollback promoted restore files:",T)}z.logging.logAlert("App restore error",R),h=Ut.BackupStatus.FAILED;let w=R instanceof Error?R.message:String(R);await xt.trackBackupError(a,o,`Backup restore failed: ${w}`)}finally{try{await z.db.getDB(c,{skip_setup:!0}).destroy()}catch{}try{await JN(c)}catch{}}await xt.updateRestoreStatus(r.docId,d,h),ya.default.existsSync(y)&&ya.default.rmSync(y,{force:!0})})}n(ZN,"importProcessor");async function XN(e,t){let r=e.data,a=r.appId,o=r.export.trigger,s=r.export.name,i=z.tenancy.getTenantIDFromWorkspaceID(a);await z.tenancy.doInTenant(i,async()=>{try{let{rev:l}=await xt.updateBackupStatus(r.docId,Ut.BackupStatus.STARTED);return iy(o,i,a,{processing:t,doc:{id:r.docId,rev:l},name:s})}catch(l){z.logging.logAlert("App backup error",l);let u=l instanceof Error?l.message:String(l);await xt.trackBackupError(a,r.docId,`Backup export failed: ${u}`)}})}n(XN,"exportProcessor");var eD=n(async e=>{Xh(),await Hl(e.processing)},"init"),jn={...xt,processing:Yl,init:eD,getBackupQueue:Ur};var ly=n(async e=>{e.backups&&await jn.init(e.backups)},"init");var Es={};F(Es,{create:()=>QG,find:()=>KG,get:()=>VG,handleDisable:()=>zG,remove:()=>JG,update:()=>HG});var MI=Ie($u()),lt=require("@budibase/backend-core");var PI=require("@budibase/types");async function VG(e){let t=lt.tenancy.getGlobalDB(),r=new lt.db.QueryBuilder(t.name,PI.SearchIndex.USER);r.setIndexBuilder(lt.db.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[o,s]of Object.entries(e.filters?.equal??{}))r.addEqual(o,s);r.setSort("_id"),r.setSkip(e.skip);let a=await r.run();return{users:a.rows,total:a.totalRows}}n(VG,"get");async function KG(e){return await lt.users.getById(e)}n(KG,"find");async function QG(e){let t=await Dt.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new lt.HTTPError("User is already synched",409);e={...t,scimInfo:(0,MI.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Dt.save(e,{requirePassword:!1})}n(QG,"create");async function HG(e,t){return await Dt.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}n(HG,"update");async function JG(e){return await Dt.destroy(e)}n(JG,"remove");async function YG(){return(await lt.users.getAllUsers()).filter(t=>t.scimInfo?.isSync)}n(YG,"getAllSCIMUsers");async function zG(e){let t=await YG();if(t.length)switch(e){case"remove":await lt.users.UserDB.bulkDelete(t.map(r=>({userId:r._id,email:r.email})));break;case"convert":{let r=await Promise.all(t.map(async a=>{let o={...a};return delete o.scimInfo,delete o.ssoId,o.password=await lt.utils.hash(crypto.randomUUID()),o}));await lt.users.bulkUpdateGlobalUsers(r);break}}}n(zG,"handleDisable");var Rs={};F(Rs,{create:()=>ZG});var kI=Ie($u());var NI=require("@budibase/backend-core");async function ZG(e){let t=await wi(e.name),r;if(!t)r=(await Nt.save(e)).id;else{if(t.scimInfo?.isSync)throw new NI.HTTPError("Group is already synched",409);r=t._id,t.users.length&&await Nt.removeUsers(r,t.users.map(o=>o._id)),t.scimInfo=(0,kI.default)(t.scimInfo,e.scimInfo),await Nt.save(t)}return await Nt.get(r)}n(ZG,"create");var Fr={};F(Fr,{logRequest:()=>t$,logResponse:()=>r$});var Lt=require("@budibase/backend-core"),qI=Ie(DI());var{DocWritethrough:XG}=Lt.cache.docWritethrough;function e$(){return`${Lt.db.DocumentType.SCIM_LOG}${Lt.db.SEPARATOR}${(0,qI.default)().format("YYYYMMDD")}`}n(e$,"getLogDocId");var UI=n(()=>{let e=Lt.context.getScimDBName();return new XG(Lt.db.getDB(e),e$())},"getDB");async function t$(e){Lt.logging.logWarn("SCIM request log",e);let t=Date.now().toString();return await UI().patch({[`${t}_request`]:{ts:new Date().toISOString(),...e}}),t}n(t$,"logRequest");async function r$(e,t){Lt.logging.logWarn("SCIM response",t),await UI().patch({[`${e}_response`]:{ts:new Date().toISOString(),...t}})}n(r$,"logResponse");var zu={};F(zu,{doInScimContext:()=>s$,feature:()=>Qu,internalGroupOnly:()=>c$,licenseAuth:()=>Yu,licensing:()=>LI,requireSCIM:()=>i$,scimGroupOnly:()=>u$,scimUserOnly:()=>l$});var Sr=require("@budibase/backend-core");var Os=require("@budibase/types");var a$=n((e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(Sr.env.SELF_HOSTED&&Sr.env.DEFAULT_LICENSE)return t.user.license=Ii,r();t.user.license=await Wt.cache.getCachedLicense(),e.checkUsersLimit&&(Sr.utils.isServingApp(t)||Sr.utils.isServingBuilder(t)||Sr.utils.isServingBuilderPreview(t)||Sr.utils.isPublicApiRequest(t))&&await Ht.usageLimitIsExceeded({name:Os.StaticQuotaName.USERS,type:Os.QuotaUsageType.STATIC,usageChange:0})}return r()},"licensing"),LI=a$;var Qu={};F(Qu,{requireFeature:()=>n$,requireFeatures:()=>o$});var n$=n(e=>async(t,r)=>{await Vo(e),await r()},"requireFeature"),o$=n((...e)=>async(t,r)=>{await gl(e),await r()},"requireFeatures");var Cs=require("@budibase/backend-core");var s$=n(async(e,t)=>{let r;return Cs.env.ENABLE_SCIM_LOGGER&&(r=await Fr.logRequest({...e.request.toJSON(),body:e.request.body})),await Cs.context.doInScimContext(async()=>{let a=await t();return r&&await Fr.logResponse(r,{...e.response.toJSON(),body:e.response.body}),a})},"doInScimContext");var i$=n(async(e,t)=>{await bl(),await t()},"requireSCIM");var FI=require("@budibase/backend-core");var l$=n(e=>Hu(FI.users.getById,e,!0),"scimUserOnly"),u$=n(e=>Hu(oe.get,e,!0),"scimGroupOnly"),c$=n(e=>Hu(oe.get,e,!1),"internalGroupOnly");function Hu(e,t,r){return async(a,o)=>{let s=a.params[t];return typeof s!="string"&&a.throw(404),!!(await e(s)).scimInfo?.isSync!==r&&a.throw(404),o()}}n(Hu,"scimSyncChecks");var Br=require("@budibase/backend-core");var Ju=require("dd-trace");async function Yu(e,t){await Ju.tracer.trace("licenseAuth",async r=>{let a=e.request.headers[Br.constants.Header.LICENSE_KEY]||Br.utils.getBearerToken(e);Array.isArray(a)&&(a=a[0]),a||e.throw(403,"License key not provided");let o=await ul(a);o||(r.addTags({licenseFound:!1}),e.throw(403,"License not found or invalid")),o.tenantId||e.throw(403,"License does not have a tenant ID"),Ju.tracer.setUser({id:"anonymous",tenantId:o.tenantId}),await Br.context.doInSelfHostTenantUsingCloud(o.tenantId,async()=>{await Br.context.doInLicenseContext(o,async()=>{await t()})})})}n(Yu,"default");var ec={};F(ec,{group:()=>Xu,user:()=>Zu});var Zu={};F(Zu,{fromScimUser:()=>g$,toScimUserResponse:()=>d$,userFilters:()=>h$});var BI=require("@budibase/backend-core"),jI=require("@budibase/shared-core"),Ms=require("@budibase/types"),GI=require("scim2-parse-filter");var{unreachable:p$}=jI.utils,d$=n(e=>{let{isSync:t,roles:r,...a}=e.scimInfo||{},o={...a,schemas:["urn:ietf:params:scim:schemas:core:2.0:User"],id:e._id,meta:{resourceType:"User",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},active:e.status===Ms.UserStatus.ACTIVE};(e.firstName||e.lastName)&&(o.name={formatted:[e.firstName,e.lastName].filter(i=>i).join(" "),familyName:e.lastName,givenName:e.firstName});let s="urn:ietf:params:scim:schemas:extension:enterprise:2.0:User";if(o[s]?.manager){let i=o[s].manager;typeof i=="string"&&(o[s].manager={value:i})}return o},"toScimUserResponse"),f$=n(e=>!!e?.id,"isScimUserResponse");function m$(e){if(BI.utils.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}n(m$,"tryGetEmail");var g$=n((e,t={})=>{let r=f$(e)?e:void 0,a=m$(e);if(!a)throw new Error("Email is required");let o;switch(e.active){case"True":case"true":case!0:o=!0;break;case"False":case"false":case!1:o=!1;break;default:p$(e.active)}let s,i;return e.name?.givenName?(s=e.name?.givenName,i=e.name?.familyName):s=e.displayName,{tenantId:"",_id:r?.id,userId:r?.id,email:a,firstName:s,lastName:i,scimInfo:{...e,isSync:!0},roles:t,status:o?Ms.UserStatus.ACTIVE:Ms.UserStatus.INACTIVE,createdAt:r?.meta.created.getTime(),updatedAt:r?.meta.lastModified.toISOString()}},"fromScimUser"),h$=n(e=>{let t={equal:{}},r=(0,GI.parse)(e);function a(o){switch(o.op){case"eq":{let s=o.attrPath,i;s==="emails.value"?i="email":i=`scimInfo.${s}`,t.equal[i]=o.compValue;break}case"and":for(let s of o.filters)a(s);break;default:console.warn("Filter not handled",{filter:o})}}return n(a,"parseFilters"),a(r),t},"userFilters");var Xu={};F(Xu,{fromScimGroup:()=>b$,toScimGroupResponse:()=>y$});var y$=n(e=>({schemas:["urn:ietf:params:scim:schemas:core:2.0:Group"],id:e._id,externalId:e.scimInfo.externalId,meta:{resourceType:"Group",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},displayName:e.name,members:e.users?.map(t=>({value:t._id}))}),"toScimGroupResponse"),v$=n(e=>!!e?.id,"isScimGroup"),b$=n(e=>{let t=v$(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 ep={};F(ep,{LLMRequest:()=>Ke,TableGeneration:()=>Xc,agentHistoryTitleSystemPrompt:()=>XK,agentSystemPrompt:()=>ZK,aiColumnSchemas:()=>zc,aiTableResponseToTableSchema:()=>Qc,appendAIColumns:()=>Hc,classifyText:()=>jK,cleanData:()=>GK,composeAutomationAgentSystemPrompt:()=>JK,composeAutomationAgentToolGuidelines:()=>YK,generateAIColumns:()=>Vc,generateAgentInstructionsPrompt:()=>WK,generateCronExpression:()=>$K,generateData:()=>Kc,generateJs:()=>HK,generateTables:()=>Wc,generationStructure:()=>Yc,normalizeContentType:()=>rQ,parseResponseFormat:()=>hA,sanitiseToolName:()=>tQ,searchWeb:()=>QK,sentimentAnalysis:()=>KK,summarizeText:()=>BK,tableDataStructuredOutput:()=>Zc,translate:()=>VK});var ri=require("@budibase/backend-core"),bA=require("@budibase/shared-core");var yT="vercel.ai.error",w$=Symbol.for(yT),$I,WI,M=class vT extends(WI=Error,$I=w$,WI){static{n(this,"_AISDKError")}constructor({name:t,message:r,cause:a}){super(r),this[$I]=!0,this.name=t,this.cause=a}static isInstance(t){return vT.hasMarker(t,yT)}static hasMarker(t,r){let a=Symbol.for(r);return t!=null&&typeof t=="object"&&a in t&&typeof t[a]=="boolean"&&t[a]===!0}},bT="AI_APICallError",wT=`vercel.ai.error.${bT}`,I$=Symbol.for(wT),VI,KI,me=class extends(KI=M,VI=I$,KI){static{n(this,"APICallError")}constructor({message:e,url:t,requestBodyValues:r,statusCode:a,responseHeaders:o,responseBody:s,cause:i,isRetryable:l=a!=null&&(a===408||a===409||a===429||a>=500),data:u}){super({name:bT,message:e,cause:i}),this[VI]=!0,this.url=t,this.requestBodyValues=r,this.statusCode=a,this.responseHeaders=o,this.responseBody=s,this.isRetryable=l,this.data=u}static isInstance(e){return M.hasMarker(e,wT)}},IT="AI_EmptyResponseBodyError",TT=`vercel.ai.error.${IT}`,T$=Symbol.for(TT),QI,HI,ST=class extends(HI=M,QI=T$,HI){static{n(this,"EmptyResponseBodyError")}constructor({message:e="Empty response body"}={}){super({name:IT,message:e}),this[QI]=!0}static isInstance(e){return M.hasMarker(e,TT)}};function _r(e){return e==null?"unknown error":typeof e=="string"?e:e instanceof Error?e.message:JSON.stringify(e)}n(_r,"getErrorMessage");var _T="AI_InvalidArgumentError",xT=`vercel.ai.error.${_T}`,S$=Symbol.for(xT),JI,YI,AT=class extends(YI=M,JI=S$,YI){static{n(this,"InvalidArgumentError")}constructor({message:e,cause:t,argument:r}){super({name:_T,message:e,cause:t}),this[JI]=!0,this.argument=r}static isInstance(e){return M.hasMarker(e,xT)}},ET="AI_InvalidPromptError",RT=`vercel.ai.error.${ET}`,_$=Symbol.for(RT),zI,ZI,jr=class extends(ZI=M,zI=_$,ZI){static{n(this,"InvalidPromptError")}constructor({prompt:e,message:t,cause:r}){super({name:ET,message:`Invalid prompt: ${t}`,cause:r}),this[zI]=!0,this.prompt=e}static isInstance(e){return M.hasMarker(e,RT)}},OT="AI_InvalidResponseDataError",CT=`vercel.ai.error.${OT}`,x$=Symbol.for(CT),XI,eT,mte=class extends(eT=M,XI=x$,eT){static{n(this,"InvalidResponseDataError")}constructor({data:e,message:t=`Invalid response data: ${JSON.stringify(e)}.`}){super({name:OT,message:t}),this[XI]=!0,this.data=e}static isInstance(e){return M.hasMarker(e,CT)}},MT="AI_JSONParseError",PT=`vercel.ai.error.${MT}`,A$=Symbol.for(PT),tT,rT,Vn=class extends(rT=M,tT=A$,rT){static{n(this,"JSONParseError")}constructor({text:e,cause:t}){super({name:MT,message:`JSON parsing failed: Text: ${e}.
|
|
39
|
+
`;o.write(l)}}),r.on("end",()=>{o.end()}),{promise:a,stream:o}}n(Jh,"dump");var Ln=require("@budibase/backend-core"),Fn=require("@budibase/string-templates"),us=require("@budibase/types");var _N=Ln.constants.MIN_VALID_DATE.toISOString(),xN=Ln.constants.MAX_VALID_DATE.toISOString();function Ll(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||_N,e.endDate=e.endDate||xN),e}n(Ll,"fillDates");async function Yh(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(a=>Ln.db.getProdWorkspaceID(a)));let t={};function r(a,o){o?.length&&(t.oneOf={...t.oneOf,[a]:o})}return n(r,"addStringParams"),r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=Ll(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}n(Yh,"getSearchFilters");function Fl(e,t,r){let a={_id:e,status:us.AuditLogResourceStatus.DELETED};switch(t){case"app":a.name=r?.appName;break;case"user":a.email=r?.email;break}return a}n(Fl,"deleted");function Bl(e){let t=(0,Fn.findHBSBlocks)(e);for(let r of t){let a=` "${r}"`;e=e.replace(e.includes(a)?a:` ${r}`,""),e=(0,Fn.processStringSync)(e,{})}return e}n(Bl,"removeTemplateStrings");function zh(e,t){let r=us.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let a=(0,Fn.processStringSync)(r,t);return a.includes('""')&&(a=Bl(r)),a}n(zh,"getEventFriendlyName");async function AN(e,t,r){if(!await Ko()||!st.utils.isAudited(e))return;let a=zh(e,t),o=new Date;r?.timestamp&&(o=new Date(r.timestamp));let s={timestamp:o.toISOString(),event:e,name:a,userId:r?.userId||cs.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){s.appId=st.db.getProdWorkspaceID(r.appId);let l=await st.cache.workspace.getWorkspaceMetadata(r.appId);"name"in l&&(i.appName=l.name)}if(r?.userId){let l=await st.users.getById(r?.userId);i.email=l.email}}catch(l){st.logging.logAlert("Failed to retrieve fallback information for audit log",l)}return s.fallback=i,await Hh(s)}n(AN,"write");async function EN(e){let t=e.map(l=>l.userId),a=e.filter(l=>l.appId).map(l=>st.db.getDevWorkspaceID(l.appId)),o=await st.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),s=await st.db.getWorkspacesByIDs([...new Set(a)]),i=[];for(let l of e){let u=o.find(y=>y?._id===l.userId),c=s.find(y=>st.db.isSameWorkspaceID(y?.appId,l.appId)),d={event:l.event,timestamp:l.timestamp,name:l.name,metadata:l.metadata,user:u||Fl(l.userId,"user",l.fallback)};l.appId&&(d.app=c||Fl(l.appId,"app",l.fallback)),i.push(d)}return i}n(EN,"enrich");async function RN(e){if(!await Ko())throw new Error("Audit logs not available - license required.");let t=await Yh(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await Ul(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await EN(r.rows)}}n(RN,"fetch");function ON(e){return e=Ll(e),Jh(e)}n(ON,"download");function CN(){let e=Object.entries(cs.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=Bl(r[1]);return t}n(CN,"definitions");var ds={};F(ds,{applications:()=>Wl,roles:()=>Gl,users:()=>jl});var jl={};F(jl,{roleCheck:()=>PN});function MN(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}n(MN,"removeRoles");async function PN(e,t){return await da()||MN(e,t),e}n(PN,"roleCheck");var Gl={};F(Gl,{assign:()=>kN,unAssign:()=>NN});var Bn=require("@budibase/backend-core");async function kN(e,t){if(!await da())throw new Error("Unable to assign roles - license required.");let r=await Dt.bulkGet(e);for(let a of r){if(t.role&&t.role.roleId){let o=Bn.db.getProdWorkspaceID(t.role.appId);a.roles[o]=t.role.roleId}if(t.appBuilder){let o=Bn.db.getProdWorkspaceID(t.appBuilder.appId),s=a.builder?.apps||[];a.builder={apps:s.concat([o])}}t.builder&&(a.builder={global:!0}),t.admin&&(a.admin={global:!0}),a.roles}await Dt.bulkUpdate(r)}n(kN,"assign");async function NN(e,t){if(!await da())throw new Error("Unable to un-assign roles - license required.");let r=await Dt.bulkGet(e);for(let a of r){if(t.role){let o=Bn.db.getProdWorkspaceID(t.role?.appId);a.roles[o]===t.role.roleId&&delete a.roles[o]}if(t.appBuilder&&a.builder?.apps){let o=Bn.db.getProdWorkspaceID(t.appBuilder.appId);a.builder.apps=a.builder.apps.filter(s=>s!==o)}t.builder&&a.builder&&delete a.builder,t.admin&&a.admin&&delete a.admin}await Dt.bulkUpdate(r)}n(NN,"unAssign");var Wl={};F(Wl,{buildExportFn:()=>UN,buildImportFn:()=>qN});var $l=require("@budibase/backend-core");var DN=n(e=>{if(e){if(e.appExport)return e.appExport;if(e.file)return e.file}},"ensureAppExportFile");function qN(e){return async(t,r)=>{await Qo()||t.throw(403,"Endpoint unavailable, enterprise license required."),DN(t.request.files)||t.throw(400,"Must provide app export file for import."),await $l.context.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}n(qN,"buildImportFn");function UN(e){return async(t,r)=>{await Qo()||t.throw(403,"Endpoint unavailable, enterprise license required.");let{encryptPassword:a,excludeRows:o}=t.request.body;await $l.context.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:a,excludeRows:o},t.query.appId=t.params.appId,await e(t),await r()})}}n(UN,"buildExportFn");var Ve=require("@budibase/backend-core"),We=require("@budibase/types"),ey=Ie(require("fs")),ty=require("path");var Vl=require("@budibase/backend-core");var Zh;function Xh(){Zh=new Vl.queue.BudibaseQueue(Vl.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}n(Xh,"init");function Ur(){return Zh}n(Ur,"getBackupQueue");async function Kl(e,t={}){return gt.storeWorkspaceBackupMetadata(e,t)}n(Kl,"storeWorkspaceBackupMetadata");function ry(e){let t=new Date().toISOString();switch(e){case We.BackupStatus.COMPLETE:case We.BackupStatus.FAILED:return{timestamp:t,finishedAt:t};case We.BackupStatus.STARTED:return{timestamp:t,startedAt:t};case We.BackupStatus.PENDING:return{timestamp:t,createdAt:t}}}n(ry,"getTimestamps");async function LN(e,t,r,a){let o=await fs(e);return await gt.storeWorkspaceBackupMetadata({...o,...ry(t),contents:r,status:t,type:We.BackupType.BACKUP},{filename:a,docId:e})}n(LN,"updateBackupStatus");async function FN(e,t,r){let a=await fs(e);return await gt.storeWorkspaceBackupMetadata({...a,...ry(r),status:r,type:We.BackupType.RESTORE,trigger:We.BackupTrigger.MANUAL},{docId:e,docRev:t})}n(FN,"updateRestoreStatus");async function fs(e){return gt.getWorkspaceBackupMetadata(e)}n(fs,"getWorkspaceBackup");async function BN(e,t){return gt.updateWorkspaceBackupMetadata(e,t)}n(BN,"updateWorkspaceBackup");async function ay(e){let t=await gt.getWorkspaceBackupMetadata(e);return t.filename&&await Ve.objectStore.deleteFile(Ve.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),gt.deleteWorkspaceBackupMetadata(e)}n(ay,"deleteWorkspaceBackup");async function jN(e){let t=[];for(let r of e)try{await ay(r),t.push({backupId:r,success:!0})}catch(a){t.push({backupId:r,success:!1,error:a instanceof Error?a.message:"Unknown error"})}return t}n(jN,"deleteWorkspaceBackups");async function GN(e,t){return gt.fetchWorkspaceBackups(e,t)}n(GN,"fetchWorkspaceBackups");async function ny(e){let t=await gt.getWorkspaceBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let{stream:r}=await Ve.objectStore.getReadStream(Ve.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}n(ny,"getBackupDownloadStream");async function $N(e){let{stream:t}=await ny(e),r=(0,ty.join)(Ve.objectStore.budibaseTempDir(),Ve.utils.newid()),a=ey.default.createWriteStream(r);return new Promise((o,s)=>{t.on("error",s),a.on("error",s),t.pipe(a).on("close",()=>o(r))})}n($N,"downloadWorkspaceBackup");async function WN(e,t,r={}){let a;try{a=await Kl({appId:e,trigger:t,timestamp:new Date().toISOString(),status:We.BackupStatus.PENDING,type:We.BackupType.BACKUP,...r})}catch(o){if(o.status===409)return;throw o}return await Ur().add({docId:a.id,docRev:a.rev,appId:e,export:{trigger:t,...r}}),await Ve.events.backup.workspaceBackupTriggered(e,a.id,We.BackupType.BACKUP,t,r?.name),a.id}n(WN,"triggerWorkspaceBackup");async function VN(e,t,r,a){let o=await fs(t),s;try{s=await Kl({appId:e,timestamp:new Date().toISOString(),status:We.BackupStatus.PENDING,type:We.BackupType.RESTORE,createdBy:a})}catch(i){if(i?.status===409)return;throw i}return await Ur().add({appId:e,docId:s.id,docRev:s.rev,import:{nameForBackup:r,backupId:t,createdBy:a}}),{restoreId:s.id,metadata:o}}n(VN,"triggerWorkspaceRestore");async function KN(e,t,r){let a=Ve.db.getProdWorkspaceID(e);await Ve.context.doInWorkspaceContext(a,async()=>{let o=Ve.context.getProdWorkspaceDB();if(!await o.exists())return;let i=await o.tryGet(We.DocumentType.WORKSPACE_METADATA);i&&(i.backupErrors||(i.backupErrors={}),i.backupErrors[t]||(i.backupErrors[t]=[]),i.backupErrors[t].push(r),await o.put(i),await Ve.cache.workspace.invalidateWorkspaceMetadata(i.appId,i))})}n(KN,"trackBackupError");var QN={isEnabled:hl,triggerWorkspaceRestore:ze(VN),triggerWorkspaceBackup:ze(WN),getBackupDownloadStream:ze(ny),downloadWorkspaceBackup:ze($N),fetchWorkspaceBackups:ze(GN),storeWorkspaceBackupMetadata:ze(Kl),updateBackupStatus:ze(LN),updateRestoreStatus:ze(FN),getWorkspaceBackup:ze(fs),updateWorkspaceBackup:ze(BN),deleteWorkspaceBackup:ze(ay),deleteWorkspaceBackups:ze(jN),trackBackupError:ze(KN)},xt=QN;var Yl={};F(Yl,{init:()=>Hl});var z=require("@budibase/backend-core"),Ut=require("@budibase/types"),ya=Ie(require("fs"));async function Hl(e){Ur().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),XN(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),ZN(t,e)}catch(a){z.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,a)}})}n(Hl,"init");async function HN(e){await z.db.getDB(e,{skip_setup:!0}).destroy()}n(HN,"removeExistingApp");var oy=1e3;async function ms(e){for(let t=0;t<e.length;t+=oy)await z.objectStore.deleteFiles(z.objectStore.ObjectStoreBuckets.APPS,e.slice(t,t+oy))}n(ms,"deleteAppFiles");async function Jl(e){let t=[];for await(let r of z.objectStore.listAllObjects(z.objectStore.ObjectStoreBuckets.APPS,e))r.Key&&t.push(r.Key);return t}n(Jl,"listAppFiles");async function JN(e){let t=z.db.getProdWorkspaceID(e),r=await Jl(`${t}/`);r.length&&await ms(r)}n(JN,"clearWorkspaceFiles");async function Ql(e,t){let{stream:r}=await z.objectStore.getReadStream(z.objectStore.ObjectStoreBuckets.APPS,e);await z.objectStore.streamUpload({bucket:z.objectStore.ObjectStoreBuckets.APPS,filename:t,stream:r})}n(Ql,"copyAppFile");async function sy(e,t){let r=new Map;for(let o of t)r.set(o.targetKey,o.rollbackKey);let a=[];for(let o of e){let s=r.get(o);s?await Ql(s,o):a.push(o)}a.length&&await ms(a)}n(sy,"rollbackPromotedWorkspaceFiles");async function YN(e,t){let r=z.db.getProdWorkspaceID(e),a=z.db.getProdWorkspaceID(t),o=`${r}/`,s=`${a}/`,i=`${o}__restore_rollback/${Date.now()}/`,l=await Jl(o),u=new Set,c=[];try{for(let d of l){let y=d.startsWith(o)?d.slice(o.length):d,h=`${s}${y}`;if(await z.objectStore.objectExists(z.objectStore.ObjectStoreBuckets.APPS,h)){let R=`${i}${y}`;await Ql(h,R),c.push({targetKey:h,rollbackKey:R})}await Ql(d,h),u.add(h)}}catch(d){if(u.size)try{await sy([...u],c)}catch(y){console.log("Failed to rollback partially promoted restore files:",y)}throw d}return{sourceFileKeys:l,targetFileKeys:[...u],rollbackFiles:c}}n(YN,"promoteWorkspaceFiles");async function zN(e,t,r){let o=`${z.db.getProdWorkspaceID(r)}/`,s=await Jl(o),i=new Set(t),l=s.filter(u=>!i.has(u));l.length&&await ms(l),e.length&&await ms(e)}n(zN,"cleanupPromotedWorkspaceFiles");async function iy(e,t,r,a){let o=z.db.getDevWorkspaceID(r),s=z.db.getProdWorkspaceID(r),i=new Date().toISOString(),l=n(async(u,c)=>{a?.doc?await xt.updateBackupStatus(a.doc.id,u,c?.contents,c?.filename):await xt.storeWorkspaceBackupMetadata({appId:s,timestamp:i,trigger:e,status:u,name:a?.name,type:Ut.BackupType.BACKUP,contents:c?.contents,createdBy:a?.createdBy},{filename:c?.filename})},"updateMetadata");try{let u=await a.processing.exportWorkspaceFn(o,{tar:!0}),c=await a.processing.statsFn(o),d=`${s}/backup-${i}.tar.gz`,y=z.objectStore.ObjectStoreBuckets.BACKUPS,h=ya.default.createReadStream(u);await z.objectStore.streamUpload({bucket:y,filename:d,stream:h,extra:{type:"application/gzip",metadata:{name:a?.name,trigger:e,timestamp:i,appId:s}}}),await l(Ut.BackupStatus.COMPLETE,{filename:d,contents:c}),ya.default.existsSync(u)&&ya.default.rmSync(u)}catch(u){z.logging.logAlert("App backup error",u),await l(Ut.BackupStatus.FAILED);let c=a?.doc?.id||`backup-${i}`,d=u instanceof Error?u.message:String(u);await xt.trackBackupError(s,c,`Backup export failed: ${d}`)}}n(iy,"runBackup");async function ZN(e,t){let r=e.data,a=r.appId,o=r.import.backupId,s=r.import.nameForBackup,i=r.import.createdBy,l=z.tenancy.getTenantIDFromWorkspaceID(a);return z.tenancy.doInTenant(l,async()=>{let u=z.db.getDevWorkspaceID(a),c=`${u}_temp_${Date.now()}`,{rev:d}=await xt.updateRestoreStatus(r.docId,r.docRev,Ut.BackupStatus.STARTED);await iy(Ut.BackupTrigger.RESTORING,l,a,{processing:t,createdBy:i,name:s});let y=await xt.downloadWorkspaceBackup(o),h=Ut.BackupStatus.COMPLETE,b=null;try{await t.importWorkspaceFn(u,z.db.getDB(c),{file:{type:"application/gzip",path:y},key:y},{objectStoreAppId:c,preserveLiteLLMConfig:!0}),b=await YN(c,u),await HN(u),await new z.db.Replication({source:c,target:u}).replicate();try{await zN(b.sourceFileKeys,b.targetFileKeys,u)}catch(R){console.log("Failed to cleanup promoted restore files:",R)}}catch(R){if(b)try{await sy(b.targetFileKeys,b.rollbackFiles)}catch(T){console.log("Failed to rollback promoted restore files:",T)}z.logging.logAlert("App restore error",R),h=Ut.BackupStatus.FAILED;let w=R instanceof Error?R.message:String(R);await xt.trackBackupError(a,o,`Backup restore failed: ${w}`)}finally{try{await z.db.getDB(c,{skip_setup:!0}).destroy()}catch{}try{await JN(c)}catch{}}await xt.updateRestoreStatus(r.docId,d,h),ya.default.existsSync(y)&&ya.default.rmSync(y,{force:!0})})}n(ZN,"importProcessor");async function XN(e,t){let r=e.data,a=r.appId,o=r.export.trigger,s=r.export.name,i=z.tenancy.getTenantIDFromWorkspaceID(a);await z.tenancy.doInTenant(i,async()=>{try{let{rev:l}=await xt.updateBackupStatus(r.docId,Ut.BackupStatus.STARTED);return iy(o,i,a,{processing:t,doc:{id:r.docId,rev:l},name:s})}catch(l){z.logging.logAlert("App backup error",l);let u=l instanceof Error?l.message:String(l);await xt.trackBackupError(a,r.docId,`Backup export failed: ${u}`)}})}n(XN,"exportProcessor");var eD=n(async e=>{Xh(),await Hl(e.processing)},"init"),jn={...xt,processing:Yl,init:eD,getBackupQueue:Ur};var ly=n(async e=>{e.backups&&await jn.init(e.backups)},"init");var Es={};F(Es,{create:()=>QG,find:()=>KG,get:()=>VG,handleDisable:()=>zG,remove:()=>JG,update:()=>HG});var MI=Ie($u()),lt=require("@budibase/backend-core");var PI=require("@budibase/types");async function VG(e){let t=lt.tenancy.getGlobalDB(),r=new lt.db.QueryBuilder(t.name,PI.SearchIndex.USER);r.setIndexBuilder(lt.db.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[o,s]of Object.entries(e.filters?.equal??{}))r.addEqual(o,s);r.setSort("_id"),r.setSkip(e.skip);let a=await r.run();return{users:a.rows,total:a.totalRows}}n(VG,"get");async function KG(e){return await lt.users.getById(e)}n(KG,"find");async function QG(e){let t=await Dt.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new lt.HTTPError("User is already synched",409);e={...t,scimInfo:(0,MI.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Dt.save(e,{requirePassword:!1})}n(QG,"create");async function HG(e,t){return await Dt.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}n(HG,"update");async function JG(e){return await Dt.destroy(e)}n(JG,"remove");async function YG(){return(await lt.users.getAllUsers()).filter(t=>t.scimInfo?.isSync)}n(YG,"getAllSCIMUsers");async function zG(e){let t=await YG();if(t.length)switch(e){case"remove":await lt.users.UserDB.bulkDelete(t.map(r=>({userId:r._id,email:r.email})));break;case"convert":{let r=await Promise.all(t.map(async a=>{let o={...a};return delete o.scimInfo,delete o.ssoId,o.password=await lt.utils.hash(crypto.randomUUID()),o}));await lt.users.bulkUpdateGlobalUsers(r);break}}}n(zG,"handleDisable");var Rs={};F(Rs,{create:()=>ZG});var kI=Ie($u());var NI=require("@budibase/backend-core");async function ZG(e){let t=await wi(e.name),r;if(!t)r=(await Nt.save(e)).id;else{if(t.scimInfo?.isSync)throw new NI.HTTPError("Group is already synched",409);r=t._id,t.users.length&&await Nt.removeUsers(r,t.users.map(o=>o._id)),t.scimInfo=(0,kI.default)(t.scimInfo,e.scimInfo),await Nt.save(t)}return await Nt.get(r)}n(ZG,"create");var Fr={};F(Fr,{logRequest:()=>t$,logResponse:()=>r$});var Lt=require("@budibase/backend-core"),qI=Ie(DI());var{DocWritethrough:XG}=Lt.cache.docWritethrough;function e$(){return`${Lt.db.DocumentType.SCIM_LOG}${Lt.db.SEPARATOR}${(0,qI.default)().format("YYYYMMDD")}`}n(e$,"getLogDocId");var UI=n(()=>{let e=Lt.context.getScimDBName();return new XG(Lt.db.getDB(e),e$())},"getDB");async function t$(e){Lt.logging.logWarn("SCIM request log",e);let t=Date.now().toString();return await UI().patch({[`${t}_request`]:{ts:new Date().toISOString(),...e}}),t}n(t$,"logRequest");async function r$(e,t){Lt.logging.logWarn("SCIM response",t),await UI().patch({[`${e}_response`]:{ts:new Date().toISOString(),...t}})}n(r$,"logResponse");var zu={};F(zu,{doInScimContext:()=>s$,feature:()=>Qu,internalGroupOnly:()=>c$,licenseAuth:()=>Yu,licensing:()=>LI,requireSCIM:()=>i$,scimGroupOnly:()=>u$,scimUserOnly:()=>l$});var Sr=require("@budibase/backend-core");var Os=require("@budibase/types");var a$=n((e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(Sr.env.SELF_HOSTED&&Sr.env.DEFAULT_LICENSE)return t.user.license=Ii,r();t.user.license=await Wt.cache.getCachedLicense(),e.checkUsersLimit&&(Sr.utils.isServingApp(t)||Sr.utils.isServingBuilder(t)||Sr.utils.isServingBuilderPreview(t)||Sr.utils.isPublicApiRequest(t))&&await Ht.usageLimitIsExceeded({name:Os.StaticQuotaName.USERS,type:Os.QuotaUsageType.STATIC,usageChange:0})}return r()},"licensing"),LI=a$;var Qu={};F(Qu,{requireFeature:()=>n$,requireFeatures:()=>o$});var n$=n(e=>async(t,r)=>{await Vo(e),await r()},"requireFeature"),o$=n((...e)=>async(t,r)=>{await gl(e),await r()},"requireFeatures");var Cs=require("@budibase/backend-core");var s$=n(async(e,t)=>{let r;return Cs.env.ENABLE_SCIM_LOGGER&&(r=await Fr.logRequest({...e.request.toJSON(),body:e.request.body})),await Cs.context.doInScimContext(async()=>{let a=await t();return r&&await Fr.logResponse(r,{...e.response.toJSON(),body:e.response.body}),a})},"doInScimContext");var i$=n(async(e,t)=>{await bl(),await t()},"requireSCIM");var FI=require("@budibase/backend-core");var l$=n(e=>Hu(FI.users.getById,e,!0),"scimUserOnly"),u$=n(e=>Hu(oe.get,e,!0),"scimGroupOnly"),c$=n(e=>Hu(oe.get,e,!1),"internalGroupOnly");function Hu(e,t,r){return async(a,o)=>{let s=a.params[t];return typeof s!="string"&&a.throw(404),!!(await e(s)).scimInfo?.isSync!==r&&a.throw(404),o()}}n(Hu,"scimSyncChecks");var Br=require("@budibase/backend-core");var Ju=require("dd-trace");async function Yu(e,t){await Ju.tracer.trace("licenseAuth",async r=>{let a=e.request.headers[Br.constants.Header.LICENSE_KEY]||Br.utils.getBearerToken(e);Array.isArray(a)&&(a=a[0]),a||e.throw(403,"License key not provided");let o=await ul(a);o||(r.addTags({licenseFound:!1}),e.throw(403,"License not found or invalid")),o.tenantId||e.throw(403,"License does not have a tenant ID"),Ju.tracer.setUser({id:"anonymous",tenantId:o.tenantId}),await Br.context.doInSelfHostTenantUsingCloud(o.tenantId,async()=>{await Br.context.doInLicenseContext(o,async()=>{await t()})})})}n(Yu,"default");var ec={};F(ec,{group:()=>Xu,user:()=>Zu});var Zu={};F(Zu,{fromScimUser:()=>g$,toScimUserResponse:()=>d$,userFilters:()=>h$});var BI=require("@budibase/backend-core"),jI=require("@budibase/shared-core"),Ms=require("@budibase/types"),GI=require("scim2-parse-filter");var{unreachable:p$}=jI.utils,d$=n(e=>{let{isSync:t,roles:r,...a}=e.scimInfo||{},o={...a,schemas:["urn:ietf:params:scim:schemas:core:2.0:User"],id:e._id,meta:{resourceType:"User",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},active:e.status===Ms.UserStatus.ACTIVE};(e.firstName||e.lastName)&&(o.name={formatted:[e.firstName,e.lastName].filter(i=>i).join(" "),familyName:e.lastName,givenName:e.firstName});let s="urn:ietf:params:scim:schemas:extension:enterprise:2.0:User";if(o[s]?.manager){let i=o[s].manager;typeof i=="string"&&(o[s].manager={value:i})}return o},"toScimUserResponse"),f$=n(e=>!!e?.id,"isScimUserResponse");function m$(e){if(BI.utils.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}n(m$,"tryGetEmail");var g$=n((e,t={})=>{let r=f$(e)?e:void 0,a=m$(e);if(!a)throw new Error("Email is required");let o;switch(e.active){case"True":case"true":case!0:o=!0;break;case"False":case"false":case!1:o=!1;break;default:p$(e.active)}let s,i;return e.name?.givenName?(s=e.name?.givenName,i=e.name?.familyName):s=e.displayName,{tenantId:"",_id:r?.id,userId:r?.id,email:a,firstName:s,lastName:i,scimInfo:{...e,isSync:!0},roles:t,status:o?Ms.UserStatus.ACTIVE:Ms.UserStatus.INACTIVE,createdAt:r?.meta.created.getTime(),updatedAt:r?.meta.lastModified.toISOString()}},"fromScimUser"),h$=n(e=>{let t={equal:{}},r=(0,GI.parse)(e);function a(o){switch(o.op){case"eq":{let s=o.attrPath,i;s==="emails.value"?i="email":i=`scimInfo.${s}`,t.equal[i]=o.compValue;break}case"and":for(let s of o.filters)a(s);break;default:console.warn("Filter not handled",{filter:o})}}return n(a,"parseFilters"),a(r),t},"userFilters");var Xu={};F(Xu,{fromScimGroup:()=>b$,toScimGroupResponse:()=>y$});var y$=n(e=>({schemas:["urn:ietf:params:scim:schemas:core:2.0:Group"],id:e._id,externalId:e.scimInfo.externalId,meta:{resourceType:"Group",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},displayName:e.name,members:e.users?.map(t=>({value:t._id}))}),"toScimGroupResponse"),v$=n(e=>!!e?.id,"isScimGroup"),b$=n(e=>{let t=v$(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 ep={};F(ep,{LLMRequest:()=>Ke,TableGeneration:()=>Xc,agentHistoryTitleSystemPrompt:()=>XK,agentSystemPrompt:()=>ZK,aiColumnSchemas:()=>zc,aiTableResponseToTableSchema:()=>Qc,appendAIColumns:()=>Hc,classifyText:()=>jK,cleanData:()=>GK,composeAutomationAgentSystemPrompt:()=>JK,composeAutomationAgentToolGuidelines:()=>YK,generateAIColumns:()=>Vc,generateCronExpression:()=>$K,generateData:()=>Kc,generateJs:()=>HK,generateOperationInstructionsPrompt:()=>WK,generateTables:()=>Wc,generationStructure:()=>Yc,normalizeContentType:()=>rQ,parseResponseFormat:()=>hA,sanitiseToolName:()=>tQ,searchWeb:()=>QK,sentimentAnalysis:()=>KK,summarizeText:()=>BK,tableDataStructuredOutput:()=>Zc,translate:()=>VK});var ri=require("@budibase/backend-core"),bA=require("@budibase/shared-core");var yT="vercel.ai.error",w$=Symbol.for(yT),$I,WI,M=class vT extends(WI=Error,$I=w$,WI){static{n(this,"_AISDKError")}constructor({name:t,message:r,cause:a}){super(r),this[$I]=!0,this.name=t,this.cause=a}static isInstance(t){return vT.hasMarker(t,yT)}static hasMarker(t,r){let a=Symbol.for(r);return t!=null&&typeof t=="object"&&a in t&&typeof t[a]=="boolean"&&t[a]===!0}},bT="AI_APICallError",wT=`vercel.ai.error.${bT}`,I$=Symbol.for(wT),VI,KI,me=class extends(KI=M,VI=I$,KI){static{n(this,"APICallError")}constructor({message:e,url:t,requestBodyValues:r,statusCode:a,responseHeaders:o,responseBody:s,cause:i,isRetryable:l=a!=null&&(a===408||a===409||a===429||a>=500),data:u}){super({name:bT,message:e,cause:i}),this[VI]=!0,this.url=t,this.requestBodyValues=r,this.statusCode=a,this.responseHeaders=o,this.responseBody=s,this.isRetryable=l,this.data=u}static isInstance(e){return M.hasMarker(e,wT)}},IT="AI_EmptyResponseBodyError",TT=`vercel.ai.error.${IT}`,T$=Symbol.for(TT),QI,HI,ST=class extends(HI=M,QI=T$,HI){static{n(this,"EmptyResponseBodyError")}constructor({message:e="Empty response body"}={}){super({name:IT,message:e}),this[QI]=!0}static isInstance(e){return M.hasMarker(e,TT)}};function _r(e){return e==null?"unknown error":typeof e=="string"?e:e instanceof Error?e.message:JSON.stringify(e)}n(_r,"getErrorMessage");var _T="AI_InvalidArgumentError",xT=`vercel.ai.error.${_T}`,S$=Symbol.for(xT),JI,YI,AT=class extends(YI=M,JI=S$,YI){static{n(this,"InvalidArgumentError")}constructor({message:e,cause:t,argument:r}){super({name:_T,message:e,cause:t}),this[JI]=!0,this.argument=r}static isInstance(e){return M.hasMarker(e,xT)}},ET="AI_InvalidPromptError",RT=`vercel.ai.error.${ET}`,_$=Symbol.for(RT),zI,ZI,jr=class extends(ZI=M,zI=_$,ZI){static{n(this,"InvalidPromptError")}constructor({prompt:e,message:t,cause:r}){super({name:ET,message:`Invalid prompt: ${t}`,cause:r}),this[zI]=!0,this.prompt=e}static isInstance(e){return M.hasMarker(e,RT)}},OT="AI_InvalidResponseDataError",CT=`vercel.ai.error.${OT}`,x$=Symbol.for(CT),XI,eT,mte=class extends(eT=M,XI=x$,eT){static{n(this,"InvalidResponseDataError")}constructor({data:e,message:t=`Invalid response data: ${JSON.stringify(e)}.`}){super({name:OT,message:t}),this[XI]=!0,this.data=e}static isInstance(e){return M.hasMarker(e,CT)}},MT="AI_JSONParseError",PT=`vercel.ai.error.${MT}`,A$=Symbol.for(PT),tT,rT,Vn=class extends(rT=M,tT=A$,rT){static{n(this,"JSONParseError")}constructor({text:e,cause:t}){super({name:MT,message:`JSON parsing failed: Text: ${e}.
|
|
40
40
|
Error message: ${_r(t)}`,cause:t}),this[tT]=!0,this.text=e}static isInstance(e){return M.hasMarker(e,PT)}},kT="AI_LoadAPIKeyError",NT=`vercel.ai.error.${kT}`,E$=Symbol.for(NT),aT,nT,gte=class extends(nT=M,aT=E$,nT){static{n(this,"LoadAPIKeyError")}constructor({message:e}){super({name:kT,message:e}),this[aT]=!0}static isInstance(e){return M.hasMarker(e,NT)}},DT="AI_LoadSettingError",qT=`vercel.ai.error.${DT}`,R$=Symbol.for(qT),oT,sT,hte=class extends(sT=M,oT=R$,sT){static{n(this,"LoadSettingError")}constructor({message:e}){super({name:DT,message:e}),this[oT]=!0}static isInstance(e){return M.hasMarker(e,qT)}},UT="AI_NoContentGeneratedError",LT=`vercel.ai.error.${UT}`,O$=Symbol.for(LT),iT,lT,yte=class extends(lT=M,iT=O$,lT){static{n(this,"NoContentGeneratedError")}constructor({message:e="No content generated."}={}){super({name:UT,message:e}),this[iT]=!0}static isInstance(e){return M.hasMarker(e,LT)}},FT="AI_NoSuchModelError",BT=`vercel.ai.error.${FT}`,C$=Symbol.for(BT),uT,cT,vte=class extends(cT=M,uT=C$,cT){static{n(this,"NoSuchModelError")}constructor({errorName:e=FT,modelId:t,modelType:r,message:a=`No such ${r}: ${t}`}){super({name:e,message:a}),this[uT]=!0,this.modelId=t,this.modelType=r}static isInstance(e){return M.hasMarker(e,BT)}},jT="AI_TooManyEmbeddingValuesForCallError",GT=`vercel.ai.error.${jT}`,M$=Symbol.for(GT),pT,dT,bte=class extends(dT=M,pT=M$,dT){static{n(this,"TooManyEmbeddingValuesForCallError")}constructor(e){super({name:jT,message:`Too many values for a single embedding call. The ${e.provider} model "${e.modelId}" can only embed up to ${e.maxEmbeddingsPerCall} values per call, but ${e.values.length} values were provided.`}),this[pT]=!0,this.provider=e.provider,this.modelId=e.modelId,this.maxEmbeddingsPerCall=e.maxEmbeddingsPerCall,this.values=e.values}static isInstance(e){return M.hasMarker(e,GT)}},$T="AI_TypeValidationError",WT=`vercel.ai.error.${$T}`,P$=Symbol.for(WT),fT,mT,Ft=class tc extends(mT=M,fT=P$,mT){static{n(this,"_TypeValidationError")}constructor({value:t,cause:r,context:a}){let o="Type validation failed";if(a?.field&&(o+=` for ${a.field}`),a?.entityName||a?.entityId){o+=" (";let s=[];a.entityName&&s.push(a.entityName),a.entityId&&s.push(`id: "${a.entityId}"`),o+=s.join(", "),o+=")"}super({name:$T,message:`${o}: Value: ${JSON.stringify(t)}.
|
|
41
41
|
Error message: ${_r(r)}`,cause:r}),this[fT]=!0,this.value=t,this.context=a}static isInstance(t){return M.hasMarker(t,WT)}static wrap({value:t,cause:r,context:a}){var o,s,i;return tc.isInstance(r)&&r.value===t&&((o=r.context)==null?void 0:o.field)===a?.field&&((s=r.context)==null?void 0:s.entityName)===a?.entityName&&((i=r.context)==null?void 0:i.entityId)===a?.entityId?r:new tc({value:t,cause:r,context:a})}},VT="AI_UnsupportedFunctionalityError",KT=`vercel.ai.error.${VT}`,k$=Symbol.for(KT),gT,hT,wte=class extends(hT=M,gT=k$,hT){static{n(this,"UnsupportedFunctionalityError")}constructor({functionality:e,message:t=`'${e}' functionality not supported.`}){super({name:VT,message:t}),this[gT]=!0,this.functionality=e}static isInstance(e){return M.hasMarker(e,KT)}};var qs=Ie(require("zod/v4"),1),Q=require("zod/v3"),cS=require("zod/v3"),Kn=require("zod/v3");var Ps=class extends Error{static{n(this,"ParseError")}constructor(t,r){super(t),this.name="ParseError",this.type=r.type,this.field=r.field,this.value=r.value,this.line=r.line}};function rc(e){}n(rc,"noop");function QT(e){if(typeof e=="function")throw new TypeError("`callbacks` must be an object, got a function instead. Did you mean `{onEvent: fn}`?");let{onEvent:t=rc,onError:r=rc,onRetry:a=rc,onComment:o}=e,s="",i=!0,l,u="",c="";function d(w){let T=i?w.replace(/^\xEF\xBB\xBF/,""):w,[A,D]=N$(`${s}${T}`);for(let W of A)y(W);s=D,i=!1}n(d,"feed");function y(w){if(w===""){b();return}if(w.startsWith(":")){o&&o(w.slice(w.startsWith(": ")?2:1));return}let T=w.indexOf(":");if(T!==-1){let A=w.slice(0,T),D=w[T+1]===" "?2:1,W=w.slice(T+D);h(A,W,w);return}h(w,"",w)}n(y,"parseLine");function h(w,T,A){switch(w){case"event":c=T;break;case"data":u=`${u}${T}
|
|
42
42
|
`;break;case"id":l=T.includes("\0")?void 0:T;break;case"retry":/^\d+$/.test(T)?a(parseInt(T,10)):r(new Ps(`Invalid \`retry\` value: "${T}"`,{type:"invalid-retry",value:T,line:A}));break;default:r(new Ps(`Unknown field "${w.length>20?`${w.slice(0,20)}\u2026`:w}"`,{type:"unknown-field",field:w,value:T,line:A}));break}}n(h,"processField");function b(){u.length>0&&t({id:l,event:c||void 0,data:u.endsWith(`
|
|
@@ -86,7 +86,7 @@ If not possible, return only 'Error generating cron:' followed by a short explan
|
|
|
86
86
|
${e}`)}n($K,"generateCronExpression");function WK({prompt:e,agentName:t,goal:r,toolReferences:a=[]}){let o=a.length>0?`Enabled tools (use these exact Handlebars references when mentioning tools):
|
|
87
87
|
${a.map(s=>`- ${s}`).join(`
|
|
88
88
|
`)}`:`Enabled tools:
|
|
89
|
-
- None`;return new Ke().addSystemMessage(`You write instruction prompts for Budibase
|
|
89
|
+
- None`;return new Ke().addSystemMessage(`You write instruction prompts for Budibase agent operations.
|
|
90
90
|
|
|
91
91
|
Return only the final instructions text.
|
|
92
92
|
Do not include explanations, preamble, commentary, or markdown code fences.
|
|
@@ -98,7 +98,7 @@ If no tools are enabled, do not instruct the agent to use tools.
|
|
|
98
98
|
|
|
99
99
|
The output must use exactly these sections and headings:
|
|
100
100
|
|
|
101
|
-
**
|
|
101
|
+
**Operation role**
|
|
102
102
|
<short paragraph>
|
|
103
103
|
|
|
104
104
|
**Inputs**
|
|
@@ -116,8 +116,8 @@ The output must use exactly these sections and headings:
|
|
|
116
116
|
- <bullet>
|
|
117
117
|
- <bullet>
|
|
118
118
|
|
|
119
|
-
Write concise, practical instructions that help the
|
|
120
|
-
Prefer clear operational guidance over abstract advice.`).addUserMessage(`Generate instructions for a Budibase agent using this request:
|
|
119
|
+
Write concise, practical instructions that help the operation behave well in Budibase.
|
|
120
|
+
Prefer clear operational guidance over abstract advice.`).addUserMessage(`Generate instructions for a Budibase agent operation using this request:
|
|
121
121
|
|
|
122
122
|
Prompt:
|
|
123
123
|
${e.trim()}
|
|
@@ -130,7 +130,7 @@ ${r?.trim()||"Not provided"}
|
|
|
130
130
|
|
|
131
131
|
${o}
|
|
132
132
|
|
|
133
|
-
Make sure the generated instructions use the enabled tool references exactly as written above, for example {{ budibase.example.run }}.`)}n(WK,"
|
|
133
|
+
Make sure the generated instructions use the enabled tool references exactly as written above, for example {{ budibase.example.run }}.`)}n(WK,"generateOperationInstructionsPrompt");function VK(e,t){return new Ke().addUserMessage(`Translate the following text: "${e}" into ${t}. Only return the translation.`)}n(VK,"translate");function KK(e){return new Ke().addUserMessage(`Return the sentiment of this text: "${e}". Only return the sentiment.`)}n(KK,"sentimentAnalysis");function QK(e){return new Ke().addUserMessage(`Search the web for the following: "${e}". Only return the top results.`)}n(QK,"searchWeb");function HK(e,t){let r="You do not have access to any bindings in this request.";e&&e.length>0&&(r=`The bindings you have access to are:
|
|
134
134
|
|
|
135
135
|
${e.map(({readableBinding:o})=>`- $("${o}")`).join(`
|
|
136
136
|
`)}`);let a="You do not have access to any snippets in this request.";return t.length>0&&(a=`The snippets you have access to are:
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"dist"
|
|
5
5
|
],
|
|
6
6
|
"license": "UNLICENSED",
|
|
7
|
-
"version": "3.39.
|
|
7
|
+
"version": "3.39.21",
|
|
8
8
|
"description": "Budibase Pro (Backend)",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"types": "dist/index.d.ts",
|
|
@@ -66,5 +66,5 @@
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
},
|
|
69
|
-
"gitHead": "
|
|
69
|
+
"gitHead": "8dfa68fadbb12b4b6f9ce8bc124d0ec40b6ccb71"
|
|
70
70
|
}
|