@budibase/pro 3.23.1 → 3.23.3

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.
@@ -1,8 +1,8 @@
1
1
  import AnthropicClient from "@anthropic-ai/sdk";
2
- import { LLMFullResponse, LLMStreamChunk } from "../../types/ai";
3
- import { LLM } from "./base";
2
+ import { LLMConfigOptions, LLMStreamChunk } from "@budibase/types";
3
+ import { LLMFullResponse } from "../../types/ai";
4
4
  import { LLMRequest } from "../llm";
5
- import { LLMConfigOptions } from "@budibase/types";
5
+ import { LLM } from "./base";
6
6
  export type AnthropicModel = "claude-3-5-sonnet-20240620" | "claude-3-sonnet-20240229" | "claude-3-opus-20240229" | "claude-3-haiku-20240307";
7
7
  export declare class Anthropic extends LLM {
8
8
  private client;
@@ -1,7 +1,7 @@
1
- import { AIFieldMetadata, EnrichedBinding, LLMConfigOptions, Row, Snippet } from "@budibase/types";
2
- import { LLMFullResponse, LLMPromptResponse, LLMStreamChunk } from "../../types/ai";
3
- import { LLMRequest } from "../llm";
1
+ import { AIFieldMetadata, EnrichedBinding, LLMConfigOptions, LLMStreamChunk, Row, Snippet } from "@budibase/types";
4
2
  import { Readable } from "node:stream";
3
+ import { LLMFullResponse, LLMPromptResponse } from "../../types/ai";
4
+ import { LLMRequest } from "../llm";
5
5
  export declare abstract class LLM {
6
6
  protected _model: string;
7
7
  protected _apiKey?: string;
@@ -1,7 +1,8 @@
1
- import { LLMFullResponse, LLMPromptResponse, LLMStreamChunk } from "../../types/ai";
2
- import { LLM } from "./base";
3
- import { LLMRequest } from "../llm";
1
+ import { LLMStreamChunk } from "@budibase/types";
4
2
  import { Readable } from "node:stream";
3
+ import { LLMFullResponse, LLMPromptResponse } from "../../types/ai";
4
+ import { LLMRequest } from "../llm";
5
+ import { LLM } from "./base";
5
6
  export declare class BudibaseAI extends LLM {
6
7
  prompt(prompt: string | LLMRequest): Promise<LLMPromptResponse>;
7
8
  chat(prompt: LLMRequest): Promise<LLMFullResponse>;
@@ -1,10 +1,9 @@
1
- import OpenAIClient from "openai";
2
- import { LLMFullResponse, LLMStreamChunk } from "../../types/ai";
3
- import { LLM } from "./base";
4
- import { LLMRequest } from "../llm";
5
- import { LLMConfigOptions, ResponseFormat } from "@budibase/types";
6
- import openai from "openai";
1
+ import { LLMConfigOptions, LLMStreamChunk, ResponseFormat } from "@budibase/types";
7
2
  import { Readable } from "node:stream";
3
+ import { default as openai, default as OpenAIClient } from "openai";
4
+ import { LLMFullResponse } from "../../types/ai";
5
+ import { LLMRequest } from "../llm";
6
+ import { LLM } from "./base";
8
7
  export type OpenAIModel = "gpt-4o-mini" | "gpt-4o" | "gpt-4" | "gpt-4.1" | "gpt-4.1-mini" | "gpt-4-turbo" | "gpt-3.5-turbo" | "gpt-5" | "gpt-5-mini" | "gpt-5-nano";
9
8
  export declare enum GPT_5_MODELS {
10
9
  GPT_5_MINI = "gpt-5-mini",
package/dist/index.js CHANGED
@@ -35,7 +35,7 @@ d/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR
35
35
  mwIDAQAB
36
36
  -----END PUBLIC KEY-----
37
37
  `;function ia(e){return $o.default.verify(e,vS,{algorithms:["RS256"]})}a(ia,"verifyLicenseToken");function _S(e,t){return $o.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}a(_S,"sign");var dn={};x(dn,{getFeatures:()=>jo});var l=require("@budibase/types");var xS={[l.PlanType.FREE]:[...De.SELF_FREE_LICENSE.features],[l.PlanType.PREMIUM]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.PDF],[l.PlanType.PREMIUM_PLUS]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.PREMIUM_PLUS_TRIAL]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.PRO]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS],[l.PlanType.TEAM]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS],[l.PlanType.BUSINESS]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.PDF,l.Feature.BUDIBASE_AI],[l.PlanType.ENTERPRISE_BASIC]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.BUDIBASE_AI,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC],[l.PlanType.ENTERPRISE_BASIC_TRIAL]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.BUDIBASE_AI,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC],[l.PlanType.ENTERPRISE]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.BUDIBASE_AI,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC]},CS={[l.PlanType.FREE]:[...De.CLOUD_FREE_LICENSE.features],[l.PlanType.PREMIUM]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.PDF],[l.PlanType.PREMIUM_PLUS]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.BUDIBASE_AI,l.Feature.PDF],[l.PlanType.PREMIUM_PLUS_TRIAL]:[l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.BUDIBASE_AI,l.Feature.PDF],[l.PlanType.PRO]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING],[l.PlanType.TEAM]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.BRANDING],[l.PlanType.BUSINESS]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.BUDIBASE_AI,l.Feature.PDF],[l.PlanType.ENTERPRISE_BASIC]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.OFFLINE,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC],[l.PlanType.ENTERPRISE_BASIC_TRIAL]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC],[l.PlanType.ENTERPRISE]:[l.Feature.USER_GROUPS,l.Feature.WORKSPACE_BACKUPS,l.Feature.ENVIRONMENT_VARIABLES,l.Feature.ENFORCEABLE_SSO,l.Feature.AUDIT_LOGS,l.Feature.BRANDING,l.Feature.SYNC_AUTOMATIONS,l.Feature.APP_BUILDERS,l.Feature.EXPANDED_PUBLIC_API,l.Feature.VIEW_PERMISSIONS,l.Feature.TRIGGER_AUTOMATION_RUN,l.Feature.SCIM,l.Feature.VIEW_READONLY_COLUMNS,l.Feature.AI_CUSTOM_CONFIGS,l.Feature.BUDIBASE_AI,l.Feature.PWA,l.Feature.CUSTOM_APP_SCRIPTS,l.Feature.PDF,l.Feature.RECAPTCHA,l.Feature.PKCE_OIDC]};function jo(e,t){let r=[];function n(o){let s=o[t];if(!s)throw new Error(`Features do not exist for planType=${t} and hosting=${e}`);return s}switch(a(n,"readFeatures"),e){case l.Hosting.SELF:r=n(xS);break;case l.Hosting.CLOUD:r=n(CS);break}return r}a(jo,"getFeatures");var fn={};x(fn,{UNLIMITED:()=>m,getQuotas:()=>Qo});var J=require("@budibase/types");var d=At,qc=De,m=-1,ca=a(e=>e*1e6,"millions"),OS={[J.PlanType.FREE]:{...qc.CLOUD_FREE_LICENSE.quotas},[J.PlanType.PREMIUM]:{usage:{monthly:{...d.queries(m),...d.automations(1e3),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(1e4),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(0),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(7),...d.appBackupRetentionDays(7)}},[J.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...d.queries(m),...d.automations(5e3),...d.budibaseAICredits(ca(2)),...d.actions(m)},static:{...d.rows(25e3),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(0),...d.plugins(m),...d.customAIConfigurations(1)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(30)}},[J.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...d.queries(m),...d.automations(5e3),...d.budibaseAICredits(ca(2)),...d.actions(m)},static:{...d.rows(25e3),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(0),...d.plugins(m),...d.customAIConfigurations(1)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(30)}},[J.PlanType.PRO]:{usage:{monthly:{...d.queries(m),...d.automations(1e3),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(5),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(7),...d.appBackupRetentionDays(7)}},[J.PlanType.TEAM]:{usage:{monthly:{...d.queries(m),...d.automations(5e3),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(10),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(90)}},[J.PlanType.BUSINESS]:{usage:{monthly:{...d.queries(m),...d.automations(1e4),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(5e4),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(50),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(365),...d.appBackupRetentionDays(365)}},[J.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(ca(4)),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(m),...d.appBackupRetentionDays(m)}},[J.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(ca(4)),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(15),...d.appBackupRetentionDays(15)}},[J.PlanType.ENTERPRISE]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(ca(4)),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(m),...d.appBackupRetentionDays(m)}}},LS={[J.PlanType.FREE]:{...qc.SELF_FREE_LICENSE.quotas},[J.PlanType.PREMIUM]:void 0,[J.PlanType.PREMIUM_PLUS]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(0),...d.plugins(m),...d.customAIConfigurations(1)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(30)}},[J.PlanType.PREMIUM_PLUS_TRIAL]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(0),...d.plugins(m),...d.customAIConfigurations(1)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(30)}},[J.PlanType.PRO]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(5),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(7),...d.appBackupRetentionDays(7)}},[J.PlanType.TEAM]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(10),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(30),...d.appBackupRetentionDays(90)}},[J.PlanType.BUSINESS]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(50),...d.plugins(m),...d.customAIConfigurations(0)}},constant:{...d.automationLogRetentionDays(90),...d.appBackupRetentionDays(365)}},[J.PlanType.ENTERPRISE_BASIC]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(m),...d.appBackupRetentionDays(m)}},[J.PlanType.ENTERPRISE_BASIC_TRIAL]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(15),...d.appBackupRetentionDays(15)}},[J.PlanType.ENTERPRISE]:{usage:{monthly:{...d.queries(m),...d.automations(m),...d.budibaseAICredits(0),...d.actions(m)},static:{...d.rows(m),...d.apps(m),...d.users(m),...d.creators(m),...d.userGroups(m),...d.plugins(m),...d.customAIConfigurations(m)}},constant:{...d.automationLogRetentionDays(m),...d.appBackupRetentionDays(m)}}};function Qo(e,t){let r;function n(o){let s=o[t];if(!s)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return s}switch(a(n,"readQuotas"),e){case J.Hosting.SELF:r=n(LS);break;case J.Hosting.CLOUD:r=n(OS);break}return JSON.parse(JSON.stringify(r))}a(Qo,"getQuotas");var cr={};x(cr,{encoding:()=>ur,workspaceExists:()=>PS});var Dc=require("@budibase/backend-core");async function PS(e){return(await Dc.db.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}a(PS,"workspaceExists");var ur={};x(ur,{base64ToObject:()=>qS,objectToBase64:()=>US});function US(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}a(US,"objectToBase64");function qS(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}a(qS,"base64ToObject");var bf=require("@budibase/types"),wr=require("@budibase/backend-core"),If=F(Jl()),Sf=F(bs());async function cx(e){await $e.save({offlineLicenseToken:e}),await Kt()}a(cx,"activateOfflineLicenseToken");async function px(){await $e.save({offlineLicenseToken:void 0}),await Kt()}a(px,"deleteOfflineLicenseToken");async function wf(){return(await $e.get()).offlineLicenseToken}a(wf,"getOfflineLicenseToken");async function Is(){let t=(await wr.installation.getInstall()).installId,r=wr.context.getTenantId(),n=await wr.events.identification.getUniqueTenantId(r);return{installId:t,tenantId:n}}a(Is,"getIdentifier");async function lx(){let e=await Is();return ur.objectToBase64(e)}a(lx,"getIdentifierBase64");function dx(e){return ur.base64ToObject(e)}a(dx,"getIdentifierFromBase64");function Tf(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}a(Tf,"verifyExpiry");async function Ef(e){let t=await Is();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}a(Ef,"verifyInstallation");function Rf(e){let t=e.plan.type,r=bf.Hosting.SELF,n=jo(r,t),o=Qo(r,t);return e.features=(0,If.default)(e.features,n),e.quotas=(0,Sf.default)(e.quotas,o),e}a(Rf,"enrichLicense");async function Ss(){try{let e=await wf();if(e){let t=await ia(e);return Tf(t),await Ef(t),Rf(t)}}catch(e){console.error("Error retrieving offline license",e)}}a(Ss,"getOfflineLicense");var xa={};x(xa,{deleteDevLicense:()=>yx,getOfflineLicense:()=>gx,writeDevLicenseToDisk:()=>hx});var vf=require("@budibase/backend-core"),Ts=require("path"),_f=require("os"),Vt=F(require("fs"));var fx=vf.env.isTest()?".budibase-test":".budibase",ws=(0,Ts.join)((0,_f.tmpdir)(),fx),mx="dev_license.txt",_a=(0,Ts.join)(ws,mx);if(!Vt.default.existsSync(ws))try{Vt.default.mkdirSync(ws)}catch{}function gx(){try{if(Vt.default.existsSync(_a)){let e=Vt.default.readFileSync(_a,{encoding:"utf-8"});return ia(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}a(gx,"getOfflineLicense");function hx(e){console.log(`Writing license to: ${_a}`),Vt.default.writeFileSync(_a,e,{encoding:"utf-8"})}a(hx,"writeDevLicenseToDisk");function yx(){Vt.default.rmSync(_a,{force:!0})}a(yx,"deleteDevLicense");var xf=require("dd-trace");var Rs=a(async()=>await xf.tracer.trace("getLicense",async e=>{if(Es.env.OFFLINE_MODE)return e.addTags({offline:!0}),Ss();let t=await ir();return t||(e.addTags({offlineFallback:!0}),t=xa.getOfflineLicense()),t}),"getLicense"),vs=a(e=>Fo(e),"getLicenseFromKey"),_s=a(()=>Es.env.SELF_HOSTED?De.SELF_FREE_LICENSE:De.CLOUD_FREE_LICENSE,"getFreeLicense");var Cs={};x(Cs,{activateLicenseKey:()=>Ax,deleteLicenseKey:()=>bx,getLicenseKey:()=>Cn});var xs=F(require("dd-trace"));async function Ax(e){await Wo(e),await $e.save({licenseKey:e}),await Kt()}a(Ax,"activateLicenseKey");async function Cn(){return await xs.default.trace("getLicenseKey",async e=>{let t=await $e.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}a(Cn,"getLicenseKey");async function bx(){return await xs.default.trace("deleteLicenseKey",async()=>{await $e.save({licenseKey:void 0}),await Kt()})}a(bx,"deleteLicenseKey");var Ht=require("@budibase/backend-core"),On=F(require("dd-trace"));var Cf=3600,Kt=a(async()=>{await Pf(),await Lf()},"refresh"),Of=a(async(e,t)=>{let{populateLicense:r=Rs,populateFreeLicense:n=_s}=t||{};return await On.default.trace("getCachedLicense",async o=>{let s=Ht.context.getLicense();if(s)return o.addTags({foundInContext:!0,features:s.features,plan:s.plan,quotas:s.quotas}),s;let i=Ht.tenancy.getTenantId(),u=await vo(),c=await u.get(i);return o.addTags({tenantId:i,foundInCache:!!c}),c?(o.addTags({foundInCache:!0,refreshedAt:c.refreshedAt,features:c.features,plan:c.plan,quotas:c.quotas}),c):(c=await On.default.trace("populateLicense",async()=>await r(i)),o.addTags({populatedLicense:!!c}),c||(c=On.default.trace("populateFreeLicense",()=>n(e,i)),o.addTags({populatedFreeLicense:!!c})),c.refreshedAt=new Date().toISOString(),o.addTags({refreshedAt:c.refreshedAt,features:c.features,plan:c.plan,quotas:c.quotas,expirySeconds:Cf}),await u.store(i,c,Cf),c)})},"_getCachedLicense");Ht.env.isJest()&&(Of=jest.fn());var Lf=Of,Pf=a(async()=>{let e=Ht.tenancy.getTenantId();await(await vo()).delete(e)},"invalidate");async function be(e,t){Array.isArray(e)||(e=[e]),t||(t=await Je.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}a(be,"areFeaturesEnabled");async function Ln(e,t){if(!await be(e,t))throw new bt.FeatureDisabledError(`${e} is not currently enabled`,e)}a(Ln,"checkFeature");async function Os(e,t){if(!await be(e,t)){let r=e.join(", ");throw new bt.FeatureDisabledError(`${r} are not currently enabled`,r)}}a(Os,"checkFeatures");function xe(e){return async(...t)=>(await Ln(Ae.Feature.WORKSPACE_BACKUPS),e(...t))}a(xe,"checkBackups");async function Ls(){return be(Ae.Feature.WORKSPACE_BACKUPS)}a(Ls,"isBackupsEnabled");async function Ps(){return be(Ae.Feature.BRANDING)}a(Ps,"isBrandingEnabled");async function Uf(){return be(Ae.Feature.ENFORCEABLE_SSO)}a(Uf,"isEnforceableSSO");async function Sx(){return be(Ae.Feature.SYNC_AUTOMATIONS)}a(Sx,"isSyncAutomationsEnabled");async function wx(){return be(Ae.Feature.TRIGGER_AUTOMATION_RUN)}a(wx,"isTriggerAutomationRunEnabled");async function Us(){return be(Ae.Feature.APP_BUILDERS)}a(Us,"isAppBuildersEnabled");async function Pn(){return be(Ae.Feature.AUDIT_LOGS)}a(Pn,"isAuditLogsEnabled");async function qs(){return be(Ae.Feature.USER_GROUPS)}a(qs,"isUserGroupsEnabled");function Tx(){return be(Ae.Feature.PWA)}a(Tx,"isPWAEnabled");function Ex(){return be(Ae.Feature.RECAPTCHA)}a(Ex,"isRecaptchaEnabled");var Rx=a(()=>be(Ae.Feature.PKCE_OIDC),"isPkceOidcEnabled");async function It(){return be(Ae.Feature.EXPANDED_PUBLIC_API)}a(It,"isExpandedPublicApiEnabled");async function vx(e){if(bt.env.ENABLE_SSO_MAINTENANCE_MODE||!await Uf())return!1;let r;return e?.config?r=e.config:r=await bt.configs.getSettingsConfig(),!!r.isSSOEnforced}a(vx,"isSSOEnforced");var Ds=a(async()=>{let e=Ae.Feature.SCIM,t=await be(e),r=await bt.configs.getSCIMConfig();if(!t||!r?.enabled)throw new bt.FeatureDisabledError(`${e} is not currently enabled`,e);return!0},"checkSCIM");async function _x(){return be(Ae.Feature.VIEW_PERMISSIONS)}a(_x,"isViewPermissionEnabled");async function xx(){return be(Ae.Feature.VIEW_READONLY_COLUMNS)}a(xx,"isViewReadonlyColumnsEnabled");var Cx={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 Ox(e){return await Ps()?{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}:Cx}a(Ox,"getBrandingConfig");var Ms={};x(Ms,{enrichAIConfig:()=>ks});var qf=require("@budibase/backend-core");var Lx="budibase_ai";async function ks(e){if(qf.env.SELF_HOSTED)return e;for(let t of Object.values(e.config))if(t.provider==="BudibaseAI")return e;return e.config[Lx]={provider:"BudibaseAI",active:!0,isDefault:Object.keys(e.config).every(t=>!e.config[t].isDefault),defaultModel:process.env.BUDIBASE_AI_DEFAULT_MODEL||"gpt-5-mini",name:"Budibase AI"},e}a(ks,"enrichAIConfig");var ft={};x(ft,{addAction:()=>kx,addApp:()=>Mx,addAutomation:()=>$x,addGroup:()=>Bs,addPlugin:()=>Fs,addRow:()=>Bx,addRows:()=>Fx,addUsers:()=>kn,bustCache:()=>Po,decrement:()=>St,decrementMany:()=>Ca,getCurrentUsageValues:()=>uc,getLicensedQuota:()=>kf,getQuotaUsage:()=>Ft,increment:()=>Me,incrementBudibaseAICredits:()=>Nn,incrementMany:()=>zt,removeApp:()=>Nx,removeGroup:()=>Gs,removePlugin:()=>Ws,removeRow:()=>Gx,removeRows:()=>Wx,removeUsers:()=>vr,set:()=>Ns,setAllUsage:()=>qo,setAppUsageValue:()=>Uo,setUsage:()=>oc,setUsagePerApp:()=>sc,updatePluginCount:()=>$s,updateUsage:()=>Tr,usageLimitIsExceeded:()=>Dx,utils:()=>Fr});var qn=require("@budibase/types");var et=require("@budibase/backend-core"),de=require("@budibase/types"),Yt=require("dd-trace");var Me=a(async(e,t,r)=>await Yt.tracer.trace("quotas.increment",async n=>(n.addTags({name:e,type:t}),await Df({change:1,name:e,type:t,opts:r}))),"increment"),zt=a(e=>Yt.tracer.trace("quotas.incrementMany",async()=>Df(e)),"incrementMany"),Df=a(async e=>await Yt.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await Tr(r.map(o=>({usageChange:o.change,name:o.name,type:o.type,opts:{dryRun:!0,suppressErrorLog:o.opts?.suppressErrorLog,id:o.opts?.id}})));let n=[];for(let o of r)await Yt.tracer.trace("quotas.incrementMany.fn",async s=>{s.addTags({actionName:o.name,actionType:o.type,actionChange:o.change});let i=o.opts?.fn;i&&n.push(await i())});return await Tr(r.map(o=>({usageChange:o.change,name:o.name,type:o.type,opts:{dryRun:!1,valueFn:o.opts?.valueFn,suppressErrorLog:o.opts?.suppressErrorLog,id:o.opts?.id}}))),n[0]}),"tryIncrement"),St=a((e,t,r={})=>Tr({usageChange:-1,name:e,type:t,opts:r}),"decrement"),Ca=a(e=>{let t=Array.isArray(e)?e:[e];return Tr(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),Ns=a(async(e,t,r)=>it.setUsage(r,e,t),"set"),Px=a((e,t,r)=>{if(e==de.QuotaUsageType.STATIC){let n=r.usageQuota.triggers;return n?n[t]||{}:{}}else{let n=it.utils.getCurrentMonthString(),o=r.monthly[n].triggers;return o?o[t]||{}:{}}},"getExistingTriggers"),Ux=a(async(e,t,r,n)=>{try{await et.locks.doWithLock({type:de.LockType.TRY_ONCE,name:de.LockName.TRIGGER_QUOTA,resource:e,ttl:1e4},async()=>{let o={percentage:r,name:t.name};n&&(o.resetDate=n),await Lt.triggerQuota(o)})}catch(o){et.logging.logAlert("Error triggering quota",o)}},"triggerQuota"),qx=a(async(e,t,r,n)=>{let o=await Ft(),s=e===de.QuotaUsageType.MONTHLY?o.quotaReset:void 0,i=await Px(e,t,o),u=n.triggers,c=r/n.value*100;c>100&&(c=100);for(let[f,g]of u.entries())if(c>=g&&n.value!==At.UNLIMITED){if(!i[g]){i[g]=new Date().toISOString();let y=u[f+1]||100;(!(c>=y)||c===g)&&await Ux(t,n,c,s)}}else i[g]=void 0;return i},"checkTriggers"),Tr=a(async e=>{await Yt.tracer.trace("quotas.updateUsage",async t=>{let r=et.tenancy.getTenantId(),n=Array.isArray(e)?e:[e];t.addTags({numActions:n.length,tenantId:r});let o,s,i=[],u={},c={},f={},g={};for(let y of n)await Yt.tracer.trace("quotas.updateUsage.action",async E=>{E.addTags({actionName:y.name,actionType:y.type,actionUsageChange:y.usageChange});try{o=et.context.getWorkspaceId()}catch{}if(de.APP_QUOTA_NAMES.includes(y.name)&&!o)throw new Error("App context required for quota update");try{s=await kf(de.QuotaType.USAGE,y.name,y.type),i.push(s);let{total:k,app:D,breakdown:C}=await it.getCurrentUsageValues(y.type,y.name,y.opts?.id);k+=y.usageChange,D!=null&&(D+=y.usageChange),C!=null&&(C+=y.usageChange);let W={};if(y.opts?.dryRun||(W=await qx(y.type,y.name,k,s),g={...g,[y.name]:W}),s.value!==At.UNLIMITED&&k>s.value&&y.usageChange>0)throw new et.UsageLimitError(`Licensed ${s.name} of ${s.value} has been exceeded`,s.name);if(k=Math.max(0,k),D&&(D=Math.max(0,D)),C&&(C=Math.max(0,C),f={...f,[y.name]:C}),!y.opts?.dryRun){let ye=y.opts?.valueFn;ye&&(k=await ye(),D=k),u={...u,[y.name]:k},c={...c,[y.name]:D}}}catch(k){throw y.opts?.suppressErrorLog||console.error(`Error updating usage quotas for ${y.name}`,k),k}});let h=n.filter(y=>!y.opts?.dryRun).map(y=>({name:y.name,type:y.type,values:{total:u[y.name],app:c[y.name],breakdown:f[y.name],triggers:g[y.name]},opts:{...y.opts,tenantId:r}}));h.length>0&&await it.setAllUsage(h)})},"updateUsage"),kf=a(async(e,t,r)=>{let n=await Je.getCachedLicense();if(!n){let o=et.tenancy.getTenantId();throw new Error("License not found for tenant id "+o)}if(r&&(0,de.isStaticQuota)(e,r,t))return n.quotas[e][r][t];if(r&&(0,de.isMonthlyQuota)(e,r,t))return n.quotas[e][r][t];if((0,de.isConstantQuota)(e,t))return n.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),Dx=a(async({name:e,type:t,usageChange:r})=>{try{return await Tr({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(n){if(n.code===de.ErrorCode.USAGE_LIMIT_EXCEEDED)return!0;throw n}},"usageLimitIsExceeded");var kx=a(async e=>Me(qn.MonthlyQuotaName.ACTIONS,qn.QuotaUsageType.MONTHLY,{fn:e}),"addAction");var Mf=require("@budibase/backend-core"),Er=require("@budibase/types");var Nf=a(async()=>{let e=await Mf.db.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),Mx=a(async(e,{appId:t}={})=>Me(Er.StaticQuotaName.WORKSPACES,Er.QuotaUsageType.STATIC,{fn:e,valueFn:Nf,id:t}),"addApp"),Nx=a(async({appId:e}={})=>St(Er.StaticQuotaName.WORKSPACES,Er.QuotaUsageType.STATIC,{valueFn:Nf,id:e}),"removeApp");var lt=require("@budibase/types");var Bx=a(async(e,{tableId:t}={})=>Me(lt.StaticQuotaName.ROWS,lt.QuotaUsageType.STATIC,{fn:e,id:t}),"addRow"),Gx=a(async({tableId:e}={})=>St(lt.StaticQuotaName.ROWS,lt.QuotaUsageType.STATIC,{id:e}),"removeRow"),Fx=a(async(e,t,{tableId:r}={})=>zt({change:e,name:lt.StaticQuotaName.ROWS,type:lt.QuotaUsageType.STATIC,opts:{fn:t,id:r}}),"addRows"),Wx=a(async(e,{tableId:t}={})=>Ca({change:e,name:lt.StaticQuotaName.ROWS,type:lt.QuotaUsageType.STATIC,opts:{id:t}}),"removeRows");var Dn=require("@budibase/types");var $x=a(async(e,{automationId:t}={})=>Me(Dn.MonthlyQuotaName.AUTOMATIONS,Dn.QuotaUsageType.MONTHLY,{fn:e,id:t}),"addAutomation");var Rr=require("@budibase/types");var Bs=a(async e=>Me(Rr.StaticQuotaName.USER_GROUPS,Rr.QuotaUsageType.STATIC,{fn:e}),"addGroup"),Gs=a(async()=>St(Rr.StaticQuotaName.USER_GROUPS,Rr.QuotaUsageType.STATIC),"removeGroup");var Dt=require("@budibase/types");var Fs=a(async e=>Me(Dt.StaticQuotaName.PLUGINS,Dt.QuotaUsageType.STATIC,{fn:e}),"addPlugin"),Ws=a(async()=>St(Dt.StaticQuotaName.PLUGINS,Dt.QuotaUsageType.STATIC),"removePlugin"),$s=a(async e=>Ns(Dt.StaticQuotaName.PLUGINS,Dt.QuotaUsageType.STATIC,e),"updatePluginCount");var dt=require("@budibase/types"),Oa=require("@budibase/backend-core");var kn=a(async(e,t,r)=>{let n=[{change:e,name:dt.StaticQuotaName.USERS,type:dt.QuotaUsageType.STATIC,opts:{fn:r,valueFn:Oa.users.getUserCount}}];t>0&&n.push({change:t,name:dt.StaticQuotaName.CREATORS,type:dt.QuotaUsageType.STATIC,opts:{valueFn:Oa.users.getCreatorCount}});let o=await zt(n);return await ir(),o},"addUsers"),vr=a(async(e,t)=>{let r=[{change:e,name:dt.StaticQuotaName.USERS,type:dt.QuotaUsageType.STATIC,opts:{valueFn:Oa.users.getUserCount}}];t>0&&r.push({change:t,name:dt.StaticQuotaName.CREATORS,type:dt.QuotaUsageType.STATIC,opts:{valueFn:Oa.users.getCreatorCount}}),await Ca(r),await ir()},"removeUsers");var Mn=require("@budibase/types");var Nn=a(async e=>zt({change:e,name:Mn.MonthlyQuotaName.BUDIBASE_AI_CREDITS,type:Mn.QuotaUsageType.MONTHLY}),"incrementBudibaseAICredits");var Wn={};x(Wn,{db:()=>Ke});var Hs=require("@budibase/backend-core");var re={};x(re,{addUsers:()=>Fn,adjustGroupCreatorsQuotas:()=>Vx,cleanupApp:()=>Kx,enrichUserRolesFromGroups:()=>Qx,fetch:()=>La,get:()=>_r,getBulk:()=>Qf,getGroupBuilderAppIds:()=>jf,getGroupRoleId:()=>jx,remove:()=>Qs,removeUsers:()=>Ks,save:()=>Gn,updateGroupApps:()=>Vs});var N=require("@budibase/backend-core");var Bf=require("@budibase/backend-core");var Bn=class extends Bf.HTTPError{static{a(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}};async function Wf(e,t){try{let r=[];for(let u of e)if(u.roles){let c=u.roles[N.db.getProdWorkspaceID(t)];c&&r.push(c)}let n=await Promise.all(r.map(async u=>({[u]:await N.roles.roleToNumber(u)}))),o,s,i={};n.forEach(u=>{let[c,f]=Object.entries(u)[0];i[c]={roleId:c,roleNum:f}});for(let{roleId:u,roleNum:c}of Object.values(i))(s===void 0||c>s)&&(s=c,o=u);return o}catch(r){throw N.logging.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}a(Wf,"findHighestRole");async function $f(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await z.getBulk(e,{enriched:!1}),t}a($f,"groupList");async function jf(e,t){if(!e.userGroups)return[];let r=await $f(e.userGroups,t?.groups),n=t?.appId?N.db.getProdWorkspaceID(t?.appId):null,o=[];for(let s of r){let i=s.builder?.apps;n&&i?.includes(n)?o.push(n):n||(o=o.concat(i||[]))}return[...new Set(o)]}a(jf,"getGroupBuilderAppIds");async function jx(e,t,r){if(!e.userGroups)return null;let n=await $f(e.userGroups,r?.groups),o=N.db.getProdWorkspaceID(t);return e.roles?.[o]?e.roles[o]:(n=n.filter(s=>s?.roles?Object.keys(s.roles).includes(o):!1),await Wf(n,t))}a(jx,"getGroupRoleId");async function Qx(e){if(!e||!e.userGroups)return e;let t=await Qf(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 N.context.doInWorkspaceContext(o,async()=>{if(e.roles[o])return;let s=await Wf(t,o);s&&(e.roles[o]=s)});let n=await jf(e,{groups:t});if(n.length&&!e.builder?.global){let o=e.builder?.apps||[];e.builder={apps:o.concat(n)}}return e}a(Qx,"enrichUserRolesFromGroups");async function La(){return await z.fetch()}a(La,"fetch");async function _r(e){return await z.get(e)}a(_r,"get");async function Qf(e,t={enriched:!0}){return await z.getBulk(e,t)}a(Qf,"getBulk");async function Gf(e){if(await z.getByName(e))throw new Bn(e)}a(Gf,"guardNameAvailability");async function Ff(e){let t=await z.getGroupUsers(e._id);if(!t.length)return 0;let n=await N.tenancy.getGlobalDB().getMultiple(t.map(s=>s._id));return(await N.userUtils.creatorsInList(n)).filter(s=>s).length}a(Ff,"getCreatorsCountInGroup");async function Gn(e){let t=[],r=!e._id,n=0;if(delete e.users,!e._id)e._id=z.generateUserGroupID(),await Gf(e.name),t.push(N.events.group.created(e));else{let s=await z.get(e._id);if(s.name!==e.name&&await Gf(e.name),t.push(N.events.group.updated(e)),JSON.stringify(s.roles)!==JSON.stringify(e.roles)){let i=s.users?.length||0,u=0;i>0&&(u=await Ff(s)),Object.values(e.roles).includes("CREATOR")?n=i-u:n=-i,t.push(N.events.group.permissionsEdited(e))}}await Promise.all(t);let o=a(()=>z.save(e),"saveGroup");if(r)return await Bs(o);{let s=await o();if(n>0)await kn(0,n);else if(n<0){let i=await Ff(e),u=Math.abs(n)-i;u>0&&await vr(0,u)}return s}}a(Gn,"save");async function Qs(e,t){let r;try{r=await z.get(e)}catch{throw new Error("Group not found")}let n=Object.values(r.roles||{}).includes("CREATOR"),o=a(()=>{},"recalculateCreatorsQuotasFn");if(n){let i=N.tenancy.getGlobalDB(),u=await z.getGroupUsers(e),f=(await Promise.all(u.map(E=>i.get(E._id)))).map(E=>({...E,userGroups:E.userGroups.filter(M=>M!==e)})),h=(await N.userUtils.creatorsInList(f)).filter(E=>E).length,y=u.length-h;y&&(o=a(()=>vr(0,y),"recalculateCreatorsQuotasFn"))}let s=await z.destroy(e,t);return await N.events.group.deleted(r),await Gs(),await o(),s}a(Qs,"remove");async function Fn(e,t){let r=await z.get(e),n=await N.users.bulkGetGlobalUsersById(t),o=[];for(let c of n)c.userGroups||(c.userGroups=[]),c.userGroups.includes(e)||o.push(c);if(!o.length)return o;let s=o.map(c=>({...c,userGroups:[...c?.userGroups||[],e]}));if(await N.users.bulkUpdateGlobalUsers(s),Object.values(r.roles||{}).includes("CREATOR")){let f=(await N.userUtils.creatorsInList(o)).filter(h=>h).length,g=o.length-f;g&&await kn(0,g)}let u=[];for(let c of t)u.push(N.cache.user.invalidateUser(c));return await Promise.all(u),await N.events.group.usersAdded(s.length,r,t),s}a(Fn,"addUsers");async function Ks(e,t){let r=await z.get(e),n=await N.users.bulkGetGlobalUsersById(t),o=[];for(let u of n){if(!u.userGroups||!u.userGroups.includes(e))continue;let c=u.userGroups.indexOf(e);u.userGroups.splice(c,1),o.push(u)}if(await N.users.bulkUpdateGlobalUsers(o),Object.values(r.roles||{}).includes("CREATOR")){let c=(await N.userUtils.creatorsInList(o)).filter(g=>g).length,f=o.length-c;f&&await vr(0,f)}let i=[];for(let u of t)i.push(N.cache.user.invalidateUser(u));return await Promise.all(i),o.length&&await N.events.group.usersDeleted(o.length,r,t),o}a(Ks,"removeUsers");async function Vs(e,t){let r=await _r(e);if(r.roles||(r.roles={}),t.appsToAdd)for(let n of t.appsToAdd)r.roles[n.appId]=n.roleId;if(t.appsToRemove)for(let n of t.appsToRemove)delete r.roles[n.appId];if(r.builder={apps:Object.entries(r.roles).filter(([n,o])=>o==="CREATOR").map(([n])=>n)},r.builder.apps.length&&!Us())throw new N.HTTPError("Feature not enabled, please check license",400);return await Gn(r)}a(Vs,"updateGroupApps");async function Kx(e){let t=await La(),r=[];for(let n of t)!n.roles||!n.roles[e]||(delete n.roles[e],r.push(n));return await z.bulkSave(r)}a(Kx,"cleanupApp");async function Vx(){if(!await qs()){let e=N.tenancy.getGlobalDB(),r=(await La()||[]).filter(n=>Object.values(n?.roles||{}).includes("CREATOR"));for(let n of r){let o=await z.getGroupUsers(n._id),i=(await Promise.all(o.map(g=>e.get(g._id)))).map(g=>({...g,userGroups:g.userGroups.filter(h=>h!==n._id)})),c=(await N.userUtils.creatorsInList(i)).filter(g=>g).length,f=o.length-c;await z.save({...n,roles:{}}),f&&await vr(0,f)}}}a(Vx,"adjustGroupCreatorsQuotas");Hs.users.UserDB.init(ft,re,Ze);var Ke=Hs.users.UserDB;var Qn={};x(Qn,{logs:()=>ti});var ti={};x(ti,{logSearch:()=>rC,oldestLogDate:()=>Xf,storeLog:()=>aC});var jn=require("@budibase/backend-core"),Jf=require("@budibase/types");var ge=require("@budibase/backend-core"),$n=require("@budibase/types");var Kf=require("@budibase/backend-core");async function Vf(e,t){let r,n=5,o=!1,s,i=!0;for(;n>0;n--)try{i?s=await e():s=await exports.randomDelay(e),o=!0;break}catch(u){r=u}return o||Kf.logging.logWarn(`Failed to backoff: ${t}`,r),s}a(Vf,"backOff");var{SEPARATOR:wt,UNICODE_MAX:Hx,DocumentType:Hf,AutomationViewMode:Ys,ViewName:Yx,getQueryIndex:zx}=ge.db,Jx=new Date(0).toISOString(),Xx=100,zs=a(async()=>sn($n.ConstantQuotaName.AUTOMATION_LOG_RETENTION_DAYS),"oldestLogDate");function Yf(e,t,{status:r,automationId:n}={},o={}){let s=n?`${n}${wt}`:"",i=r?`${r}${wt}`:"",u;return r&&n?u=`${Ys.ALL}${wt}${i}${s}`:r?u=`${Ys.STATUS}${wt}${i}`:n?u=`${Ys.AUTOMATION}${wt}${s}`:u=`${Hf.AUTOMATION_LOG}${wt}`,{...o,descending:!0,startkey:`${u}${t}${Hx}`,endkey:`${u}${e}`}}a(Yf,"getAutomationLogParams");function Zx(e,t,r){return`${Hf.AUTOMATION_LOG}${wt}${e}${wt}${r}${wt}${t}`}a(Zx,"generateAutomationLogID");async function Js(e,t,r={docs:!0}){let n=ge.context.getProdWorkspaceDB();await n.exists()||(n=ge.context.getDevWorkspaceDB());let o={status:r.status},s=r?.limit?r.limit:r?.paginate?9+1:void 0,i=Yf(e,t,o,{include_docs:r.docs,limit:s});r?.page&&(i.startkey=r.page);let u=await n.allDocs(i);return oa(u,{paginate:r?.paginate,pageSize:9})}a(Js,"getAllLogs");async function Xs(e,t,r={}){let n=ge.context.getProdWorkspaceDB();await n.exists()||(n=ge.context.getDevWorkspaceDB());let o;try{let s={automationId:r?.automationId,status:r?.status},i=Yf(e,t,s,{include_docs:!0,limit:9+1});r?.page&&(i.startkey=r.page),o=await n.query(zx(Yx.AUTOMATION_LOGS),i)}catch(s){if(s!=null&&(s.name==="not_found"||s.error==="not_found"))return await Tc(),Xs(e,t,r);throw s}return oa(o,{paginate:!0,pageSize:9})}a(Xs,"getLogsByView");async function zf(e,t){let r=ge.context.getProdWorkspaceDB(),n=e._id,o=e.name,s=new Date().toISOString(),i=Zx(s,t.status,n),u={...t,automationId:n,status:t.status,automationName:o,createdAt:s,_id:i};return await r.put(u),i}a(zf,"writeLog");async function Zs(e,{clearing:t}={clearing:!1}){let r=ge.context.getProdWorkspaceDB();await Vf(async()=>{let n=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]}`,u={};n.automationErrors&&(u=n.automationErrors),Array.isArray(u[i])||(u[i]=[]);let c=u[i].indexOf(o);t&&c!==-1?u[i].splice(c,1):u[i].push(o),u[i].length===0&&delete u[i],n.automationErrors=u}await r.put(n),await ge.cache.workspace.invalidateWorkspaceMetadata(n.appId,n)},"Failed to update app metadata with automation log error")}a(Zs,"updateAppMetadataWithErrors");async function eC(){let e=await zs();try{return await Js(Jx,e,{docs:!1,paginate:!1,limit:Xx})}catch{return{data:[],hasNextPage:!1}}}a(eC,"getExpiredLogs");async function ei(){let e=ge.context.getProdWorkspaceDB();try{let t=await eC();if(!t.data||t.data.length===0)return;let r=t.data.map(o=>({_id:o.id,_rev:o.value.rev,_deleted:!0})),n=t.data.filter(o=>{let s=o.id.split(ge.db.SEPARATOR);return s[s.length-1]===$n.AutomationStatus.ERROR}).map(o=>o.id);await e.bulkDocs(r),n.length&&await Zs(n,{clearing:!0})}catch(t){ge.logging.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}a(ei,"clearOldHistory");var Xf=zs;async function tC(e,t,r,n){let o,s=new Date().toISOString(),i=await Xf();return(!e||e<i)&&(e=i),r||t?o=await Xs(e,s,{automationId:r,status:t,page:n}):o=await Js(e,s,{status:t,page:n,docs:!0,paginate:!0}),o}a(tC,"getLogs");async function rC(e){return await ei(),await tC(e.startDate,e.status,e.automationId,e.page)}a(rC,"logSearch");async function aC(e,t){if(!jn.db.isProdWorkspaceID(jn.context.getWorkspaceId()))return;let r=await zf(e,t);t.status===Jf.AutomationStatus.ERROR&&await Zs([r]),await ei()}a(aC,"storeLog");var Kn={};x(Kn,{checkPluginQuotas:()=>sC,deletePlugin:()=>oC,storePlugin:()=>nC});var rm=require("@budibase/types"),fe=require("@budibase/backend-core");var Zf=F(require("fs")),em=require("path");function tm(e,t){return Zf.default.readFileSync((0,em.join)(e,t),"utf8")}a(tm,"loadJSFile");async function nC(metadata,directory,source,origin){let db=fe.tenancy.getGlobalDB(),version=metadata.package.version,name=metadata.package.name,description=metadata.package.description,hash=metadata.schema.hash,bucketPath=fe.objectStore.getPluginS3Dir(name),files=await fe.objectStore.uploadDirectory(fe.objectStore.ObjectStoreBuckets.PLUGINS,directory,bucketPath),jsFile=files.find(e=>e.name.endsWith(".js")),iconFile=files.find(e=>e.name.endsWith(".svg"));if(!jsFile)throw new Error("Plugin missing .js file.");if(metadata.schema.type===rm.PluginType.DATASOURCE){let js=tm(directory,jsFile.name);try{eval(js)}catch(e){let t=e?.message?e.message:JSON.stringify(e);throw new Error(`JS invalid: ${t}`)}}let iconFileName=iconFile?iconFile.name:null,pluginId=fe.db.generatePluginID(name),rev;try{rev=(await db.get(pluginId))._rev}catch(e){rev=void 0}let doc={_id:pluginId,_rev:rev,...metadata,name,version,hash,description,source};iconFileName&&(doc.iconFileName=iconFileName),source&&(doc={...doc,source}),origin&&origin.source==="github"&&(doc.origin=origin);let write=a(async()=>{let e=await db.put(doc);return await fe.events.plugin.imported(doc),{...doc,_rev:e.rev}},"write");return rev?await write():await Fs(write)}a(nC,"storePlugin");async function oC(e){let t=fe.tenancy.getGlobalDB();try{let r=await t.get(e),n=fe.objectStore.getPluginS3Dir(r.name);await fe.objectStore.deleteFolder(fe.objectStore.ObjectStoreBuckets.PLUGINS,n),await t.remove(e,r._rev),await fe.events.plugin.deleted(r),await Ws()}catch(r){let n=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${n}`)}}a(oC,"deletePlugin");async function sC(){let e=fe.tenancy.getGlobalDB();try{let r=(await e.allDocs(fe.db.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await $s(r)}catch(t){fe.logging.logAlert("Unable to retrieve plugins for quota check",t)}}a(sC,"checkPluginQuotas");var mt={};x(mt,{fetch:()=>uC,fetchValues:()=>cC,isEncryptionKeyAvailable:()=>iC,isValid:()=>om,remove:()=>lC,update:()=>pC});var am=require("@budibase/backend-core"),Pa=require("@budibase/types");function iC(){return!!am.env.ENCRYPTION_KEY}a(iC,"isEncryptionKeyAvailable");async function uC(){let e=await jt.get();return Object.keys(e.variables)}a(uC,"fetch");async function cC(e){let r=(await jt.get()).variables,n={};for(let[o,s]of Object.entries(r))switch(e){case Pa.Environment.DEVELOPMENT:n[o]=s.development;break;case Pa.Environment.PRODUCTION:default:n[o]=s.production;break}return n}a(cC,"fetchValues");async function nm(e){if(!(await ct.cache.getCachedLicense()).features.includes(Pa.Feature.ENVIRONMENT_VARIABLES))throw new Error("User does not have access to environment variables feature.");let r=await jt.get();r.variables=e(r.variables),await jt.update(r)}a(nm,"changeValues");async function pC(e,t){if(om(e))await nm(n=>(n[e]=t,n));else throw new Error("Variable name has characters that are not allowed")}a(pC,"update");async function lC(e){await nm(t=>(delete t[e],t))}a(lC,"remove");function om(e){return/^[a-zA-Z0-9-_]+$/.test(e)}a(om,"isValid");var kt={};x(kt,{definitions:()=>wC,download:()=>SC,fetch:()=>IC,write:()=>AC});var Pe=require("@budibase/backend-core"),Hn=require("@budibase/types");var ue=require("@budibase/backend-core"),tt=require("@budibase/types");var sm=require("memorystream"),im=new ue.sql.Sql(tt.SqlClient.SQL_LITE);async function dC(e,t,r){let n={operation:tt.Operation.READ,table:or.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:tt.SortOrder.DESCENDING,type:tt.SortType.STRING}}},o=im._query(n);if(Array.isArray(o))throw new Error("Cannot execute multiple queries for audit log search");return{sql:o.sql,bindings:o.bindings}}a(dC,"getAuditLogSqlQuery");function fC(e){return`${ue.DocumentType.AUDIT_LOG}${ue.SEPARATOR}${e}${ue.SEPARATOR}${ue.utils.newid()}`}a(fC,"generateAuditLogID");async function um(e){e._id||(e._id=fC(e.timestamp)),e.type||(e.type=tt.AUDIT_LOG_TYPE);try{let r=await ue.context.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){ue.logging.logAlert("Failed to write audit log",t)}}a(um,"save");async function ri(e,t,r){t||(t=1);let n=ue.context.getAuditLogsDB();try{let o=9+1,s=await dC(e,t,o),i=or.searchTable(),u=im.convertJsonStringColumns(i,await n.sql(s.sql,s.bindings)),c;u.length>o&&(c=u.pop());let f={rows:u,hasNextPage:!!c};return f.hasNextPage&&(f.bookmark=t+1),f}catch(o){if(o.status===404&&!r?.isRetry)return await mC(),await cc(),await ri(e,t,{isRetry:!0});throw o}}a(ri,"searchSQL");async function mC(){let e=ue.context.getAuditLogsDB(),r=(await e.allDocs(ue.db.getDocParams(ue.DocumentType.AUDIT_LOG,null,{include_docs:!0}))).rows.map(n=>n.doc).filter(n=>n&&!n.type).map(n=>({...n,type:tt.AUDIT_LOG_TYPE}));await e.bulkDocs(r)}a(mC,"migrate");function cm(e){let t=ue.context.getAuditLogsDB(),r=new sm,n=t.dump(r,{filter:s=>{let i=s;if(!i._id?.startsWith(ue.DocumentType.AUDIT_LOG))return!1;let u=!0,c=a((f,g)=>{!f||f.length===0||(u=!!(u&&g&&f.includes(g)))},"matcher");if(c(e.userIds,i.userId),c(e.appIds,i.appId),c(e.events,i.event),(e.startDate||e.endDate)&&(u=u&&i.timestamp>=e.startDate&&i.timestamp<=e.endDate),e.fullSearch){let f=JSON.stringify(s);u=u&&f.includes(e.fullSearch)}return u}}),o=new sm;return r.on("data",s=>{let i=JSON.parse(Buffer.from(s).toString());if(Array.isArray(i.docs)){let u="";for(let c of i.docs)u+=JSON.stringify(c)+`
38
- `;o.write(u)}}),r.on("end",()=>{o.end()}),{promise:n,stream:o}}a(cm,"dump");var Ua=require("@budibase/backend-core"),qa=require("@budibase/string-templates"),Vn=require("@budibase/types");var hC=Ua.constants.MIN_VALID_DATE.toISOString(),yC=Ua.constants.MAX_VALID_DATE.toISOString();function ai(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||hC,e.endDate=e.endDate||yC),e}a(ai,"fillDates");async function pm(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(n=>Ua.db.getProdWorkspaceID(n)));let t={};function r(n,o){o?.length&&(t.oneOf={...t.oneOf,[n]:o})}return a(r,"addStringParams"),r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=ai(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}a(pm,"getSearchFilters");function ni(e,t,r){let n={_id:e,status:Vn.AuditLogResourceStatus.DELETED};switch(t){case"app":n.name=r?.appName;break;case"user":n.email=r?.email;break}return n}a(ni,"deleted");function oi(e){let t=(0,qa.findHBSBlocks)(e);for(let r of t){let n=` "${r}"`;e=e.replace(e.includes(n)?n:` ${r}`,""),e=(0,qa.processStringSync)(e,{})}return e}a(oi,"removeTemplateStrings");function lm(e,t){let r=Vn.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let n=(0,qa.processStringSync)(r,t);return n.includes('""')&&(n=oi(r)),n}a(lm,"getEventFriendlyName");async function AC(e,t,r){if(!await Pn()||!Pe.utils.isAudited(e))return;let n=lm(e,t),o=new Date;r?.timestamp&&(o=new Date(r.timestamp));let s={timestamp:o.toISOString(),event:e,name:n,userId:r?.userId||Hn.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){s.appId=Pe.db.getProdWorkspaceID(r.appId);let u=await Pe.cache.workspace.getWorkspaceMetadata(r.appId);"name"in u&&(i.appName=u.name)}if(r?.userId){let u=await Pe.users.getById(r?.userId);i.email=u.email}}catch(u){Pe.logging.logAlert("Failed to retrieve fallback information for audit log",u)}return s.fallback=i,await um(s)}a(AC,"write");async function bC(e){let t=e.map(u=>u.userId),n=e.filter(u=>u.appId).map(u=>Pe.db.getDevWorkspaceID(u.appId)),o=await Pe.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),s=await Pe.db.getWorkspacesByIDs([...new Set(n)]),i=[];for(let u of e){let c=o.find(h=>h?._id===u.userId),f=s.find(h=>Pe.db.isSameWorkspaceID(h?.appId,u.appId)),g={event:u.event,timestamp:u.timestamp,name:u.name,metadata:u.metadata,user:c||ni(u.userId,"user",u.fallback)};u.appId&&(g.app=f||ni(u.appId,"app",u.fallback)),i.push(g)}return i}a(bC,"enrich");async function IC(e){if(!await Pn())throw new Error("Audit logs not available - license required.");let t=await pm(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await ri(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await bC(r.rows)}}a(IC,"fetch");function SC(e){return e=ai(e),cm(e)}a(SC,"download");function wC(){let e=Object.entries(Hn.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=oi(r[1]);return t}a(wC,"definitions");var Yn={};x(Yn,{applications:()=>ci,roles:()=>ii,users:()=>si});var si={};x(si,{roleCheck:()=>EC});function TC(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}a(TC,"removeRoles");async function EC(e,t){return await It()||TC(e,t),e}a(EC,"roleCheck");var ii={};x(ii,{assign:()=>RC,unAssign:()=>vC});var Da=require("@budibase/backend-core");async function RC(e,t){if(!await It())throw new Error("Unable to assign roles - license required.");let r=await Ke.bulkGet(e);for(let n of r){if(t.role&&t.role.roleId){let o=Da.db.getProdWorkspaceID(t.role.appId);n.roles[o]=t.role.roleId}if(t.appBuilder){let o=Da.db.getProdWorkspaceID(t.appBuilder.appId),s=n.builder?.apps||[];n.builder={apps:s.concat([o])}}t.builder&&(n.builder={global:!0}),t.admin&&(n.admin={global:!0}),n.roles}await Ke.bulkUpdate(r)}a(RC,"assign");async function vC(e,t){if(!await It())throw new Error("Unable to un-assign roles - license required.");let r=await Ke.bulkGet(e);for(let n of r){if(t.role){let o=Da.db.getProdWorkspaceID(t.role?.appId);n.roles[o]===t.role.roleId&&delete n.roles[o]}if(t.appBuilder&&n.builder?.apps){let o=Da.db.getProdWorkspaceID(t.appBuilder.appId);n.builder.apps=n.builder.apps.filter(s=>s!==o)}t.builder&&n.builder&&delete n.builder,t.admin&&n.admin&&delete n.admin}}a(vC,"unAssign");var ci={};x(ci,{buildExportFn:()=>xC,buildImportFn:()=>_C});var ui=require("@budibase/backend-core");function _C(e){return async(t,r)=>{await It()||t.throw(403,"Endpoint unavailable, license required."),t.request.files?.appExport||t.throw(400,"Must provide app export file for import."),await ui.context.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}a(_C,"buildImportFn");function xC(e){return async(t,r)=>{await It()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:n,excludeRows:o}=t.request.body;await ui.context.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:n,excludeRows:o},t.query.appId=t.params.appId,await e(t),await r()})}}a(xC,"buildExportFn");var Se=require("@budibase/backend-core"),Ie=require("@budibase/types"),mm=F(require("fs")),gm=require("path");var pi=require("@budibase/backend-core");var dm;function fm(){dm=new pi.queue.BudibaseQueue(pi.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}a(fm,"init");function Jt(){return dm}a(Jt,"getBackupQueue");async function li(e,t={}){return je.storeAppBackupMetadata(e,t)}a(li,"storeAppBackupMetadata");function hm(e){let t=new Date().toISOString();switch(e){case Ie.BackupStatus.COMPLETE:case Ie.BackupStatus.FAILED:return{timestamp:t,finishedAt:t};case Ie.BackupStatus.STARTED:return{timestamp:t,startedAt:t};case Ie.BackupStatus.PENDING:return{timestamp:t,createdAt:t}}}a(hm,"getTimestamps");async function CC(e,t,r,n){let o=await zn(e);return await je.storeAppBackupMetadata({...o,...hm(t),contents:r,status:t,type:Ie.BackupType.BACKUP},{filename:n,docId:e})}a(CC,"updateBackupStatus");async function OC(e,t,r){let n=await zn(e);return await je.storeAppBackupMetadata({...n,...hm(r),status:r,type:Ie.BackupType.RESTORE,trigger:Ie.BackupTrigger.MANUAL},{docId:e,docRev:t})}a(OC,"updateRestoreStatus");async function zn(e){return je.getAppBackupMetadata(e)}a(zn,"getAppBackup");async function LC(e,t){return je.updateAppBackupMetadata(e,t)}a(LC,"updateAppBackup");async function ym(e){let t=await je.getAppBackupMetadata(e);return t.filename&&await Se.objectStore.deleteFile(Se.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),je.deleteAppBackupMetadata(e)}a(ym,"deleteAppBackup");async function PC(e){let t=[];for(let r of e)try{await ym(r),t.push({backupId:r,success:!0})}catch(n){t.push({backupId:r,success:!1,error:n instanceof Error?n.message:"Unknown error"})}return t}a(PC,"deleteAppBackups");async function UC(e,t){return je.fetchAppBackups(e,t)}a(UC,"fetchAppBackups");async function Am(e){let t=await je.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let{stream:r}=await Se.objectStore.getReadStream(Se.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}a(Am,"getBackupDownloadStream");async function qC(e){let{stream:t}=await Am(e),r=(0,gm.join)(Se.objectStore.budibaseTempDir(),Se.utils.newid()),n=mm.default.createWriteStream(r);return new Promise((o,s)=>{t.on("error",s),n.on("error",s),t.pipe(n).on("close",()=>o(r))})}a(qC,"downloadAppBackup");async function DC(e,t,r={}){let n;try{n=await li({appId:e,trigger:t,timestamp:new Date().toISOString(),status:Ie.BackupStatus.PENDING,type:Ie.BackupType.BACKUP,...r})}catch(o){if(o.status===409)return;throw o}return await Jt().add({docId:n.id,docRev:n.rev,appId:e,export:{trigger:t,...r}}),await Se.events.backup.appBackupTriggered(e,n.id,Ie.BackupType.BACKUP,t,r?.name),n.id}a(DC,"triggerAppBackup");async function kC(e,t,r,n){let o=await zn(t),s;try{s=await li({appId:e,timestamp:new Date().toISOString(),status:Ie.BackupStatus.PENDING,type:Ie.BackupType.RESTORE,createdBy:n})}catch(i){if(i?.status===409)return;throw i}return await Jt().add({appId:e,docId:s.id,docRev:s.rev,import:{nameForBackup:r,backupId:t,createdBy:n}}),{restoreId:s.id,metadata:o}}a(kC,"triggerAppRestore");async function MC(e,t,r){let n=Se.db.getProdWorkspaceID(e);await Se.context.doInWorkspaceContext(n,async()=>{let o=Se.context.getProdWorkspaceDB();if(!await o.exists())return;let i=await o.tryGet(Ie.DocumentType.WORKSPACE_METADATA);i&&(i.backupErrors||(i.backupErrors={}),i.backupErrors[t]||(i.backupErrors[t]=[]),i.backupErrors[t].push(r),await o.put(i),await Se.cache.workspace.invalidateWorkspaceMetadata(i.appId,i))})}a(MC,"trackBackupError");var NC={isEnabled:Ls,triggerAppRestore:xe(kC),triggerAppBackup:xe(DC),getBackupDownloadStream:xe(Am),downloadAppBackup:xe(qC),fetchAppBackups:xe(UC),storeAppBackupMetadata:xe(li),updateBackupStatus:xe(CC),updateRestoreStatus:xe(OC),getAppBackup:xe(zn),updateAppBackup:xe(LC),deleteAppBackup:xe(ym),deleteAppBackups:xe(PC),trackBackupError:xe(MC)},Ve=NC;var fi={};x(fi,{init:()=>di});var ae=require("@budibase/backend-core"),rt=require("@budibase/types"),xr=F(require("fs"));async function di(e){Jt().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),FC(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),GC(t,e)}catch(n){ae.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,n)}})}a(di,"init");async function BC(e){await ae.db.getDB(e,{skip_setup:!0}).destroy()}a(BC,"removeExistingApp");async function bm(e,t,r,n){let o=ae.db.getDevWorkspaceID(r),s=ae.db.getProdWorkspaceID(r),i=new Date().toISOString(),u=a(async(c,f)=>{n?.doc?await Ve.updateBackupStatus(n.doc.id,c,f?.contents,f?.filename):await Ve.storeAppBackupMetadata({appId:s,timestamp:i,trigger:e,status:c,name:n?.name,type:rt.BackupType.BACKUP,contents:f?.contents,createdBy:n?.createdBy},{filename:f?.filename})},"updateMetadata");try{let c=await n.processing.exportAppFn(o,{tar:!0}),f=await n.processing.statsFn(o),g=`${s}/backup-${i}.tar.gz`,h=ae.objectStore.ObjectStoreBuckets.BACKUPS,y=xr.default.createReadStream(c);await ae.objectStore.streamUpload({bucket:h,filename:g,stream:y,extra:{type:"application/gzip",metadata:{name:n?.name,trigger:e,timestamp:i,appId:s}}}),await u(rt.BackupStatus.COMPLETE,{filename:g,contents:f}),xr.default.existsSync(c)&&xr.default.rmSync(c)}catch(c){ae.logging.logAlert("App backup error",c),await u(rt.BackupStatus.FAILED);let f=n?.doc?.id||`backup-${i}`,g=c instanceof Error?c.message:String(c);await Ve.trackBackupError(s,f,`Backup export failed: ${g}`)}}a(bm,"runBackup");async function GC(e,t){let r=e.data,n=r.appId,o=r.import.backupId,s=r.import.nameForBackup,i=r.import.createdBy,u=ae.tenancy.getTenantIDFromWorkspaceID(n);return ae.tenancy.doInTenant(u,async()=>{let c=ae.db.getDevWorkspaceID(n),f=`${c}_temp_${Date.now()}`,{rev:g}=await Ve.updateRestoreStatus(r.docId,r.docRev,rt.BackupStatus.STARTED);await bm(rt.BackupTrigger.RESTORING,u,n,{processing:t,createdBy:i,name:s});let h=await Ve.downloadAppBackup(o),y=rt.BackupStatus.COMPLETE;try{await t.importAppFn(f,ae.db.getDB(f),{file:{type:"application/gzip",path:h},key:h}),await BC(c),await new ae.db.Replication({source:f,target:c}).replicate()}catch(E){ae.logging.logAlert("App restore error",E),y=rt.BackupStatus.FAILED;let M=E instanceof Error?E.message:String(E);await Ve.trackBackupError(n,o,`Backup restore failed: ${M}`)}finally{try{await ae.db.getDB(f,{skip_setup:!0}).destroy()}catch{}}await Ve.updateRestoreStatus(r.docId,g,y),xr.default.existsSync(h)&&xr.default.rmSync(h,{force:!0})})}a(GC,"importProcessor");async function FC(e,t){let r=e.data,n=r.appId,o=r.export.trigger,s=r.export.name,i=ae.tenancy.getTenantIDFromWorkspaceID(n);await ae.tenancy.doInTenant(i,async()=>{try{let{rev:u}=await Ve.updateBackupStatus(r.docId,rt.BackupStatus.STARTED);return bm(o,i,n,{processing:t,doc:{id:r.docId,rev:u},name:s})}catch(u){ae.logging.logAlert("App backup error",u);let c=u instanceof Error?u.message:String(u);await Ve.trackBackupError(n,r.docId,`Backup export failed: ${c}`)}})}a(FC,"exportProcessor");var WC=a(async e=>{fm(),await di(e.processing)},"init"),Ne={...Ve,processing:fi,init:WC,getBackupQueue:Jt};var Im=a(async e=>{e.backups&&await Ne.init(e.backups)},"init");var qe={};x(qe,{create:()=>DN,find:()=>qN,get:()=>UN,remove:()=>MN,update:()=>kN});var WA=F(iu()),Tt=require("@budibase/backend-core");var $A=require("@budibase/types");async function UN(e){let t=Tt.tenancy.getGlobalDB(),r=new Tt.db.QueryBuilder(t.name,$A.SearchIndex.USER);r.setIndexBuilder(Tt.db.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[o,s]of Object.entries(e.filters?.equal??{}))r.addEqual(o,s);r.setSort("_id"),r.setSkip(e.skip);let n=await r.run();return{users:n.rows,total:n.totalRows}}a(UN,"get");async function qN(e){return await Tt.users.getById(e)}a(qN,"find");async function DN(e){let t=await Ke.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new Tt.HTTPError("User is already synched",409);e={...t,scimInfo:(0,WA.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Ke.save(e,{requirePassword:!1})}a(DN,"create");async function kN(e,t){return await Ke.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}a(kN,"update");async function MN(e){return await Ke.destroy(e)}a(MN,"remove");var qr={};x(qr,{create:()=>NN});var jA=F(iu());var QA=require("@budibase/backend-core");async function NN(e){let t=await ko(e.name),r;if(!t)r=(await re.save(e)).id;else{if(t.scimInfo?.isSync)throw new QA.HTTPError("Group is already synched",409);r=t._id,t.users&&(await re.removeUsers(r,t.users.map(o=>o._id)),delete t.users),t.scimInfo=(0,jA.default)(t.scimInfo,e.scimInfo),await re.save(t)}return await re.get(r)}a(NN,"create");var Zt={};x(Zt,{logRequest:()=>FN,logResponse:()=>WN});var at=require("@budibase/backend-core"),VA=F(KA());var{DocWritethrough:BN}=at.cache.docWritethrough;function GN(){return`${at.db.DocumentType.SCIM_LOG}${at.db.SEPARATOR}${(0,VA.default)().format("YYYYMMDD")}`}a(GN,"getLogDocId");var HA=a(()=>{let e=at.context.getScimDBName();return new BN(at.db.getDB(e),GN())},"getDB");async function FN(e){at.logging.logWarn("SCIM request log",e);let t=Date.now().toString();return await HA().patch({[`${t}_request`]:{ts:new Date().toISOString(),...e}}),t}a(FN,"logRequest");async function WN(e,t){at.logging.logWarn("SCIM response",t),await HA().patch({[`${e}_response`]:{ts:new Date().toISOString(),...t}})}a(WN,"logResponse");var hu={};x(hu,{doInScimContext:()=>lu,feature:()=>we,internalGroupOnly:()=>Ga,licenseAuth:()=>gu,licensing:()=>YA,requireSCIM:()=>du,scimGroupOnly:()=>Ba,scimUserOnly:()=>Na});var Mt=require("@budibase/backend-core");var co=require("@budibase/types");var $N=a((e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(Mt.env.SELF_HOSTED&&Mt.env.DEFAULT_LICENSE)return t.user.license=Mo,r();t.user.license=await ct.cache.getCachedLicense(t,{populateLicense:e.populateLicense,populateFreeLicense:e.populateFreeLicense}),e.checkUsersLimit&&(Mt.utils.isServingApp(t)||Mt.utils.isServingBuilder(t)||Mt.utils.isServingBuilderPreview(t)||Mt.utils.isPublicApiRequest(t))&&await ft.usageLimitIsExceeded({name:co.StaticQuotaName.USERS,type:co.QuotaUsageType.STATIC,usageChange:0})}return r()},"licensing"),YA=$N;var we={};x(we,{requireFeature:()=>jN,requireFeatures:()=>QN});var jN=a(e=>async(t,r)=>{await Ln(e),await r()},"requireFeature"),QN=a((...e)=>async(t,r)=>{await Os(e),await r()},"requireFeatures");var po=require("@budibase/backend-core");var lu=a(async(e,t)=>{let r;return po.env.ENABLE_SCIM_LOGGER&&(r=await Zt.logRequest({...e.request.toJSON(),body:e.request.body})),await po.context.doInScimContext(async()=>{let n=await t();return r&&await Zt.logResponse(r,{...e.response.toJSON(),body:e.response.body}),n})},"doInScimContext");var du=a(async(e,t)=>{await Ds(),await t()},"requireSCIM");var zA=require("@budibase/backend-core");var Na=a(e=>fu(zA.users.getById,e,!0),"scimUserOnly"),Ba=a(e=>fu(z.get,e,!0),"scimGroupOnly"),Ga=a(e=>fu(z.get,e,!1),"internalGroupOnly");function fu(e,t,r){return async(n,o)=>{let s=n.params[t];return typeof s!="string"&&n.throw(404),!!(await e(s)).scimInfo?.isSync!==r&&n.throw(404),o()}}a(fu,"scimSyncChecks");var Fa=require("@budibase/backend-core");var mu=require("dd-trace");async function gu(e,t){await mu.tracer.trace("licenseAuth",async r=>{let n=e.request.headers[Fa.constants.Header.LICENSE_KEY];Array.isArray(n)&&(n=n[0]),r.addTags({licenseKey:n}),n||e.throw(403,"License key not provided");let o=await vs(n);o||(r.addTags({licenseFound:!1}),e.throw(403,"License not found or invalid")),o.tenantId||e.throw(403,"License does not have a tenant ID"),mu.tracer.setUser({id:"anonymous",tenantId:o.tenantId}),await Fa.context.doInSelfHostTenantUsingCloud(o.tenantId,async()=>{await Fa.context.doInLicenseContext(o,async()=>{await t()})})})}a(gu,"default");var wu={};x(wu,{appBackups:()=>sb,auditLogs:()=>gb,environmentVariables:()=>Eb,groups:()=>kb,scim:()=>dI});var Et=require("@budibase/backend-core"),fo=require("@budibase/types"),nb=F(require("@koa/router")),tr=F(require("joi"));var lo=require("@budibase/backend-core"),yu=require("@budibase/types");async function er(e,t){t||e.throw(400,"App ID missing"),await cr.workspaceExists(t)||e.throw(400,`Provided app ID: ${t} - is invalid.`)}a(er,"checkAppID");async function JA(e){let t=e.params.appId;await er(e,t);let{body:r}=e.request,n=e.user?._id,o=await Ne.triggerAppBackup(t,yu.BackupTrigger.MANUAL,{name:r.name,createdBy:n});o||e.throw(500,"Unable to start backup."),e.body={backupId:o,message:"Backup triggered - process starting."}}a(JA,"manualBackup");async function XA(e){let t=e.params.appId;await er(e,t);let r=e.params.backupId,n=e.request.body.name,o=await Ne.triggerAppRestore(t,r,n,e.user?._id);o||e.throw(500,"Unable to start restore."),await lo.events.backup.appBackupRestored(o.metadata),e.body={restoreId:o?.restoreId,message:"Restore triggered - process starting."}}a(XA,"importBackup");async function ZA(e){let t=e.params.appId;await er(e,t);let r=e.params.backupId;await Ne.deleteAppBackup(r),e.body={message:"Backup deleted successfully."}}a(ZA,"deleteBackup");async function eb(e){let t=lo.context.getWorkspaceId();await er(e,t);let{backupIds:r}=e.request.body;(!Array.isArray(r)||r.length===0)&&e.throw(400,"backupIds must be a non-empty array");let n=await Ne.deleteAppBackups(r),o=n.filter(i=>i.success).length,s=n.length-o;e.body={message:`${o} backups deleted successfully${s>0?`, ${s} failed`:""}.`,results:n,successCount:o,failureCount:s}}a(eb,"deleteBackups");async function tb(e){let t=e.params.appId;await er(e,t);let r=e.request.body;r?.trigger&&(r.trigger=r.trigger.toLowerCase(),Object.values(yu.BackupTrigger).includes(r.trigger)||e.throw(400,"Provided trigger is not a valid option.")),e.body=await Ne.fetchAppBackups(t,{paginate:!0,...r})}a(tb,"fetchBackups");async function rb(e){let t=e.params.appId;await er(e,t);let r=e.params.backupId,n=e.request.body;e.body=await Ne.updateAppBackup(r,n.name)}a(rb,"updateBackup");async function ab(e){let t=e.params.appId;await er(e,t);let r=e.params.backupId,{metadata:n,stream:o}=await Ne.getBackupDownloadStream(r);e.attachment(`backup-${n.timestamp}.tar.gz`),e.body=o}a(ab,"downloadBackup");var ob=new nb.default;function VN(){return Et.auth.joiValidator.body(tr.default.object({trigger:tr.default.string().valid(...Object.values(fo.BackupTrigger)),type:tr.default.string().valid(...Object.values(fo.BackupType)),startDate:tr.default.date(),endDate:tr.default.date(),page:tr.default.string()}))}a(VN,"validateBackupSearch");ob.post("/api/apps/:appId/backups",Et.auth.builderOrAdmin,JA).post("/api/apps/:appId/backups/search",Et.auth.builderOrAdmin,VN(),tb).get("/api/apps/:appId/backups/:backupId/file",Et.auth.builderOrAdmin,ab).patch("/api/apps/:appId/backups/:backupId",Et.auth.builderOrAdmin,rb).delete("/api/apps/:appId/backups/:backupId",Et.auth.builderOrAdmin,ZA).delete("/api/apps/:appId/backups",Et.auth.builderOrAdmin,eb).post("/api/apps/:appId/backups/:backupId/import",Et.auth.builderOrAdmin,XA);var sb=ob;var Au=require("@budibase/backend-core");async function ib(e){let t=e.request.body,r=await kt.fetch(t);await Au.events.auditLog.filtered(t),e.body=r}a(ib,"search");async function ub(e){let t=e.request.body,{stream:r}=kt.download(t);await Au.events.auditLog.downloaded(t),e.attachment(`audit-logs-${Date.now()}.log`),e.body=r}a(ub,"download");async function cb(e){e.body={events:kt.definitions()}}a(cb,"definitions");var lb=require("@budibase/types"),rr=require("@budibase/backend-core"),fb=F(require("@koa/router")),He=F(require("joi"));function pb(){return rr.auth.joiValidator.body(He.default.object({userIds:He.default.array().items(He.default.string()).optional(),appIds:He.default.array().items(He.default.string()).optional(),events:He.default.array().items(He.default.string().valid(...Object.values(lb.Event))).optional(),startDate:He.default.string().optional().allow(""),endDate:He.default.string().optional().allow(""),fullSearch:He.default.string().optional().allow(""),bookmark:He.default.number()}))}a(pb,"buildAuditLogSearchValidator");var mb=new fb.default;mb.post("/api/global/auditlogs/search",rr.auth.adminOnly,pb(),ib).get("/api/global/auditlogs/download",rr.auth.adminOnly,rr.middleware.querystringToBody,pb(),ub).get("/api/global/auditlogs/definitions",rr.auth.adminOnly,cb);var gb=mb;var Iu=require("@budibase/backend-core"),bu=require("@budibase/types");async function hb(e){e.body={encryptionKeyAvailable:mt.isEncryptionKeyAvailable()}}a(hb,"status");async function yb(e){e.body={variables:await mt.fetch()}}a(yb,"fetch");async function Ab(e){let{name:t,production:r,development:n}=e.request.body;await mt.update(t,{production:r,development:n});let o=[bu.Environment.PRODUCTION];r!==n&&o.push(bu.Environment.DEVELOPMENT),await Iu.events.environmentVariable.created(t,o),e.body={message:`Environment variable "${t}" created.`}}a(Ab,"create");async function bb(e){let{production:t,development:r}=e.request.body,n=e.params.varName;await mt.update(n,{production:t,development:r}),e.body={message:`Environment variable "${n}" updated.`}}a(bb,"update");async function Ib(e){let t=e.params.varName;await mt.remove(t),await Iu.events.environmentVariable.deleted(t),e.body={message:`Environment variable "${t}" deleted.`}}a(Ib,"destroy");var ar=require("@budibase/backend-core"),wb=F(require("@koa/router")),Wa=F(require("joi"));var Tb=new wb.default;function Sb(){return ar.auth.joiValidator.body(Wa.default.object({name:Wa.default.string().optional(),production:Wa.default.string().required(),development:Wa.default.string().required()}))}a(Sb,"buildEnvVarUpdateValidator");Tb.get("/api/env/variables/status",ar.auth.builderOrAdmin,hb).get("/api/env/variables",ar.auth.builderOrAdmin,yb).post("/api/env/variables",ar.auth.builderOrAdmin,Sb(),Ab).patch("/api/env/variables/:varName",ar.auth.builderOrAdmin,Sb(),bb).delete("/api/env/variables/:varName",ar.auth.builderOrAdmin,Ib);var Eb=Tb;var gt=require("@budibase/backend-core"),Rt=require("@budibase/types"),qb=F(require("@koa/router")),Ce=F(require("joi"));var Rb=require("@budibase/backend-core");async function vb(e){let t=e.request.body;if(t.name=t.name.trim(),delete t.roles,t._id){let n=await _r(t._id);t.roles=n.roles,t.scimInfo=n.scimInfo}let r=await Gn(t);e.body={_id:r.id,_rev:r.rev}}a(vb,"save");async function _b(e){let t=e.params.groupId,r=e.request.body.add,n=e.request.body.remove;(r&&!Array.isArray(r)||n&&!Array.isArray(n))&&e.throw(400,"Must supply a list of users to add or to remove");let o,s;r&&(o=await Fn(t,r)),n&&(s=await Ks(t,n)),e.body={added:o,removed:s}}a(_b,"updateGroupUsers");async function xb(e){let t=e.params.groupId,r=e.request.body.add,n=e.request.body.remove;(r&&!Array.isArray(r)||n&&!Array.isArray(n))&&e.throw(400,"Must supply a list of objects, with appId and roleId to add or remove"),e.body=await Vs(t,{appsToAdd:r,appsToRemove:n})}a(xb,"updateGroupApps");async function Cb(e){e.body={data:await La()}}a(Cb,"fetch");async function Ob(e){let{groupId:t,rev:r}=e.params;try{await Qs(t,r),e.body={message:"Group deleted successfully"}}catch(n){e.throw(n.status,n)}}a(Ob,"destroy");async function Lb(e){try{e.body=await _r(e.params.groupId)}catch(t){e.throw(t.status,t)}}a(Lb,"find");async function Pb(e){let{pageSize:t=10,bookmark:r,emailSearch:n}=e.request.query,o=e.params.groupId,s={limit:t+1},i=await nn(o,{...s,emailSearch:n,bookmark:r}),u=n?i[t]?.email:i[t]?._id,c=!!u;e.body={users:i.slice(0,t),bookmark:u,hasNextPage:c}}a(Pb,"searchUsers");async function Ub(e){let{groupId:t}=e.params,{csvContent:r}=e.request.body;(r===void 0||r.trim().length===0)&&e.throw(400,"CSV is empty");let n=await Rb.csv.jsonFromCsvString(r,{allowSingleColumn:!0});(!n||n.length===0)&&e.throw(400,"CSV file is invalid");let s=Object.keys(n[0]).find(h=>/^(email|e-mail|email address|mail|e_mail)$/i.test(h.trim()));s||e.throw(400,"CSV file must contain an email column");let i=Array.from(new Set(n.map(h=>h[s]).filter(h=>h&&typeof h=="string"&&h.trim().length>0).map(h=>h.trim())));i.length===0&&e.throw(400,"No valid email addresses found in CSV");try{await _r(t)}catch(h){if(h.status===404)e.throw(404,"Group not found");else throw h}let u=[],c=[],f=[],g=await Promise.all(i.map(h=>Ke.getUserByEmail(h)));for(let h of i){let y=g.find(E=>E?.email===h);y?(u.push({_id:y._id,email:y.email}),f.push(y._id)):c.push({email:h,reason:"User not found"})}f.length>0&&await Fn(t,f),e.body={added:u,skipped:c}}a(Ub,"bulkAddUsersFromCsv");var Db=new qb.default;function JN(){return gt.auth.joiValidator.body(Ce.default.object({_id:Ce.default.string().optional(),_rev:Ce.default.string().optional(),color:Ce.default.string().required(),icon:Ce.default.string().required(),name:Ce.default.string().trim().required().max(50),role:Ce.default.string().optional(),users:Ce.default.array().optional(),apps:Ce.default.array().optional(),roles:Ce.default.object().optional(),createdAt:Ce.default.string().optional(),updatedAt:Ce.default.string().optional()}).required())}a(JN,"buildGroupSaveValidation");Db.post("/api/global/groups",gt.auth.adminOnly,we.requireFeature(Rt.Feature.USER_GROUPS),JN(),vb).get("/api/global/groups",we.requireFeature(Rt.Feature.USER_GROUPS),Cb).delete("/api/global/groups/:groupId/:rev",we.requireFeature(Rt.Feature.USER_GROUPS),gt.auth.adminOnly,Ga("groupId"),Ob).get("/api/global/groups/:groupId",we.requireFeature(Rt.Feature.USER_GROUPS),gt.auth.builderOrAdmin,Lb).get("/api/global/groups/:groupId/users",we.requireFeature(Rt.Feature.USER_GROUPS),gt.auth.builderOrAdmin,Pb).post("/api/global/groups/:groupId/users",gt.auth.adminOnly,we.requireFeature(Rt.Feature.USER_GROUPS),Ga("groupId"),_b).post("/api/global/groups/:groupId/users/bulk",gt.auth.adminOnly,we.requireFeature(Rt.Feature.USER_GROUPS),Ga("groupId"),gt.auth.joiValidator.body(Ce.default.object({csvContent:Ce.default.string().required()}).required()),Ub).post("/api/global/groups/:groupId/apps",gt.auth.builderOrAdmin,we.requireFeature(Rt.Feature.USER_GROUPS),xb);var kb=Db;var lI=F(require("@koa/router"));var mo=require("scim-patch");var Nb=require("@budibase/backend-core");function Mb(e,t){let r=e.request.query[t];if(r!==void 0)return+r}a(Mb,"tryGetQueryAsNumber");var Bb=a(async e=>{let t=Mb(e,"pageSize")??20,r=Mb(e,"startIndex"),n;e.request.query.filter&&(n=ce.user.userFilters(e.request.query.filter));let o=await qe.get({pageSize:t,skip:r,filters:n});e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:o.total,Resources:o.users.map(ce.user.toScimUserResponse),startIndex:(r||0)+1,itemsPerPage:t}},"get"),Gb=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404);let r=await qe.find(t);e.body=ce.user.toScimUserResponse(r)},"find"),Fb=a(async e=>{let t=ce.user.fromScimUser(e.request.body);try{let r=await qe.create(t);e.body=ce.user.toScimUserResponse(r)}catch(r){throw r instanceof Nb.EmailUnavailableError&&e.throw(409,"Email already in use"),r}},"create");function XN(e){let t=e.Operations.find(r=>(r.op==="Replace"||r.op==="replace")&&r.path==="active");return t?t.value===!1||t.value?.toLowerCase?.()==="false":!1}a(XN,"isDeactivation");var Wb=a(async e=>{let t=await qe.find(e.params.id);t||e.throw(404);let r=ce.user.toScimUserResponse(t),n=e.request.body;try{(0,mo.patchBodyValidation)(n)}catch{}if(XN(n))return Su(e);let o;try{o=(0,mo.scimPatch)(r,n.Operations)}catch{}o||e.throw(500);let s=ce.user.fromScimUser(o);await qe.update(s,{allowChangingEmail:!0}),e.body=ce.user.toScimUserResponse(s)},"update"),Su=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404),await qe.remove(t),e.status=204},"remove");var aI=F(rI()),nI=require("@budibase/shared-core"),go=require("scim-patch");var ho=require("scim2-parse-filter");function oI(e,t){for(let r of t.split(","))delete e[r]}a(oI,"cleanResponse");var sI=a(async e=>{let r=(await re.fetch()).filter(s=>s.scimInfo?.isSync).map(ce.group.toScimGroupResponse),{filter:n,excludedAttributes:o}=e.request.query;if(n){let s=(0,ho.filter)((0,ho.parse)(n));r=r.filter(s)}o&&r.forEach(s=>{oI(s,o)}),e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:r.length,Resources:r,startIndex:1,itemsPerPage:r.length}},"get"),iI=a(async e=>{let t=ce.group.fromScimGroup(e.request.body),r=await qr.create(t);e.body=ce.group.toScimGroupResponse(r)},"create"),uI=a(async e=>{let{id:t}=e.params,r=await re.get(t),n=ce.group.toScimGroupResponse(r),{excludedAttributes:o}=e.request.query;o&&oI(n,o),e.body=n},"find"),cI=a(async e=>{let{id:t}=e.params,r=await re.get(t);await re.remove(t,r._rev),e.status=204},"remove"),pI=a(async e=>{let{id:t}=e.params,r=await re.get(t),n=ce.group.toScimGroupResponse(r),o=e.request.body;try{(0,go.patchBodyValidation)(o)}catch{e.throw(400)}let{true:s,false:i}=(0,aI.default)(o.Operations,u=>u.path==="members");if(i?.length){let u=(0,go.scimPatch)(n,i);u||e.throw(500);let c={...ce.group.fromScimGroup(u),_rev:r._rev};await re.save(c)}if(s?.length){let u=[],c=[];for(let{op:f,value:g}of s)switch(f){case"add":case"Add":for(let h of g)u.push(await qe.find(h.value));break;case"remove":case"Remove":for(let h of g)try{c.push(await qe.find(h.value))}catch(y){if(y.status!==404)throw y}break;case"replace":case"Replace":throw new Error("Replacing members is not allowed");default:nI.utils.unreachable(f)}u.length&&await re.addUsers(t,u.map(f=>f._id)),c.length&&await re.removeUsers(t,c.map(f=>f._id))}e.body=ce.group.toScimGroupResponse(await re.get(t))},"update");var $a=require("@budibase/types"),Be=new lI.default({prefix:"/api/global/scim/v2"});Be.use(du);Be.use(lu);Be.get("/users",Bb);Be.get("/users/:id",Na("id"),Gb);Be.post("/users",Fb);Be.patch("/users/:id",Na("id"),Wb);Be.delete("/users/:id",Na("id"),Su);Be.get("/groups",sI);Be.post("/groups",we.requireFeature($a.Feature.USER_GROUPS),iI);Be.get("/groups/:id",we.requireFeature($a.Feature.USER_GROUPS),Ba("id"),uI);Be.delete("/groups/:id",we.requireFeature($a.Feature.USER_GROUPS),Ba("id"),cI);Be.patch("/groups/:id",we.requireFeature($a.Feature.USER_GROUPS),Ba("id"),pI);var dI=Be;var ce={};x(ce,{group:()=>Eu,user:()=>Tu});var Tu={};x(Tu,{fromScimUser:()=>vB,toScimUserResponse:()=>TB,userFilters:()=>_B});var fI=require("@budibase/backend-core"),mI=require("@budibase/shared-core"),yo=require("@budibase/types"),gI=require("scim2-parse-filter");var{unreachable:wB}=mI.utils,TB=a(e=>{let{isSync:t,roles:r,...n}=e.scimInfo||{},o={...n,schemas:["urn:ietf:params:scim:schemas:core:2.0:User"],id:e._id,meta:{resourceType:"User",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},active:e.status===yo.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"),EB=a(e=>!!e?.id,"isScimUserResponse");function RB(e){if(fI.utils.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}a(RB,"tryGetEmail");var vB=a(e=>{let t=EB(e)?e:void 0,r=RB(e);if(!r)throw new Error("Email is required");let n;switch(e.active){case"True":case"true":case!0:n=!0;break;case"False":case"false":case!1:n=!1;break;default:wB(e.active)}let o,s;return e.name?.givenName?(o=e.name?.givenName,s=e.name?.familyName):o=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:o,lastName:s,scimInfo:{...e,isSync:!0},roles:{},status:n?yo.UserStatus.ACTIVE:yo.UserStatus.INACTIVE,createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimUser"),_B=a(e=>{let t={equal:{}},r=(0,gI.parse)(e);function n(o){switch(o.op){case"eq":{let s=o.attrPath,i;switch(s){case"emails.value":i="email";break;default:i=`scimInfo.${s}`}t.equal[i]=o.compValue;break}case"and":for(let s of o.filters)n(s);break;default:console.warn("Filter not handled",{filter:o})}}return a(n,"parseFilters"),n(r),t},"userFilters");var Eu={};x(Eu,{fromScimGroup:()=>OB,toScimGroupResponse:()=>xB});var xB=a(e=>({schemas:["urn:ietf:params:scim:schemas:core:2.0:Group"],id:e._id,externalId:e.scimInfo.externalId,meta:{resourceType:"Group",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},displayName:e.name,members:e.users?.map(t=>({value:t._id}))}),"toScimGroupResponse"),CB=a(e=>!!e?.id,"isScimGroup"),OB=a(e=>{let t=CB(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 Hu={};x(Hu,{LLM:()=>ht,LLMRequest:()=>se,TableGeneration:()=>Vu,agentHistoryTitleSystemPrompt:()=>GB,agentSystemPrompt:()=>BB,aiColumnSchemas:()=>Qu,aiTableResponseToTableSchema:()=>Fu,appendAIColumns:()=>Wu,classifyText:()=>_u,cleanData:()=>xu,extractFileData:()=>DB,generateAIColumns:()=>Bu,generateCode:()=>NB,generateCronExpression:()=>Cu,generateData:()=>Gu,generateJs:()=>Uu,generateSQL:()=>MB,generateTables:()=>Nu,generationStructure:()=>ju,getChatLLM:()=>_I,getLLM:()=>Ka,getLLMConfig:()=>Mu,getLLMOrThrow:()=>vI,normalizeContentType:()=>Ru,parseResponseFormat:()=>bo,sanitiseToolName:()=>LB,searchWeb:()=>Pu,sentimentAnalysis:()=>Lu,summarizeText:()=>Ao,tableDataStructuredOutput:()=>Ku,translate:()=>Ou});var ja=require("@budibase/types");function LB(e){if(e.length>64)throw new Error("Tool name must be under 64 characters long");return e.replace(/[^a-zA-Z0-9_-]/g,"_")}a(LB,"sanitiseToolName");function Ru(e){return e?e.includes("/")?e:{[ja.SupportedFileType.PDF]:"application/pdf",[ja.SupportedFileType.JPG]:"image/jpeg",[ja.SupportedFileType.JPEG]:"image/jpeg",[ja.SupportedFileType.PNG]:"image/png"}[e.toLowerCase()]||"application/octet-stream":"application/octet-stream"}a(Ru,"normalizeContentType");var Eo=require("@budibase/types");var yt=require("@budibase/backend-core"),SI=require("@budibase/types"),Dr=require("dd-trace"),wI=require("openai/helpers/zod"),TI=require("zod");var Io=F(require("openai"));var Nt=require("@budibase/types");var hI=require("@budibase/shared-core");var Bt=F(require("dd-trace"));function vu(e,t){return t.map(r=>e[r]).join(" ")}a(vu,"extractTextFromColumns");var ht=class{static{a(this,"LLM")}constructor({model:t,apiKey:r,maxTokens:n}){this._model=t,this._apiKey=r,this._maxTokens=n??parseInt(process.env.BUDIBASE_AI_MAX_PROMPT_TOKENS||"1000")}get model(){return this._model}get apiKey(){return this._apiKey}get maxTokens(){return this._maxTokens}async prompt(t){return await Bt.default.trace("prompt",async()=>{let r=typeof t=="string"?new se().addUserMessage(t):t,{messages:n,tokensUsed:o}=await Bt.default.trace("chatCompletion",()=>this.chatCompletion(r));return!n||n.length===0?{message:"",tokensUsed:o}:{message:n[n.length-1].content||"",tokensUsed:o}})}async chat(t){return await Bt.default.trace("chat",async()=>await this.chatCompletion(t))}async*chatStream(t){yield*this.chatCompletionStream(t)}async summarizeText(t){return Bt.default.trace("summarizeText",()=>this.prompt(Ao(t)))}async generateCronExpression(t){return Bt.default.trace("generateCronExpression",()=>this.prompt(Cu(t)))}async operation(t,r){return Bt.default.trace("operation",n=>{n.addTags({operation:t.operation,rowId:r.id});let o=this.promptForOperation(t,r);return this.prompt(o)})}promptForOperation(t,r){let{operation:n,column:o,columns:s,language:i,categories:u,prompt:c}=t;switch(n){case Nt.AIOperationEnum.SUMMARISE_TEXT:return Ao(vu(r,s));case Nt.AIOperationEnum.CLEAN_DATA:return xu(r[o]);case Nt.AIOperationEnum.TRANSLATE:return Ou(r[o],i);case Nt.AIOperationEnum.CATEGORISE_TEXT:if(!u)throw Error("No categories provided for categorise text operation. Please provide categories.");return _u(vu(r,s),u.split(","));case Nt.AIOperationEnum.SENTIMENT_ANALYSIS:return Lu(r[o]);case Nt.AIOperationEnum.PROMPT:return c;case Nt.AIOperationEnum.SEARCH_WEB:return Pu(vu(r,s));default:throw hI.utils.unreachable(n)}}async generateJs(t,r){return await Bt.default.trace("generateJs",async()=>{let{bindings:n=[],snippets:o=[]}=r||{};return await this.prompt(Uu(n,o).addUserMessage(t))})}};var AI=require("@budibase/types"),qu=require("openai/helpers/zod");var Qa=(n=>(n.GPT_5_MINI="gpt-5-mini",n.GPT_5="gpt-5",n.GPT_5_NANO="gpt-5-nano",n))(Qa||{});function bo(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}a(bo,"parseResponseFormat");function yI(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}a(yI,"calculateBudibaseAICredits");var Ge=class extends ht{constructor(r){super(r);this.client=this.getClient(r)}static{a(this,"OpenAI")}getVerbosityForModel(){if(Object.values(Qa).includes(this.model))return"low"}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new Io.default({apiKey:r.apiKey,baseURL:r.baseUrl})}async uploadFile(r,n,o){let s=Ru(o);if(AI.ImageContentTypes.includes(s.toLowerCase())){let c;if(Buffer.isBuffer(r))c=r;else{let g=[];for await(let h of r)g.push(new Uint8Array(h));c=Buffer.concat(g)}let f=c.toString("base64");return`data:${s};base64,${f}`}let i=await(0,Io.toFile)(r,n);return(await this.client.files.create({file:i,purpose:"assistants"})).id}async chatCompletion(r){let n={model:this.model,messages:r.messages,max_completion_tokens:this._maxTokens,response_format:bo(r.format)};if(Object.values(Qa).includes(this.model)){let i=this.getVerbosityForModel();i&&(n.verbosity=i),n.reasoning_effort="minimal"}r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(qu.zodFunction));let o=await this.client.chat.completions.create(n),s=o?.choices?.[0]?.message;if(s?.tool_calls){r.addMessage(s);let i=[];for(let u of s.tool_calls){if(u.type!=="function"||!u.function){console.warn(`[OPENAI TOOL WARN] Unsupported tool call type: ${u.type}`);continue}let c=u.function.name,f=r.findTool(c);if(!f)throw new Error(`Tool ${c} not found in prompt tools`);let g=JSON.parse(u.function.arguments);i.push(f.handler(g).then(h=>({role:"tool",tool_call_id:u.id,content:h})).catch(h=>(console.error(`[OPENAI TOOL ERROR] Tool ${c} failed in OpenAI handler:`,h),{role:"tool",tool_call_id:u.id,content:`Error: ${h.message}`})))}return r.addMessages(await Promise.all(i)),this.chatCompletion(r)}else{if(s?.content)return{messages:[...r.messages,{role:s.role,content:s.content}],tokensUsed:yI(o.usage)};throw new Error("No response found")}}async*chatCompletionStream(r){let n={model:this.model,messages:r.messages,max_tokens:this.maxTokens,response_format:bo(r.format),stream:!0};r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(qu.zodFunction));try{let o=await this.client.chat.completions.create(n),s=null,i="",u=null;for await(let f of o){let g=f?.choices?.[0]?.delta;if(g){if(g.content&&(i+=g.content,yield{type:"content",content:g.content}),g.tool_calls&&g.tool_calls.length>0){let h=g.tool_calls[0];h.id?(s={id:h.id,name:h.function?.name||"",arguments:h.function?.arguments||""},yield{type:"tool_call_start",toolCall:{id:s.id,name:s.name,arguments:s.arguments}}):s&&h.function?.arguments&&(s.arguments+=h.function.arguments,yield{type:"tool_call_start",toolCall:{id:s.id,name:s.name,arguments:s.arguments}})}f.usage&&(u=f.usage)}}let c=u?yI(u):0;if(s){r.addMessage({role:"assistant",content:"",tool_calls:[{id:s.id,type:"function",function:{name:s.name,arguments:s.arguments}}]});let f=r.findTool(s.name);if(f)try{let g=JSON.parse(s.arguments),h=await f.handler(g);yield{type:"tool_call_result",toolResult:{id:s.id,result:h}},r.addMessage({role:"tool",tool_call_id:s.id,content:h}),yield*this.chatCompletionStream(r);return}catch(g){yield{type:"tool_call_result",toolResult:{id:s.id,result:`Error: ${g.message}`,error:g.message}},r.addMessage({role:"tool",tool_call_id:s.id,content:`Error: ${g.message}`}),yield*this.chatCompletionStream(r);return}else{let g=`Tool '${s.name}' not found`;yield{type:"tool_call_result",toolResult:{id:s.id,result:g,error:g}},r.addMessage({role:"tool",tool_call_id:s.id,content:g}),yield*this.chatCompletionStream(r);return}}i&&r.addMessage({role:"assistant",content:i}),yield{type:"done",messages:r.messages,tokensUsed:c}}catch(o){yield{type:"error",content:o.message}}}};var Du=F(require("@anthropic-ai/sdk"));function PB(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}a(PB,"calculateBudibaseAICredits");var So=class extends ht{constructor(r){super(r);this.client=new Du.default({apiKey:r.apiKey})}static{a(this,"Anthropic")}firstTextBlock(r){for(let n of r.content)if(n.type==="text")return n.text}async uploadFile(r,n,o){throw new Error("File upload not supported for this LLM provider")}async chatCompletion(r){try{let n=await this.client.messages.create({model:this.model,messages:r.messages.map(({content:s})=>{if(s==null)return{role:"user",content:""};if(typeof s=="string")return{role:"user",content:s};let i="";for(let u of s)u.type==="text"?i+=u.text:["image_url","input_audio","file"].includes(u.type);return{role:"user",content:i}}),max_tokens:this.maxTokens}),o=this.firstTextBlock(n)||"";return{messages:[...r.messages,{role:"assistant",content:o}],tokensUsed:PB(n.usage)}}catch(n){throw n instanceof Du.default.APIError&&console.error(`Anthropic Prompt failed with error ${n.name} and status: ${n.status}`),n}}async*chatCompletionStream(r){try{let n=await this.chatCompletion(r);if(n.messages.length>0){let o=n.messages[n.messages.length-1];o.content&&(yield{type:"content",content:o.content})}yield{type:"done",messages:n.messages,tokensUsed:n.tokensUsed}}catch(n){yield{type:"error",content:n.message}}}};var bI=require("openai");var wo=class extends Ge{static{a(this,"AzureOpenAI")}getClient(t){if(!t.apiKey)throw new Error("No Azure OpenAI API key found");if(!t.model)throw new Error("No Azure OpenAI model specified");return new bI.AzureOpenAI({apiKey:t.apiKey,apiVersion:"2024-10-01-preview",baseURL:t.baseUrl})}getVerbosityForModel(){return Object.values(Qa).includes(this.model)?"medium":void 0}};var he=require("@budibase/backend-core"),II=require("@budibase/types");var ku=require("dd-trace");var To=class extends ht{static{a(this,"BudibaseAI")}async prompt(t){let r=await super.prompt(t);return r.tokensUsed&&await Nn(r.tokensUsed),r}async chat(t){let r=await super.chat(t);return r.tokensUsed&&await Nn(r.tokensUsed),r}async uploadFile(t,r,n){return he.env.SELF_HOSTED?this.uploadFileSelfHost(t,r,n):this.uploadFileCloud(t,r,n)}async uploadFileCloud(t,r,n){return new Ge({apiKey:he.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).uploadFile(t,r,n)}async uploadFileSelfHost(t,r,n){let o;if(Buffer.isBuffer(t))o=t;else{let g=[];for await(let h of t)g.push(new Uint8Array(h));o=Buffer.concat(g)}let s=o.toString("base64");if(n&&II.ImageContentTypes.includes(n.toLowerCase()))return`data:image/jpeg;base64,${s}`;if(!he.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let g=await Cn();if(!g)throw new Error("No license key found");this._apiKey=g}let i=`${he.env.BUDICLOUD_URL}/api/ai/upload-file`,u={method:"POST",headers:{"Content-Type":"application/json",[he.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:s,filename:r,contentType:n})};console.debug("[BudibaseAI] uploadFileSelfHost - Making network call",{url:i,method:u.method,headers:u.headers,bodyKeys:["data","filename","contentType"],filename:r,contentType:n});let c=await Ja(i,u);if(console.debug("[BudibaseAI] uploadFileSelfHost - Network response",{url:i,status:c.status,statusText:c.statusText,ok:c.ok}),!c.ok)throw await he.HTTPError.fromResponse(c);return(await c.json()).fileId}async chatCompletion(t){return he.env.SELF_HOSTED?this.chatCompletionSelfHost(t):this.chatCompletionCloud(t)}async chatCompletionCloud(t){return await ku.tracer.trace("chatCompletionCloud",async()=>await new Ge({apiKey:he.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletion(t))}async chatCompletionSelfHost(t){return await ku.tracer.trace("chatCompletionSelfHost",async r=>{if(!he.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(r.addTags({budicloudUrl:he.env.BUDICLOUD_URL}),!this._apiKey){let c=await Cn();if(!c)throw new Error("No license key found");this._apiKey=c,r.addTags({licenseKey:this._apiKey})}let n={messages:t.messages,format:t.format,useTools:t.tools.length>0},o=`${he.env.BUDICLOUD_URL}/api/ai/chat`,s={method:"POST",headers:{"Content-Type":"application/json",[he.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(n)};console.debug("[BudibaseAI] chatCompletionSelfHost - Making network call",{url:o,method:s.method,headers:s.headers,bodyKeys:Object.keys(n),messagesCount:t.messages.length,useTools:n.useTools,format:n.format});let i=await Ja(o,s);if(console.debug("[BudibaseAI] chatCompletionSelfHost - Network response",{url:o,status:i.status,statusText:i.statusText,ok:i.ok}),!i.ok)throw await he.HTTPError.fromResponse(i);let u=await i.json();return console.debug("[BudibaseAI] chatCompletionSelfHost - Response data",{url:o,tokensUsed:u.tokensUsed,messagesCount:u.messages?.length}),u})}async*chatCompletionStream(t){he.env.SELF_HOSTED?yield*this.chatCompletionStreamSelfHost(t):yield*this.chatCompletionStreamCloud(t)}async*chatCompletionStreamCloud(t){yield*new Ge({apiKey:he.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletionStream(t)}async*chatCompletionStreamSelfHost(t){console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Starting streaming (fallback to non-streaming)",{messagesCount:t.messages.length,toolsCount:t.tools.length});try{let r=await this.chatCompletionSelfHost(t);if(console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Yielding response chunks",{responseMessagesCount:r.messages.length,tokensUsed:r.tokensUsed}),r.messages.length>0){let n=r.messages[r.messages.length-1];n.content&&(yield{type:"content",content:n.content})}yield{type:"done",messages:r.messages,tokensUsed:r.tokensUsed}}catch(r){console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Error occurred",{error:r.message}),yield{type:"error",content:r.message}}}};var EI={OpenAI:"gpt-5-mini",TogetherAI:"gpt-5-mini",AzureOpenAI:"gpt-4.1",Custom:"gpt-5-mini",Anthropic:"claude-3-5-sonnet-20240620",BudibaseAI:"gpt-5-mini"},RI={OpenAI:Ge,TogetherAI:Ge,AzureOpenAI:wo,Custom:Ge,Anthropic:So,BudibaseAI:To,Chat:Ge};async function UB(){return await Dr.tracer.trace("getAIConfig",async e=>{let t={type:SI.ConfigType.AI,config:{}};if(!yt.context.isSelfHostUsingCloud()){let n=await yt.configs.getAIConfig();n&&(t=n)}await ks(t);let r=Object.values(t.config).find(n=>n.active&&n.isDefault);if(!r){e.addTags({enabled:!1,reason:"no provider found"});return}return e.addTags({enabled:!0}),{provider:r.provider,model:r.defaultModel||EI[r.provider],apiKey:r.apiKey,baseUrl:r.baseUrl}})}a(UB,"getAIConfig");async function qB(){return Dr.tracer.trace("getSelfHostOpenAIKeyConfig",e=>{if(!yt.env.SELF_HOSTED){e.addTags({enabled:!1,reason:"not self host"});return}if(!yt.env.OPENAI_API_KEY){e.addTags({enabled:!1,reason:"no OPENAI_API_KEY"});return}return e.addTags({enabled:!0}),{provider:"OpenAI",model:EI.OpenAI,apiKey:yt.env.OPENAI_API_KEY}})}a(qB,"getSelfHostOpenAIKeyConfig");async function Mu(){return Dr.tracer.trace("getLLMConfig",async()=>await UB()||await qB())}a(Mu,"getLLMConfig");async function Ka(e){return await Dr.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:n}=e||{},o=await Mu();if(!o){t.addTags({enabled:!1,reason:"no config found"});return}r&&(o.model=r),n&&(o.maxTokens=n);let s=RI[o.provider];if(!s){t.addTags({enabled:!1,reason:"no provider found",provider:o.provider});return}return new s(o)})}a(Ka,"getLLM");async function vI(){let e=await Ka();if(!e)throw new yt.HTTPError("No available LLM configurations",500);return e}a(vI,"getLLMOrThrow");async function _I(e){return await Dr.tracer.trace("getChatLLM",async()=>new RI.Chat(e))}a(_I,"getChatLLM");var se=class e{constructor(){this.messages=[];this.tools=[]}static{a(this,"LLMRequest")}addTool(t){return this.tools.push(t),this}addTools(t){return this.tools.push(...t),this}findTool(t){return this.tools.find(r=>r.name===t)}withFormat(t){return t instanceof TI.z.ZodType?this.format=(0,wI.zodResponseFormat)(t,"key"):this.format=t,this}addMessage(t){return this.messages.push(t),this}addMessages(t){return this.messages.push(...t),this}addUserMessage(t){return this.messages.push({role:"user",content:t}),this}addSystemMessage(t){return this.messages.push({role:"system",content:t}),this}static fromRequest(t){let r=new e;return t.messages&&r.addMessages(t.messages),t.format&&r.withFormat(t.format),r}};var vt=require("zod");function Ao(e,t){let r=`Summarize this text:
38
+ `;o.write(u)}}),r.on("end",()=>{o.end()}),{promise:n,stream:o}}a(cm,"dump");var Ua=require("@budibase/backend-core"),qa=require("@budibase/string-templates"),Vn=require("@budibase/types");var hC=Ua.constants.MIN_VALID_DATE.toISOString(),yC=Ua.constants.MAX_VALID_DATE.toISOString();function ai(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||hC,e.endDate=e.endDate||yC),e}a(ai,"fillDates");async function pm(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(n=>Ua.db.getProdWorkspaceID(n)));let t={};function r(n,o){o?.length&&(t.oneOf={...t.oneOf,[n]:o})}return a(r,"addStringParams"),r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=ai(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}a(pm,"getSearchFilters");function ni(e,t,r){let n={_id:e,status:Vn.AuditLogResourceStatus.DELETED};switch(t){case"app":n.name=r?.appName;break;case"user":n.email=r?.email;break}return n}a(ni,"deleted");function oi(e){let t=(0,qa.findHBSBlocks)(e);for(let r of t){let n=` "${r}"`;e=e.replace(e.includes(n)?n:` ${r}`,""),e=(0,qa.processStringSync)(e,{})}return e}a(oi,"removeTemplateStrings");function lm(e,t){let r=Vn.AuditedEventFriendlyName[e];if(!r)throw new Error("No friendly name found.");let n=(0,qa.processStringSync)(r,t);return n.includes('""')&&(n=oi(r)),n}a(lm,"getEventFriendlyName");async function AC(e,t,r){if(!await Pn()||!Pe.utils.isAudited(e))return;let n=lm(e,t),o=new Date;r?.timestamp&&(o=new Date(r.timestamp));let s={timestamp:o.toISOString(),event:e,name:n,userId:r?.userId||Hn.AuditLogSystemUser,metadata:{...t,...r?.hostInfo}},i={};try{if(r?.appId){s.appId=Pe.db.getProdWorkspaceID(r.appId);let u=await Pe.cache.workspace.getWorkspaceMetadata(r.appId);"name"in u&&(i.appName=u.name)}if(r?.userId){let u=await Pe.users.getById(r?.userId);i.email=u.email}}catch(u){Pe.logging.logAlert("Failed to retrieve fallback information for audit log",u)}return s.fallback=i,await um(s)}a(AC,"write");async function bC(e){let t=e.map(u=>u.userId),n=e.filter(u=>u.appId).map(u=>Pe.db.getDevWorkspaceID(u.appId)),o=await Pe.users.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),s=await Pe.db.getWorkspacesByIDs([...new Set(n)]),i=[];for(let u of e){let c=o.find(h=>h?._id===u.userId),f=s.find(h=>Pe.db.isSameWorkspaceID(h?.appId,u.appId)),g={event:u.event,timestamp:u.timestamp,name:u.name,metadata:u.metadata,user:c||ni(u.userId,"user",u.fallback)};u.appId&&(g.app=f||ni(u.appId,"app",u.fallback)),i.push(g)}return i}a(bC,"enrich");async function IC(e){if(!await Pn())throw new Error("Audit logs not available - license required.");let t=await pm(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await ri(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await bC(r.rows)}}a(IC,"fetch");function SC(e){return e=ai(e),cm(e)}a(SC,"download");function wC(){let e=Object.entries(Hn.AuditedEventFriendlyName).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=oi(r[1]);return t}a(wC,"definitions");var Yn={};x(Yn,{applications:()=>ci,roles:()=>ii,users:()=>si});var si={};x(si,{roleCheck:()=>EC});function TC(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}a(TC,"removeRoles");async function EC(e,t){return await It()||TC(e,t),e}a(EC,"roleCheck");var ii={};x(ii,{assign:()=>RC,unAssign:()=>vC});var Da=require("@budibase/backend-core");async function RC(e,t){if(!await It())throw new Error("Unable to assign roles - license required.");let r=await Ke.bulkGet(e);for(let n of r){if(t.role&&t.role.roleId){let o=Da.db.getProdWorkspaceID(t.role.appId);n.roles[o]=t.role.roleId}if(t.appBuilder){let o=Da.db.getProdWorkspaceID(t.appBuilder.appId),s=n.builder?.apps||[];n.builder={apps:s.concat([o])}}t.builder&&(n.builder={global:!0}),t.admin&&(n.admin={global:!0}),n.roles}await Ke.bulkUpdate(r)}a(RC,"assign");async function vC(e,t){if(!await It())throw new Error("Unable to un-assign roles - license required.");let r=await Ke.bulkGet(e);for(let n of r){if(t.role){let o=Da.db.getProdWorkspaceID(t.role?.appId);n.roles[o]===t.role.roleId&&delete n.roles[o]}if(t.appBuilder&&n.builder?.apps){let o=Da.db.getProdWorkspaceID(t.appBuilder.appId);n.builder.apps=n.builder.apps.filter(s=>s!==o)}t.builder&&n.builder&&delete n.builder,t.admin&&n.admin&&delete n.admin}}a(vC,"unAssign");var ci={};x(ci,{buildExportFn:()=>xC,buildImportFn:()=>_C});var ui=require("@budibase/backend-core");function _C(e){return async(t,r)=>{await It()||t.throw(403,"Endpoint unavailable, license required."),t.request.files?.appExport||t.throw(400,"Must provide app export file for import."),await ui.context.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}a(_C,"buildImportFn");function xC(e){return async(t,r)=>{await It()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:n,excludeRows:o}=t.request.body;await ui.context.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:n,excludeRows:o},t.query.appId=t.params.appId,await e(t),await r()})}}a(xC,"buildExportFn");var Se=require("@budibase/backend-core"),Ie=require("@budibase/types"),mm=F(require("fs")),gm=require("path");var pi=require("@budibase/backend-core");var dm;function fm(){dm=new pi.queue.BudibaseQueue(pi.queue.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}a(fm,"init");function Jt(){return dm}a(Jt,"getBackupQueue");async function li(e,t={}){return je.storeAppBackupMetadata(e,t)}a(li,"storeAppBackupMetadata");function hm(e){let t=new Date().toISOString();switch(e){case Ie.BackupStatus.COMPLETE:case Ie.BackupStatus.FAILED:return{timestamp:t,finishedAt:t};case Ie.BackupStatus.STARTED:return{timestamp:t,startedAt:t};case Ie.BackupStatus.PENDING:return{timestamp:t,createdAt:t}}}a(hm,"getTimestamps");async function CC(e,t,r,n){let o=await zn(e);return await je.storeAppBackupMetadata({...o,...hm(t),contents:r,status:t,type:Ie.BackupType.BACKUP},{filename:n,docId:e})}a(CC,"updateBackupStatus");async function OC(e,t,r){let n=await zn(e);return await je.storeAppBackupMetadata({...n,...hm(r),status:r,type:Ie.BackupType.RESTORE,trigger:Ie.BackupTrigger.MANUAL},{docId:e,docRev:t})}a(OC,"updateRestoreStatus");async function zn(e){return je.getAppBackupMetadata(e)}a(zn,"getAppBackup");async function LC(e,t){return je.updateAppBackupMetadata(e,t)}a(LC,"updateAppBackup");async function ym(e){let t=await je.getAppBackupMetadata(e);return t.filename&&await Se.objectStore.deleteFile(Se.objectStore.ObjectStoreBuckets.BACKUPS,t.filename),je.deleteAppBackupMetadata(e)}a(ym,"deleteAppBackup");async function PC(e){let t=[];for(let r of e)try{await ym(r),t.push({backupId:r,success:!0})}catch(n){t.push({backupId:r,success:!1,error:n instanceof Error?n.message:"Unknown error"})}return t}a(PC,"deleteAppBackups");async function UC(e,t){return je.fetchAppBackups(e,t)}a(UC,"fetchAppBackups");async function Am(e){let t=await je.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let{stream:r}=await Se.objectStore.getReadStream(Se.objectStore.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}a(Am,"getBackupDownloadStream");async function qC(e){let{stream:t}=await Am(e),r=(0,gm.join)(Se.objectStore.budibaseTempDir(),Se.utils.newid()),n=mm.default.createWriteStream(r);return new Promise((o,s)=>{t.on("error",s),n.on("error",s),t.pipe(n).on("close",()=>o(r))})}a(qC,"downloadAppBackup");async function DC(e,t,r={}){let n;try{n=await li({appId:e,trigger:t,timestamp:new Date().toISOString(),status:Ie.BackupStatus.PENDING,type:Ie.BackupType.BACKUP,...r})}catch(o){if(o.status===409)return;throw o}return await Jt().add({docId:n.id,docRev:n.rev,appId:e,export:{trigger:t,...r}}),await Se.events.backup.appBackupTriggered(e,n.id,Ie.BackupType.BACKUP,t,r?.name),n.id}a(DC,"triggerAppBackup");async function kC(e,t,r,n){let o=await zn(t),s;try{s=await li({appId:e,timestamp:new Date().toISOString(),status:Ie.BackupStatus.PENDING,type:Ie.BackupType.RESTORE,createdBy:n})}catch(i){if(i?.status===409)return;throw i}return await Jt().add({appId:e,docId:s.id,docRev:s.rev,import:{nameForBackup:r,backupId:t,createdBy:n}}),{restoreId:s.id,metadata:o}}a(kC,"triggerAppRestore");async function MC(e,t,r){let n=Se.db.getProdWorkspaceID(e);await Se.context.doInWorkspaceContext(n,async()=>{let o=Se.context.getProdWorkspaceDB();if(!await o.exists())return;let i=await o.tryGet(Ie.DocumentType.WORKSPACE_METADATA);i&&(i.backupErrors||(i.backupErrors={}),i.backupErrors[t]||(i.backupErrors[t]=[]),i.backupErrors[t].push(r),await o.put(i),await Se.cache.workspace.invalidateWorkspaceMetadata(i.appId,i))})}a(MC,"trackBackupError");var NC={isEnabled:Ls,triggerAppRestore:xe(kC),triggerAppBackup:xe(DC),getBackupDownloadStream:xe(Am),downloadAppBackup:xe(qC),fetchAppBackups:xe(UC),storeAppBackupMetadata:xe(li),updateBackupStatus:xe(CC),updateRestoreStatus:xe(OC),getAppBackup:xe(zn),updateAppBackup:xe(LC),deleteAppBackup:xe(ym),deleteAppBackups:xe(PC),trackBackupError:xe(MC)},Ve=NC;var fi={};x(fi,{init:()=>di});var ae=require("@budibase/backend-core"),rt=require("@budibase/types"),xr=F(require("fs"));async function di(e){Jt().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),FC(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),GC(t,e)}catch(n){ae.logging.logAlert(`Failed to perform backup for app ID: ${r.appId}`,n)}})}a(di,"init");async function BC(e){await ae.db.getDB(e,{skip_setup:!0}).destroy()}a(BC,"removeExistingApp");async function bm(e,t,r,n){let o=ae.db.getDevWorkspaceID(r),s=ae.db.getProdWorkspaceID(r),i=new Date().toISOString(),u=a(async(c,f)=>{n?.doc?await Ve.updateBackupStatus(n.doc.id,c,f?.contents,f?.filename):await Ve.storeAppBackupMetadata({appId:s,timestamp:i,trigger:e,status:c,name:n?.name,type:rt.BackupType.BACKUP,contents:f?.contents,createdBy:n?.createdBy},{filename:f?.filename})},"updateMetadata");try{let c=await n.processing.exportAppFn(o,{tar:!0}),f=await n.processing.statsFn(o),g=`${s}/backup-${i}.tar.gz`,h=ae.objectStore.ObjectStoreBuckets.BACKUPS,y=xr.default.createReadStream(c);await ae.objectStore.streamUpload({bucket:h,filename:g,stream:y,extra:{type:"application/gzip",metadata:{name:n?.name,trigger:e,timestamp:i,appId:s}}}),await u(rt.BackupStatus.COMPLETE,{filename:g,contents:f}),xr.default.existsSync(c)&&xr.default.rmSync(c)}catch(c){ae.logging.logAlert("App backup error",c),await u(rt.BackupStatus.FAILED);let f=n?.doc?.id||`backup-${i}`,g=c instanceof Error?c.message:String(c);await Ve.trackBackupError(s,f,`Backup export failed: ${g}`)}}a(bm,"runBackup");async function GC(e,t){let r=e.data,n=r.appId,o=r.import.backupId,s=r.import.nameForBackup,i=r.import.createdBy,u=ae.tenancy.getTenantIDFromWorkspaceID(n);return ae.tenancy.doInTenant(u,async()=>{let c=ae.db.getDevWorkspaceID(n),f=`${c}_temp_${Date.now()}`,{rev:g}=await Ve.updateRestoreStatus(r.docId,r.docRev,rt.BackupStatus.STARTED);await bm(rt.BackupTrigger.RESTORING,u,n,{processing:t,createdBy:i,name:s});let h=await Ve.downloadAppBackup(o),y=rt.BackupStatus.COMPLETE;try{await t.importAppFn(f,ae.db.getDB(f),{file:{type:"application/gzip",path:h},key:h}),await BC(c),await new ae.db.Replication({source:f,target:c}).replicate()}catch(E){ae.logging.logAlert("App restore error",E),y=rt.BackupStatus.FAILED;let M=E instanceof Error?E.message:String(E);await Ve.trackBackupError(n,o,`Backup restore failed: ${M}`)}finally{try{await ae.db.getDB(f,{skip_setup:!0}).destroy()}catch{}}await Ve.updateRestoreStatus(r.docId,g,y),xr.default.existsSync(h)&&xr.default.rmSync(h,{force:!0})})}a(GC,"importProcessor");async function FC(e,t){let r=e.data,n=r.appId,o=r.export.trigger,s=r.export.name,i=ae.tenancy.getTenantIDFromWorkspaceID(n);await ae.tenancy.doInTenant(i,async()=>{try{let{rev:u}=await Ve.updateBackupStatus(r.docId,rt.BackupStatus.STARTED);return bm(o,i,n,{processing:t,doc:{id:r.docId,rev:u},name:s})}catch(u){ae.logging.logAlert("App backup error",u);let c=u instanceof Error?u.message:String(u);await Ve.trackBackupError(n,r.docId,`Backup export failed: ${c}`)}})}a(FC,"exportProcessor");var WC=a(async e=>{fm(),await di(e.processing)},"init"),Ne={...Ve,processing:fi,init:WC,getBackupQueue:Jt};var Im=a(async e=>{e.backups&&await Ne.init(e.backups)},"init");var qe={};x(qe,{create:()=>DN,find:()=>qN,get:()=>UN,remove:()=>MN,update:()=>kN});var WA=F(iu()),Tt=require("@budibase/backend-core");var $A=require("@budibase/types");async function UN(e){let t=Tt.tenancy.getGlobalDB(),r=new Tt.db.QueryBuilder(t.name,$A.SearchIndex.USER);r.setIndexBuilder(Tt.db.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[o,s]of Object.entries(e.filters?.equal??{}))r.addEqual(o,s);r.setSort("_id"),r.setSkip(e.skip);let n=await r.run();return{users:n.rows,total:n.totalRows}}a(UN,"get");async function qN(e){return await Tt.users.getById(e)}a(qN,"find");async function DN(e){let t=await Ke.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new Tt.HTTPError("User is already synched",409);e={...t,scimInfo:(0,WA.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Ke.save(e,{requirePassword:!1})}a(DN,"create");async function kN(e,t){return await Ke.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}a(kN,"update");async function MN(e){return await Ke.destroy(e)}a(MN,"remove");var qr={};x(qr,{create:()=>NN});var jA=F(iu());var QA=require("@budibase/backend-core");async function NN(e){let t=await ko(e.name),r;if(!t)r=(await re.save(e)).id;else{if(t.scimInfo?.isSync)throw new QA.HTTPError("Group is already synched",409);r=t._id,t.users&&(await re.removeUsers(r,t.users.map(o=>o._id)),delete t.users),t.scimInfo=(0,jA.default)(t.scimInfo,e.scimInfo),await re.save(t)}return await re.get(r)}a(NN,"create");var Zt={};x(Zt,{logRequest:()=>FN,logResponse:()=>WN});var at=require("@budibase/backend-core"),VA=F(KA());var{DocWritethrough:BN}=at.cache.docWritethrough;function GN(){return`${at.db.DocumentType.SCIM_LOG}${at.db.SEPARATOR}${(0,VA.default)().format("YYYYMMDD")}`}a(GN,"getLogDocId");var HA=a(()=>{let e=at.context.getScimDBName();return new BN(at.db.getDB(e),GN())},"getDB");async function FN(e){at.logging.logWarn("SCIM request log",e);let t=Date.now().toString();return await HA().patch({[`${t}_request`]:{ts:new Date().toISOString(),...e}}),t}a(FN,"logRequest");async function WN(e,t){at.logging.logWarn("SCIM response",t),await HA().patch({[`${e}_response`]:{ts:new Date().toISOString(),...t}})}a(WN,"logResponse");var hu={};x(hu,{doInScimContext:()=>lu,feature:()=>we,internalGroupOnly:()=>Ga,licenseAuth:()=>gu,licensing:()=>YA,requireSCIM:()=>du,scimGroupOnly:()=>Ba,scimUserOnly:()=>Na});var Mt=require("@budibase/backend-core");var co=require("@budibase/types");var $N=a((e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(Mt.env.SELF_HOSTED&&Mt.env.DEFAULT_LICENSE)return t.user.license=Mo,r();t.user.license=await ct.cache.getCachedLicense(t,{populateLicense:e.populateLicense,populateFreeLicense:e.populateFreeLicense}),e.checkUsersLimit&&(Mt.utils.isServingApp(t)||Mt.utils.isServingBuilder(t)||Mt.utils.isServingBuilderPreview(t)||Mt.utils.isPublicApiRequest(t))&&await ft.usageLimitIsExceeded({name:co.StaticQuotaName.USERS,type:co.QuotaUsageType.STATIC,usageChange:0})}return r()},"licensing"),YA=$N;var we={};x(we,{requireFeature:()=>jN,requireFeatures:()=>QN});var jN=a(e=>async(t,r)=>{await Ln(e),await r()},"requireFeature"),QN=a((...e)=>async(t,r)=>{await Os(e),await r()},"requireFeatures");var po=require("@budibase/backend-core");var lu=a(async(e,t)=>{let r;return po.env.ENABLE_SCIM_LOGGER&&(r=await Zt.logRequest({...e.request.toJSON(),body:e.request.body})),await po.context.doInScimContext(async()=>{let n=await t();return r&&await Zt.logResponse(r,{...e.response.toJSON(),body:e.response.body}),n})},"doInScimContext");var du=a(async(e,t)=>{await Ds(),await t()},"requireSCIM");var zA=require("@budibase/backend-core");var Na=a(e=>fu(zA.users.getById,e,!0),"scimUserOnly"),Ba=a(e=>fu(z.get,e,!0),"scimGroupOnly"),Ga=a(e=>fu(z.get,e,!1),"internalGroupOnly");function fu(e,t,r){return async(n,o)=>{let s=n.params[t];return typeof s!="string"&&n.throw(404),!!(await e(s)).scimInfo?.isSync!==r&&n.throw(404),o()}}a(fu,"scimSyncChecks");var Fa=require("@budibase/backend-core");var mu=require("dd-trace");async function gu(e,t){await mu.tracer.trace("licenseAuth",async r=>{let n=e.request.headers[Fa.constants.Header.LICENSE_KEY];Array.isArray(n)&&(n=n[0]),r.addTags({licenseKey:n}),n||e.throw(403,"License key not provided");let o=await vs(n);o||(r.addTags({licenseFound:!1}),e.throw(403,"License not found or invalid")),o.tenantId||e.throw(403,"License does not have a tenant ID"),mu.tracer.setUser({id:"anonymous",tenantId:o.tenantId}),await Fa.context.doInSelfHostTenantUsingCloud(o.tenantId,async()=>{await Fa.context.doInLicenseContext(o,async()=>{await t()})})})}a(gu,"default");var wu={};x(wu,{appBackups:()=>sb,auditLogs:()=>gb,environmentVariables:()=>Eb,groups:()=>kb,scim:()=>dI});var Et=require("@budibase/backend-core"),fo=require("@budibase/types"),nb=F(require("@koa/router")),tr=F(require("joi"));var lo=require("@budibase/backend-core"),yu=require("@budibase/types");async function er(e,t){t||e.throw(400,"App ID missing"),await cr.workspaceExists(t)||e.throw(400,`Provided app ID: ${t} - is invalid.`)}a(er,"checkAppID");async function JA(e){let t=e.params.appId;await er(e,t);let{body:r}=e.request,n=e.user?._id,o=await Ne.triggerAppBackup(t,yu.BackupTrigger.MANUAL,{name:r.name,createdBy:n});o||e.throw(500,"Unable to start backup."),e.body={backupId:o,message:"Backup triggered - process starting."}}a(JA,"manualBackup");async function XA(e){let t=e.params.appId;await er(e,t);let r=e.params.backupId,n=e.request.body.name,o=await Ne.triggerAppRestore(t,r,n,e.user?._id);o||e.throw(500,"Unable to start restore."),await lo.events.backup.appBackupRestored(o.metadata),e.body={restoreId:o?.restoreId,message:"Restore triggered - process starting."}}a(XA,"importBackup");async function ZA(e){let t=e.params.appId;await er(e,t);let r=e.params.backupId;await Ne.deleteAppBackup(r),e.body={message:"Backup deleted successfully."}}a(ZA,"deleteBackup");async function eb(e){let t=lo.context.getWorkspaceId();await er(e,t);let{backupIds:r}=e.request.body;(!Array.isArray(r)||r.length===0)&&e.throw(400,"backupIds must be a non-empty array");let n=await Ne.deleteAppBackups(r),o=n.filter(i=>i.success).length,s=n.length-o;e.body={message:`${o} backups deleted successfully${s>0?`, ${s} failed`:""}.`,results:n,successCount:o,failureCount:s}}a(eb,"deleteBackups");async function tb(e){let t=e.params.appId;await er(e,t);let r=e.request.body;r?.trigger&&(r.trigger=r.trigger.toLowerCase(),Object.values(yu.BackupTrigger).includes(r.trigger)||e.throw(400,"Provided trigger is not a valid option.")),e.body=await Ne.fetchAppBackups(t,{paginate:!0,...r})}a(tb,"fetchBackups");async function rb(e){let t=e.params.appId;await er(e,t);let r=e.params.backupId,n=e.request.body;e.body=await Ne.updateAppBackup(r,n.name)}a(rb,"updateBackup");async function ab(e){let t=e.params.appId;await er(e,t);let r=e.params.backupId,{metadata:n,stream:o}=await Ne.getBackupDownloadStream(r);e.attachment(`backup-${n.timestamp}.tar.gz`),e.body=o}a(ab,"downloadBackup");var ob=new nb.default;function VN(){return Et.auth.joiValidator.body(tr.default.object({trigger:tr.default.string().valid(...Object.values(fo.BackupTrigger)),type:tr.default.string().valid(...Object.values(fo.BackupType)),startDate:tr.default.date(),endDate:tr.default.date(),page:tr.default.string()}))}a(VN,"validateBackupSearch");ob.post("/api/apps/:appId/backups",Et.auth.builderOrAdmin,JA).post("/api/apps/:appId/backups/search",Et.auth.builderOrAdmin,VN(),tb).get("/api/apps/:appId/backups/:backupId/file",Et.auth.builderOrAdmin,ab).patch("/api/apps/:appId/backups/:backupId",Et.auth.builderOrAdmin,rb).delete("/api/apps/:appId/backups/:backupId",Et.auth.builderOrAdmin,ZA).delete("/api/apps/:appId/backups",Et.auth.builderOrAdmin,eb).post("/api/apps/:appId/backups/:backupId/import",Et.auth.builderOrAdmin,XA);var sb=ob;var Au=require("@budibase/backend-core");async function ib(e){let t=e.request.body,r=await kt.fetch(t);await Au.events.auditLog.filtered(t),e.body=r}a(ib,"search");async function ub(e){let t=e.request.body,{stream:r}=kt.download(t);await Au.events.auditLog.downloaded(t),e.attachment(`audit-logs-${Date.now()}.log`),e.body=r}a(ub,"download");async function cb(e){e.body={events:kt.definitions()}}a(cb,"definitions");var lb=require("@budibase/types"),rr=require("@budibase/backend-core"),fb=F(require("@koa/router")),He=F(require("joi"));function pb(){return rr.auth.joiValidator.body(He.default.object({userIds:He.default.array().items(He.default.string()).optional(),appIds:He.default.array().items(He.default.string()).optional(),events:He.default.array().items(He.default.string().valid(...Object.values(lb.Event))).optional(),startDate:He.default.string().optional().allow(""),endDate:He.default.string().optional().allow(""),fullSearch:He.default.string().optional().allow(""),bookmark:He.default.number()}))}a(pb,"buildAuditLogSearchValidator");var mb=new fb.default;mb.post("/api/global/auditlogs/search",rr.auth.adminOnly,pb(),ib).get("/api/global/auditlogs/download",rr.auth.adminOnly,rr.middleware.querystringToBody,pb(),ub).get("/api/global/auditlogs/definitions",rr.auth.adminOnly,cb);var gb=mb;var Iu=require("@budibase/backend-core"),bu=require("@budibase/types");async function hb(e){e.body={encryptionKeyAvailable:mt.isEncryptionKeyAvailable()}}a(hb,"status");async function yb(e){e.body={variables:await mt.fetch()}}a(yb,"fetch");async function Ab(e){let{name:t,production:r,development:n}=e.request.body;await mt.update(t,{production:r,development:n});let o=[bu.Environment.PRODUCTION];r!==n&&o.push(bu.Environment.DEVELOPMENT),await Iu.events.environmentVariable.created(t,o),e.body={message:`Environment variable "${t}" created.`}}a(Ab,"create");async function bb(e){let{production:t,development:r}=e.request.body,n=e.params.varName;await mt.update(n,{production:t,development:r}),e.body={message:`Environment variable "${n}" updated.`}}a(bb,"update");async function Ib(e){let t=e.params.varName;await mt.remove(t),await Iu.events.environmentVariable.deleted(t),e.body={message:`Environment variable "${t}" deleted.`}}a(Ib,"destroy");var ar=require("@budibase/backend-core"),wb=F(require("@koa/router")),Wa=F(require("joi"));var Tb=new wb.default;function Sb(){return ar.auth.joiValidator.body(Wa.default.object({name:Wa.default.string().optional(),production:Wa.default.string().required(),development:Wa.default.string().required()}))}a(Sb,"buildEnvVarUpdateValidator");Tb.get("/api/env/variables/status",ar.auth.builderOrAdmin,hb).get("/api/env/variables",ar.auth.builderOrAdmin,yb).post("/api/env/variables",ar.auth.builderOrAdmin,Sb(),Ab).patch("/api/env/variables/:varName",ar.auth.builderOrAdmin,Sb(),bb).delete("/api/env/variables/:varName",ar.auth.builderOrAdmin,Ib);var Eb=Tb;var gt=require("@budibase/backend-core"),Rt=require("@budibase/types"),qb=F(require("@koa/router")),Ce=F(require("joi"));var Rb=require("@budibase/backend-core");async function vb(e){let t=e.request.body;if(t.name=t.name.trim(),delete t.roles,t._id){let n=await _r(t._id);t.roles=n.roles,t.scimInfo=n.scimInfo}let r=await Gn(t);e.body={_id:r.id,_rev:r.rev}}a(vb,"save");async function _b(e){let t=e.params.groupId,r=e.request.body.add,n=e.request.body.remove;(r&&!Array.isArray(r)||n&&!Array.isArray(n))&&e.throw(400,"Must supply a list of users to add or to remove");let o,s;r&&(o=await Fn(t,r)),n&&(s=await Ks(t,n)),e.body={added:o,removed:s}}a(_b,"updateGroupUsers");async function xb(e){let t=e.params.groupId,r=e.request.body.add,n=e.request.body.remove;(r&&!Array.isArray(r)||n&&!Array.isArray(n))&&e.throw(400,"Must supply a list of objects, with appId and roleId to add or remove"),e.body=await Vs(t,{appsToAdd:r,appsToRemove:n})}a(xb,"updateGroupApps");async function Cb(e){e.body={data:await La()}}a(Cb,"fetch");async function Ob(e){let{groupId:t,rev:r}=e.params;try{await Qs(t,r),e.body={message:"Group deleted successfully"}}catch(n){e.throw(n.status,n)}}a(Ob,"destroy");async function Lb(e){try{e.body=await _r(e.params.groupId)}catch(t){e.throw(t.status,t)}}a(Lb,"find");async function Pb(e){let{pageSize:t=10,bookmark:r,emailSearch:n}=e.request.query,o=e.params.groupId,s={limit:t+1},i=await nn(o,{...s,emailSearch:n,bookmark:r}),u=n?i[t]?.email:i[t]?._id,c=!!u;e.body={users:i.slice(0,t),bookmark:u,hasNextPage:c}}a(Pb,"searchUsers");async function Ub(e){let{groupId:t}=e.params,{csvContent:r}=e.request.body;(r===void 0||r.trim().length===0)&&e.throw(400,"CSV is empty");let n=await Rb.csv.jsonFromCsvString(r,{allowSingleColumn:!0});(!n||n.length===0)&&e.throw(400,"CSV file is invalid");let s=Object.keys(n[0]).find(h=>/^(email|e-mail|email address|mail|e_mail)$/i.test(h.trim()));s||e.throw(400,"CSV file must contain an email column");let i=Array.from(new Set(n.map(h=>h[s]).filter(h=>h&&typeof h=="string"&&h.trim().length>0).map(h=>h.trim())));i.length===0&&e.throw(400,"No valid email addresses found in CSV");try{await _r(t)}catch(h){if(h.status===404)e.throw(404,"Group not found");else throw h}let u=[],c=[],f=[],g=await Promise.all(i.map(h=>Ke.getUserByEmail(h)));for(let h of i){let y=g.find(E=>E?.email===h);y?(u.push({_id:y._id,email:y.email}),f.push(y._id)):c.push({email:h,reason:"User not found"})}f.length>0&&await Fn(t,f),e.body={added:u,skipped:c}}a(Ub,"bulkAddUsersFromCsv");var Db=new qb.default;function JN(){return gt.auth.joiValidator.body(Ce.default.object({_id:Ce.default.string().optional(),_rev:Ce.default.string().optional(),color:Ce.default.string().required(),icon:Ce.default.string().required(),name:Ce.default.string().trim().required().max(50),role:Ce.default.string().optional(),users:Ce.default.array().optional(),apps:Ce.default.array().optional(),roles:Ce.default.object().optional(),createdAt:Ce.default.string().optional(),updatedAt:Ce.default.string().optional()}).required())}a(JN,"buildGroupSaveValidation");Db.post("/api/global/groups",gt.auth.adminOnly,we.requireFeature(Rt.Feature.USER_GROUPS),JN(),vb).get("/api/global/groups",we.requireFeature(Rt.Feature.USER_GROUPS),Cb).delete("/api/global/groups/:groupId/:rev",we.requireFeature(Rt.Feature.USER_GROUPS),gt.auth.adminOnly,Ga("groupId"),Ob).get("/api/global/groups/:groupId",we.requireFeature(Rt.Feature.USER_GROUPS),gt.auth.builderOrAdmin,Lb).get("/api/global/groups/:groupId/users",we.requireFeature(Rt.Feature.USER_GROUPS),gt.auth.builderOrAdmin,Pb).post("/api/global/groups/:groupId/users",gt.auth.adminOnly,we.requireFeature(Rt.Feature.USER_GROUPS),Ga("groupId"),_b).post("/api/global/groups/:groupId/users/bulk",gt.auth.adminOnly,we.requireFeature(Rt.Feature.USER_GROUPS),Ga("groupId"),gt.auth.joiValidator.body(Ce.default.object({csvContent:Ce.default.string().required()}).required()),Ub).post("/api/global/groups/:groupId/apps",gt.auth.builderOrAdmin,we.requireFeature(Rt.Feature.USER_GROUPS),xb);var kb=Db;var lI=F(require("@koa/router"));var mo=require("scim-patch");var Nb=require("@budibase/backend-core");function Mb(e,t){let r=e.request.query[t];if(r!==void 0)return+r}a(Mb,"tryGetQueryAsNumber");var Bb=a(async e=>{let t=Mb(e,"pageSize")??20,r=Mb(e,"startIndex"),n;e.request.query.filter&&(n=ce.user.userFilters(e.request.query.filter));let o=await qe.get({pageSize:t,skip:r,filters:n});e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:o.total,Resources:o.users.map(ce.user.toScimUserResponse),startIndex:(r||0)+1,itemsPerPage:t}},"get"),Gb=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404);let r=await qe.find(t);e.body=ce.user.toScimUserResponse(r)},"find"),Fb=a(async e=>{let t=ce.user.fromScimUser(e.request.body);try{let r=await qe.create(t);e.body=ce.user.toScimUserResponse(r)}catch(r){throw r instanceof Nb.EmailUnavailableError&&e.throw(409,"Email already in use"),r}},"create");function XN(e){let t=e.Operations.find(r=>(r.op==="Replace"||r.op==="replace")&&r.path==="active");return t?t.value===!1||t.value?.toLowerCase?.()==="false":!1}a(XN,"isDeactivation");var Wb=a(async e=>{let t=await qe.find(e.params.id);t||e.throw(404);let r=ce.user.toScimUserResponse(t),n=e.request.body;try{(0,mo.patchBodyValidation)(n)}catch{}if(XN(n))return Su(e);let o;try{o=(0,mo.scimPatch)(r,n.Operations)}catch{}o||e.throw(500);let s=ce.user.fromScimUser(o);await qe.update(s,{allowChangingEmail:!0}),e.body=ce.user.toScimUserResponse(s)},"update"),Su=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404),await qe.remove(t),e.status=204},"remove");var aI=F(rI()),nI=require("@budibase/shared-core"),go=require("scim-patch");var ho=require("scim2-parse-filter");function oI(e,t){for(let r of t.split(","))delete e[r]}a(oI,"cleanResponse");var sI=a(async e=>{let r=(await re.fetch()).filter(s=>s.scimInfo?.isSync).map(ce.group.toScimGroupResponse),{filter:n,excludedAttributes:o}=e.request.query;if(n){let s=(0,ho.filter)((0,ho.parse)(n));r=r.filter(s)}o&&r.forEach(s=>{oI(s,o)}),e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:r.length,Resources:r,startIndex:1,itemsPerPage:r.length}},"get"),iI=a(async e=>{let t=ce.group.fromScimGroup(e.request.body),r=await qr.create(t);e.body=ce.group.toScimGroupResponse(r)},"create"),uI=a(async e=>{let{id:t}=e.params,r=await re.get(t),n=ce.group.toScimGroupResponse(r),{excludedAttributes:o}=e.request.query;o&&oI(n,o),e.body=n},"find"),cI=a(async e=>{let{id:t}=e.params,r=await re.get(t);await re.remove(t,r._rev),e.status=204},"remove"),pI=a(async e=>{let{id:t}=e.params,r=await re.get(t),n=ce.group.toScimGroupResponse(r),o=e.request.body;try{(0,go.patchBodyValidation)(o)}catch{e.throw(400)}let{true:s,false:i}=(0,aI.default)(o.Operations,u=>u.path==="members");if(i?.length){let u=(0,go.scimPatch)(n,i);u||e.throw(500);let c={...ce.group.fromScimGroup(u),_rev:r._rev};await re.save(c)}if(s?.length){let u=[],c=[];for(let{op:f,value:g}of s)switch(f){case"add":case"Add":for(let h of g)u.push(await qe.find(h.value));break;case"remove":case"Remove":for(let h of g)try{c.push(await qe.find(h.value))}catch(y){if(y.status!==404)throw y}break;case"replace":case"Replace":throw new Error("Replacing members is not allowed");default:nI.utils.unreachable(f)}u.length&&await re.addUsers(t,u.map(f=>f._id)),c.length&&await re.removeUsers(t,c.map(f=>f._id))}e.body=ce.group.toScimGroupResponse(await re.get(t))},"update");var $a=require("@budibase/types"),Be=new lI.default({prefix:"/api/global/scim/v2"});Be.use(du);Be.use(lu);Be.get("/users",Bb);Be.get("/users/:id",Na("id"),Gb);Be.post("/users",Fb);Be.patch("/users/:id",Na("id"),Wb);Be.delete("/users/:id",Na("id"),Su);Be.get("/groups",sI);Be.post("/groups",we.requireFeature($a.Feature.USER_GROUPS),iI);Be.get("/groups/:id",we.requireFeature($a.Feature.USER_GROUPS),Ba("id"),uI);Be.delete("/groups/:id",we.requireFeature($a.Feature.USER_GROUPS),Ba("id"),cI);Be.patch("/groups/:id",we.requireFeature($a.Feature.USER_GROUPS),Ba("id"),pI);var dI=Be;var ce={};x(ce,{group:()=>Eu,user:()=>Tu});var Tu={};x(Tu,{fromScimUser:()=>vB,toScimUserResponse:()=>TB,userFilters:()=>_B});var fI=require("@budibase/backend-core"),mI=require("@budibase/shared-core"),yo=require("@budibase/types"),gI=require("scim2-parse-filter");var{unreachable:wB}=mI.utils,TB=a(e=>{let{isSync:t,roles:r,...n}=e.scimInfo||{},o={...n,schemas:["urn:ietf:params:scim:schemas:core:2.0:User"],id:e._id,meta:{resourceType:"User",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},active:e.status===yo.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"),EB=a(e=>!!e?.id,"isScimUserResponse");function RB(e){if(fI.utils.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}a(RB,"tryGetEmail");var vB=a(e=>{let t=EB(e)?e:void 0,r=RB(e);if(!r)throw new Error("Email is required");let n;switch(e.active){case"True":case"true":case!0:n=!0;break;case"False":case"false":case!1:n=!1;break;default:wB(e.active)}let o,s;return e.name?.givenName?(o=e.name?.givenName,s=e.name?.familyName):o=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:o,lastName:s,scimInfo:{...e,isSync:!0},roles:{},status:n?yo.UserStatus.ACTIVE:yo.UserStatus.INACTIVE,createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimUser"),_B=a(e=>{let t={equal:{}},r=(0,gI.parse)(e);function n(o){switch(o.op){case"eq":{let s=o.attrPath,i;switch(s){case"emails.value":i="email";break;default:i=`scimInfo.${s}`}t.equal[i]=o.compValue;break}case"and":for(let s of o.filters)n(s);break;default:console.warn("Filter not handled",{filter:o})}}return a(n,"parseFilters"),n(r),t},"userFilters");var Eu={};x(Eu,{fromScimGroup:()=>OB,toScimGroupResponse:()=>xB});var xB=a(e=>({schemas:["urn:ietf:params:scim:schemas:core:2.0:Group"],id:e._id,externalId:e.scimInfo.externalId,meta:{resourceType:"Group",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},displayName:e.name,members:e.users?.map(t=>({value:t._id}))}),"toScimGroupResponse"),CB=a(e=>!!e?.id,"isScimGroup"),OB=a(e=>{let t=CB(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 Hu={};x(Hu,{LLM:()=>ht,LLMRequest:()=>se,TableGeneration:()=>Vu,agentHistoryTitleSystemPrompt:()=>GB,agentSystemPrompt:()=>BB,aiColumnSchemas:()=>Qu,aiTableResponseToTableSchema:()=>Fu,appendAIColumns:()=>Wu,classifyText:()=>_u,cleanData:()=>xu,extractFileData:()=>DB,generateAIColumns:()=>Bu,generateCode:()=>NB,generateCronExpression:()=>Cu,generateData:()=>Gu,generateJs:()=>Uu,generateSQL:()=>MB,generateTables:()=>Nu,generationStructure:()=>ju,getChatLLM:()=>_I,getLLM:()=>Ka,getLLMConfig:()=>Mu,getLLMOrThrow:()=>vI,normalizeContentType:()=>Ru,parseResponseFormat:()=>bo,sanitiseToolName:()=>LB,searchWeb:()=>Pu,sentimentAnalysis:()=>Lu,summarizeText:()=>Ao,tableDataStructuredOutput:()=>Ku,translate:()=>Ou});var ja=require("@budibase/types");function LB(e){if(e.length>64)throw new Error("Tool name must be under 64 characters long");return e.replace(/[^a-zA-Z0-9_-]/g,"_")}a(LB,"sanitiseToolName");function Ru(e){return e?e.includes("/")?e:{[ja.SupportedFileType.PDF]:"application/pdf",[ja.SupportedFileType.JPG]:"image/jpeg",[ja.SupportedFileType.JPEG]:"image/jpeg",[ja.SupportedFileType.PNG]:"image/png"}[e.toLowerCase()]||"application/octet-stream":"application/octet-stream"}a(Ru,"normalizeContentType");var Eo=require("@budibase/types");var yt=require("@budibase/backend-core"),SI=require("@budibase/types"),Dr=require("dd-trace"),wI=require("openai/helpers/zod"),TI=require("zod");var AI=require("@budibase/types"),Io=F(require("openai")),qu=require("openai/helpers/zod");var hI=require("@budibase/shared-core"),Nt=require("@budibase/types"),Bt=F(require("dd-trace"));function vu(e,t){return t.map(r=>e[r]).join(" ")}a(vu,"extractTextFromColumns");var ht=class{static{a(this,"LLM")}constructor({model:t,apiKey:r,maxTokens:n}){this._model=t,this._apiKey=r,this._maxTokens=n??parseInt(process.env.BUDIBASE_AI_MAX_PROMPT_TOKENS||"1000")}get model(){return this._model}get apiKey(){return this._apiKey}get maxTokens(){return this._maxTokens}async prompt(t){return await Bt.default.trace("prompt",async()=>{let r=typeof t=="string"?new se().addUserMessage(t):t,{messages:n,tokensUsed:o}=await Bt.default.trace("chatCompletion",()=>this.chatCompletion(r));return!n||n.length===0?{message:"",tokensUsed:o}:{message:n[n.length-1].content||"",tokensUsed:o}})}async chat(t){return await Bt.default.trace("chat",async()=>await this.chatCompletion(t))}async*chatStream(t){yield*this.chatCompletionStream(t)}async summarizeText(t){return Bt.default.trace("summarizeText",()=>this.prompt(Ao(t)))}async generateCronExpression(t){return Bt.default.trace("generateCronExpression",()=>this.prompt(Cu(t)))}async operation(t,r){return Bt.default.trace("operation",n=>{n.addTags({operation:t.operation,rowId:r.id});let o=this.promptForOperation(t,r);return this.prompt(o)})}promptForOperation(t,r){let{operation:n,column:o,columns:s,language:i,categories:u,prompt:c}=t;switch(n){case Nt.AIOperationEnum.SUMMARISE_TEXT:return Ao(vu(r,s));case Nt.AIOperationEnum.CLEAN_DATA:return xu(r[o]);case Nt.AIOperationEnum.TRANSLATE:return Ou(r[o],i);case Nt.AIOperationEnum.CATEGORISE_TEXT:if(!u)throw Error("No categories provided for categorise text operation. Please provide categories.");return _u(vu(r,s),u.split(","));case Nt.AIOperationEnum.SENTIMENT_ANALYSIS:return Lu(r[o]);case Nt.AIOperationEnum.PROMPT:return c;case Nt.AIOperationEnum.SEARCH_WEB:return Pu(vu(r,s));default:throw hI.utils.unreachable(n)}}async generateJs(t,r){return await Bt.default.trace("generateJs",async()=>{let{bindings:n=[],snippets:o=[]}=r||{};return await this.prompt(Uu(n,o).addUserMessage(t))})}};var Qa=(n=>(n.GPT_5_MINI="gpt-5-mini",n.GPT_5="gpt-5",n.GPT_5_NANO="gpt-5-nano",n))(Qa||{});function bo(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}a(bo,"parseResponseFormat");function yI(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}a(yI,"calculateBudibaseAICredits");var Ge=class extends ht{constructor(r){super(r);this.client=this.getClient(r)}static{a(this,"OpenAI")}getVerbosityForModel(){if(Object.values(Qa).includes(this.model))return"low"}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new Io.default({apiKey:r.apiKey,baseURL:r.baseUrl})}async uploadFile(r,n,o){let s=Ru(o);if(AI.ImageContentTypes.includes(s.toLowerCase())){let c;if(Buffer.isBuffer(r))c=r;else{let g=[];for await(let h of r)g.push(new Uint8Array(h));c=Buffer.concat(g)}let f=c.toString("base64");return`data:${s};base64,${f}`}let i=await(0,Io.toFile)(r,n);return(await this.client.files.create({file:i,purpose:"assistants"})).id}async chatCompletion(r){let n={model:this.model,messages:r.messages,max_completion_tokens:this._maxTokens,response_format:bo(r.format)};if(Object.values(Qa).includes(this.model)){let i=this.getVerbosityForModel();i&&(n.verbosity=i),n.reasoning_effort="minimal"}r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(qu.zodFunction));let o=await this.client.chat.completions.create(n),s=o?.choices?.[0]?.message;if(s?.tool_calls){r.addMessage(s);let i=[];for(let u of s.tool_calls){if(u.type!=="function"||!u.function){console.warn(`[OPENAI TOOL WARN] Unsupported tool call type: ${u.type}`);continue}let c=u.function.name,f=r.findTool(c);if(!f)throw new Error(`Tool ${c} not found in prompt tools`);let g=JSON.parse(u.function.arguments);i.push(f.handler(g).then(h=>({role:"tool",tool_call_id:u.id,content:h})).catch(h=>(console.error(`[OPENAI TOOL ERROR] Tool ${c} failed in OpenAI handler:`,h),{role:"tool",tool_call_id:u.id,content:`Error: ${h.message}`})))}return r.addMessages(await Promise.all(i)),this.chatCompletion(r)}else{if(s?.content)return{messages:[...r.messages,{role:s.role,content:s.content}],tokensUsed:yI(o.usage)};throw new Error("No response found")}}async*chatCompletionStream(r){let n={model:this.model,messages:r.messages,max_tokens:this.maxTokens,response_format:bo(r.format),stream:!0};r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(qu.zodFunction));try{let o=await this.client.chat.completions.create(n),s=null,i="",u=null;for await(let f of o){let g=f?.choices?.[0]?.delta;if(g){if(g.content&&(i+=g.content,yield{type:"content",content:g.content}),g.tool_calls&&g.tool_calls.length>0){let h=g.tool_calls[0];h.id?(s={id:h.id,name:h.function?.name||"",arguments:h.function?.arguments||""},yield{type:"tool_call_start",toolCall:{id:s.id,name:s.name,arguments:s.arguments}}):s&&h.function?.arguments&&(s.arguments+=h.function.arguments,yield{type:"tool_call_start",toolCall:{id:s.id,name:s.name,arguments:s.arguments}})}f.usage&&(u=f.usage)}}let c=u?yI(u):0;if(s){r.addMessage({role:"assistant",content:"",tool_calls:[{id:s.id,type:"function",function:{name:s.name,arguments:s.arguments}}]});let f=r.findTool(s.name);if(f)try{let g=JSON.parse(s.arguments),h=await f.handler(g);yield{type:"tool_call_result",toolResult:{id:s.id,result:h}},r.addMessage({role:"tool",tool_call_id:s.id,content:h}),yield*this.chatCompletionStream(r);return}catch(g){yield{type:"tool_call_result",toolResult:{id:s.id,result:`Error: ${g.message}`,error:g.message}},r.addMessage({role:"tool",tool_call_id:s.id,content:`Error: ${g.message}`}),yield*this.chatCompletionStream(r);return}else{let g=`Tool '${s.name}' not found`;yield{type:"tool_call_result",toolResult:{id:s.id,result:g,error:g}},r.addMessage({role:"tool",tool_call_id:s.id,content:g}),yield*this.chatCompletionStream(r);return}}i&&r.addMessage({role:"assistant",content:i}),yield{type:"done",messages:r.messages,tokensUsed:c}}catch(o){yield{type:"error",content:o.message}}}};var Du=F(require("@anthropic-ai/sdk"));function PB(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}a(PB,"calculateBudibaseAICredits");var So=class extends ht{constructor(r){super(r);this.client=new Du.default({apiKey:r.apiKey})}static{a(this,"Anthropic")}firstTextBlock(r){for(let n of r.content)if(n.type==="text")return n.text}async uploadFile(r,n,o){throw new Error("File upload not supported for this LLM provider")}async chatCompletion(r){try{let n=await this.client.messages.create({model:this.model,messages:r.messages.map(({content:s})=>{if(s==null)return{role:"user",content:""};if(typeof s=="string")return{role:"user",content:s};let i="";for(let u of s)u.type==="text"?i+=u.text:["image_url","input_audio","file"].includes(u.type);return{role:"user",content:i}}),max_tokens:this.maxTokens}),o=this.firstTextBlock(n)||"";return{messages:[...r.messages,{role:"assistant",content:o}],tokensUsed:PB(n.usage)}}catch(n){throw n instanceof Du.default.APIError&&console.error(`Anthropic Prompt failed with error ${n.name} and status: ${n.status}`),n}}async*chatCompletionStream(r){try{let n=await this.chatCompletion(r);if(n.messages.length>0){let o=n.messages[n.messages.length-1];o.content&&(yield{type:"content",content:o.content})}yield{type:"done",messages:n.messages,tokensUsed:n.tokensUsed}}catch(n){yield{type:"error",content:n.message}}}};var bI=require("openai");var wo=class extends Ge{static{a(this,"AzureOpenAI")}getClient(t){if(!t.apiKey)throw new Error("No Azure OpenAI API key found");if(!t.model)throw new Error("No Azure OpenAI model specified");return new bI.AzureOpenAI({apiKey:t.apiKey,apiVersion:"2024-10-01-preview",baseURL:t.baseUrl})}getVerbosityForModel(){return Object.values(Qa).includes(this.model)?"medium":void 0}};var he=require("@budibase/backend-core"),II=require("@budibase/types"),ku=require("dd-trace");var To=class extends ht{static{a(this,"BudibaseAI")}async prompt(t){let r=await super.prompt(t);return r.tokensUsed&&await Nn(r.tokensUsed),r}async chat(t){let r=await super.chat(t);return r.tokensUsed&&await Nn(r.tokensUsed),r}async uploadFile(t,r,n){return he.env.SELF_HOSTED?this.uploadFileSelfHost(t,r,n):this.uploadFileCloud(t,r,n)}async uploadFileCloud(t,r,n){return new Ge({apiKey:he.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).uploadFile(t,r,n)}async uploadFileSelfHost(t,r,n){let o;if(Buffer.isBuffer(t))o=t;else{let g=[];for await(let h of t)g.push(new Uint8Array(h));o=Buffer.concat(g)}let s=o.toString("base64");if(n&&II.ImageContentTypes.includes(n.toLowerCase()))return`data:image/jpeg;base64,${s}`;if(!he.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let g=await Cn();if(!g)throw new Error("No license key found");this._apiKey=g}let i=`${he.env.BUDICLOUD_URL}/api/ai/upload-file`,u={method:"POST",headers:{"Content-Type":"application/json",[he.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:s,filename:r,contentType:n})};console.debug("[BudibaseAI] uploadFileSelfHost - Making network call",{url:i,method:u.method,headers:u.headers,bodyKeys:["data","filename","contentType"],filename:r,contentType:n});let c=await Ja(i,u);if(console.debug("[BudibaseAI] uploadFileSelfHost - Network response",{url:i,status:c.status,statusText:c.statusText,ok:c.ok}),!c.ok)throw await he.HTTPError.fromResponse(c);return(await c.json()).fileId}async chatCompletion(t){return he.env.SELF_HOSTED?this.chatCompletionSelfHost(t):this.chatCompletionCloud(t)}async chatCompletionCloud(t){return await ku.tracer.trace("chatCompletionCloud",async()=>await new Ge({apiKey:he.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletion(t))}async chatCompletionSelfHost(t){return await ku.tracer.trace("chatCompletionSelfHost",async r=>{if(!he.env.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(r.addTags({budicloudUrl:he.env.BUDICLOUD_URL}),!this._apiKey){let c=await Cn();if(!c)throw new Error("No license key found");this._apiKey=c,r.addTags({licenseKey:this._apiKey})}let n={messages:t.messages,format:t.format,useTools:t.tools.length>0},o=`${he.env.BUDICLOUD_URL}/api/ai/chat`,s={method:"POST",headers:{"Content-Type":"application/json",[he.constants.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(n)};console.debug("[BudibaseAI] chatCompletionSelfHost - Making network call",{url:o,method:s.method,headers:s.headers,bodyKeys:Object.keys(n),messagesCount:t.messages.length,useTools:n.useTools,format:n.format});let i=await Ja(o,s);if(console.debug("[BudibaseAI] chatCompletionSelfHost - Network response",{url:o,status:i.status,statusText:i.statusText,ok:i.ok}),!i.ok)throw await he.HTTPError.fromResponse(i);let u=await i.json();return console.debug("[BudibaseAI] chatCompletionSelfHost - Response data",{url:o,tokensUsed:u.tokensUsed,messagesCount:u.messages?.length}),u})}async*chatCompletionStream(t){he.env.SELF_HOSTED?yield*this.chatCompletionStreamSelfHost(t):yield*this.chatCompletionStreamCloud(t)}async*chatCompletionStreamCloud(t){yield*new Ge({apiKey:he.env.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletionStream(t)}async*chatCompletionStreamSelfHost(t){console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Starting streaming (fallback to non-streaming)",{messagesCount:t.messages.length,toolsCount:t.tools.length});try{let r=await this.chatCompletionSelfHost(t);if(console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Yielding response chunks",{responseMessagesCount:r.messages.length,tokensUsed:r.tokensUsed}),r.messages.length>0){let n=r.messages[r.messages.length-1];n.content&&(yield{type:"content",content:n.content})}yield{type:"done",messages:r.messages,tokensUsed:r.tokensUsed}}catch(r){console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Error occurred",{error:r.message}),yield{type:"error",content:r.message}}}};var EI={OpenAI:"gpt-5-mini",TogetherAI:"gpt-5-mini",AzureOpenAI:"gpt-4.1",Custom:"gpt-5-mini",Anthropic:"claude-3-5-sonnet-20240620",BudibaseAI:"gpt-5-mini"},RI={OpenAI:Ge,TogetherAI:Ge,AzureOpenAI:wo,Custom:Ge,Anthropic:So,BudibaseAI:To,Chat:Ge};async function UB(){return await Dr.tracer.trace("getAIConfig",async e=>{let t={type:SI.ConfigType.AI,config:{}};if(!yt.context.isSelfHostUsingCloud()){let n=await yt.configs.getAIConfig();n&&(t=n)}await ks(t);let r=Object.values(t.config).find(n=>n.active&&n.isDefault);if(!r){e.addTags({enabled:!1,reason:"no provider found"});return}return e.addTags({enabled:!0}),{provider:r.provider,model:r.defaultModel||EI[r.provider],apiKey:r.apiKey,baseUrl:r.baseUrl}})}a(UB,"getAIConfig");async function qB(){return Dr.tracer.trace("getSelfHostOpenAIKeyConfig",e=>{if(!yt.env.SELF_HOSTED){e.addTags({enabled:!1,reason:"not self host"});return}if(!yt.env.OPENAI_API_KEY){e.addTags({enabled:!1,reason:"no OPENAI_API_KEY"});return}return e.addTags({enabled:!0}),{provider:"OpenAI",model:EI.OpenAI,apiKey:yt.env.OPENAI_API_KEY}})}a(qB,"getSelfHostOpenAIKeyConfig");async function Mu(){return Dr.tracer.trace("getLLMConfig",async()=>await UB()||await qB())}a(Mu,"getLLMConfig");async function Ka(e){return await Dr.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:n}=e||{},o=await Mu();if(!o){t.addTags({enabled:!1,reason:"no config found"});return}r&&(o.model=r),n&&(o.maxTokens=n);let s=RI[o.provider];if(!s){t.addTags({enabled:!1,reason:"no provider found",provider:o.provider});return}return new s(o)})}a(Ka,"getLLM");async function vI(){let e=await Ka();if(!e)throw new yt.HTTPError("No available LLM configurations",500);return e}a(vI,"getLLMOrThrow");async function _I(e){return await Dr.tracer.trace("getChatLLM",async()=>new RI.Chat(e))}a(_I,"getChatLLM");var se=class e{constructor(){this.messages=[];this.tools=[]}static{a(this,"LLMRequest")}addTool(t){return this.tools.push(t),this}addTools(t){return this.tools.push(...t),this}findTool(t){return this.tools.find(r=>r.name===t)}withFormat(t){return t instanceof TI.z.ZodType?this.format=(0,wI.zodResponseFormat)(t,"key"):this.format=t,this}addMessage(t){return this.messages.push(t),this}addMessages(t){return this.messages.push(...t),this}addUserMessage(t){return this.messages.push({role:"user",content:t}),this}addSystemMessage(t){return this.messages.push({role:"system",content:t}),this}static fromRequest(t){let r=new e;return t.messages&&r.addMessages(t.messages),t.format&&r.withFormat(t.format),r}};var vt=require("zod");function Ao(e,t){let r=`Summarize this text:
39
39
  ${e}`,n="";if(t)switch(t){case Eo.SummariseLength.SHORT:n="In 1-2 concise sentences, ";break;case Eo.SummariseLength.MEDIUM:n="In 2-3 paragraphs, ";break;case Eo.SummariseLength.LONG:n="In multiple detailed paragraphs, ";break}return new se().addUserMessage(`${n}${r}.
40
40
  Only return the summary.`)}a(Ao,"summarizeText");function DB(e,t){let r=["You are a data extraction assistant.","Extract data from the attached document/image that matches the provided schema.","The schema defines the structure where values like 'string', 'number', 'boolean' indicate the expected data types.","Extract all items that match the schema from the document.","Return the data in json format","If no matching data is found, return an empty data array."].join(`
41
41
 
@@ -1,4 +1,4 @@
1
- import { Message, AgentChat } from "@budibase/types";
1
+ import { Message } from "@budibase/types";
2
2
  export interface LLMPromptResponse {
3
3
  message: string;
4
4
  tokensUsed: number;
@@ -7,20 +7,3 @@ export interface LLMFullResponse {
7
7
  messages: Message[];
8
8
  tokensUsed: number;
9
9
  }
10
- export interface LLMStreamChunk {
11
- type: "content" | "tool_call_start" | "tool_call_result" | "done" | "error" | "chat_saved";
12
- content?: string;
13
- toolCall?: {
14
- id: string;
15
- name: string;
16
- arguments: string;
17
- };
18
- toolResult?: {
19
- id: string;
20
- result: string;
21
- error?: string;
22
- };
23
- messages?: Message[];
24
- chat?: AgentChat;
25
- tokensUsed?: number;
26
- }
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "dist"
5
5
  ],
6
6
  "license": "UNLICENSED",
7
- "version": "3.23.1",
7
+ "version": "3.23.3",
8
8
  "description": "Budibase Pro (Backend)",
9
9
  "main": "dist/index.js",
10
10
  "types": "dist/index.d.ts",
@@ -71,5 +71,5 @@
71
71
  }
72
72
  }
73
73
  },
74
- "gitHead": "ade970d3ee9b56413873984aefa4b39297002204"
74
+ "gitHead": "c6b0bb006540458aa14bc31d8a4e90e39371ebba"
75
75
  }