@budibase/server 3.18.14 → 3.18.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/automation.js +1 -1
- package/dist/automation.js.map +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/query.js +1 -1
- package/dist/query.js.map +2 -2
- package/package.json +2 -2
package/dist/automation.js
CHANGED
|
@@ -584,7 +584,7 @@ mwIDAQAB
|
|
|
584
584
|
`}a(fM,"frontendWrapJS");var uJe=te(qte()),cJe=te(A_()),lJe=te($te()),fJe=te(Hte()),pJe=te(Wte()),dJe=te(Ete()),hJe=te(Yj()),mJe=te(zte()),gJe=te(Vte());var PSr={math:uJe.default,array:cJe.default,number:lJe.default,url:fJe.default,string:pJe.default,comparison:dJe.default,object:hJe.default,regex:mJe.default,uuid:gJe.default},yJe=["sortBy"],NSr={date:uM,duration:QO},Jp;function XO(){if(Jp)return Jp;Jp={};for(let e of Object.values(PSr))for(let[t,r]of Object.entries(e))Jp[t]=(...n)=>r(...n,{});Jp={...Jp,...NSr};for(let e of yJe)delete Jp[e];return Object.freeze(Jp),Jp}a(XO,"getJsHelperList");var cm=a(e=>`(function(){
|
|
585
585
|
${e}
|
|
586
586
|
})();`,"iifeWrapper");var lm=class e extends Error{constructor(){super(e.message);this.code=e.code}static{a(this,"JsTimeoutError")}static{this.message="Timed out while executing JS"}static{this.code="JS_TIMEOUT_ERROR"}},il=class e extends Error{constructor(r){super(`error while running user-supplied JavaScript: ${r.toString()}`);this.userScriptError=r;this.code=e.code}static{a(this,"UserScriptError")}static{this.code="USER_SCRIPT_ERROR"}};var bJe=te(require("lodash/fp/cloneDeep"));var pM,ZO=a(e=>pM=e,"setJSRunner"),vJe=a(()=>{pM=void 0},"removeJSRunner"),nre,ire=a(e=>nre=e,"setOnErrorLog"),LSr=a(e=>{if(!e||typeof e!="string")return e;let t=/\[+(.+)]+/,r=e.match(t);return r&&r[1]?r[1]:e},"removeSquareBrackets"),FSr=a(e=>e==="snippets"||e==="helpers"||e.startsWith("snippets.")||e.startsWith("helpers."),"isReservedKey"),USr=a((e,t)=>{if(FSr(e))return;let r=/^(["'`]).*\1$/,n=t;return r.test(e)?e.substring(1,e.length-1):(e.split(".").forEach(i=>{if(n==null||typeof n!="object")return null;n=n[LSr(i)]}),n)},"getContextValue");function wJe(handlebars,context){if(!iJe()||!pM)throw new Error("JS disabled in environment.");try{let js=cm(lM(handlebars)),snippetMap={},snippetCache={};for(let e of context.snippets||[])snippetMap[e.name]=e.code;let clonedContext;JO()?clonedContext=context:clonedContext=(0,bJe.default)(context);let sandboxContext={$:e=>USr(e,clonedContext),helpers:XO(),snippets:new Proxy({},{get:function(_,name){return name in snippetCache||(snippetCache[name]=eval(cm(snippetMap[name]))),snippetCache[name]}})},logs=[];if(!JO()){let e=fM(js).split(js)[0].split(`
|
|
587
|
-
`).length,t=a(r=>(...n)=>{gb()||console[r](...n),n.forEach((o,s)=>{typeof o=="object"&&(n[s]=JSON.stringify(o))});let i=new Error().stack?.match(/<anonymous>:(\d+):\d+/)?.[1];logs.push({log:n,line:i?parseInt(i)-e:void 0,type:r})},"buildLogResponse");sandboxContext.console={log:t("log"),info:t("info"),debug:t("debug"),warn:t("warn"),error:t("error"),table:t("table")}}let res={data:pM(js,sandboxContext),logs};return`{{${C_} js_result-${JSON.stringify(res)}}}`}catch(e){nre&&nre(e);let{noThrow:t=!0}=context.__opts||{};if(e.code==="ERR_SCRIPT_EXECUTION_TIMEOUT")return"Timed out while executing JS";if(e.code==="JS_REQUEST_TIMEOUT_ERROR")return e.message;if(e.code===lm.code)return lm.message;if(e.code===il.code){if(t)return e.userScriptError.toString();throw e}if(e.name==="SyntaxError"){if(t)return e.toString();throw e}return"Error while executing JS"}}a(wJe,"processJS");var jSr={"<":"<",">":">"};function MSr(e){return e==null||typeof e!="object"?!1:e.toString()==="[object Object]"||e.length>0&&typeof e[0]=="object"}a(MSr,"isObject");var BSr=[new Hp(mb.OBJECT,e=>new dM.default.SafeString(JSON.stringify(e))),new Hp(mb.JS,wJe,!1),new Hp(mb.DECODE_ID,e=>{if(!e)return[];let t=typeof e=="string"?e:e._id,r=decodeURIComponent(t).replace(/'/g,'"');try{let n=JSON.parse(r);return Array.isArray(n)?n:[n]}catch{return[e]}}),new Hp(mb.ALL,(e,t)=>{let{__opts:r}=t;if(MSr(e))return new dM.default.SafeString(JSON.stringify(e));if(r&&r.onlyFound&&e==null)return r.input;if(e==null||typeof e!="string")return e??"";e&&e.string&&(e=e.string);let n=e;return r&&r.escapeNewlines&&(n=e.replace(/\n/g,"\\n")),n=new dM.default.SafeString(n.replace(/&/g,"&")),n==null||typeof n!="string"?n:n.replace(/[<>]/g,i=>jSr[i]||i)}),new Hp(mb.LITERAL,e=>{if(e===void 0)return"";let t=typeof e,r=t==="object"?JSON.stringify(e):e;return`{{${C_} ${t}-${r}}}`})];function EJe(){return Object.values(mb).concat(cM,Zte)}a(EJe,"HelperNames");function are(e){for(let t of BSr)t.register(e)}a(are,"registerMinimum");function _Je(e){are(e),rJe(e)}a(_Je,"registerAll");var SJe=["#","else","/"];var D_=class{static{a(this,"Preprocessor")}constructor(t,r){this.name=t,this.fn=r}process(t,r,n){let i=this.fn(r,n),o=t.indexOf(r);return rre(t,o,r.length,i)}},xJe=[new D_("swap-to-dot-notation",e=>{let t=e.indexOf("["),r=0;for(;t!==-1;){oJe(e.charAt(t-1))&&(e=rre(e,t+r,1,".[")),r=t+1;let n=e.substring(r+1).indexOf("[");t=n>0?r+1+n:-1}return e}),new D_("fix-functions",e=>{for(let t of SJe){let r=`{ ${t}`,n=`{${t}`;e=e.replace(new RegExp(r,"g"),n)}return e}),new D_("normalize-spaces",e=>e.replace(/{{(\s{2,})/g,"{{ ")),new D_("finalise",(e,t)=>{let n=!t?.noHelpers,i=e.slice(2,e.length-2);i.charAt(0)===" "&&(i=i.slice(1)),i.charAt(i.length-1)===" "&&(i=i.slice(0,i.length-1));let o=i.split(" ")[0];for(let u of SJe)if(o.includes(u))return e;let s=o.trim().toLowerCase();return n&&!t?.disabledHelpers?.includes(s)&&EJe().some(u=>s===u.toLowerCase())&&(i=`(${i})`),`{{ all ${i} }}`})];var ore=class{static{a(this,"Postprocessor")}constructor(t,r){this.name=t,this.fn=r}process(t){return this.fn(t)}},sre=[new ore("convert-literals",e=>{if(typeof e!="string"||!e.includes(C_))return{result:e};let t=e.indexOf("-"),r=e.substring(12,t),n=e.substring(t+1,e.length-2);switch(r){case"string":return{result:n};case"number":return{result:parseFloat(n)};case"boolean":return{result:n==="true"};case"object":return{result:JSON.parse(n)};case"js_result":{let i=JSON.parse(n);return{result:i.data,logs:i.logs}}}return{result:n}})];function ure(e,t,r){let n=[];for(let i of t){if(typeof e!="string")break;let o=new RegExp(YO),s=e.match(o);if(s!=null)for(let u of s){let c=i.process(e,u,r||{});typeof c=="object"?("logs"in c&&c.logs&&(n=n.concat(c.logs)),e=c.result):e=c}}return{result:e,logs:n}}a(ure,"process");function TJe(e,t){let r=xJe;return t.noFinalise&&(r=r.filter(n=>n.name!=="finalise")),ure(e,r,t).result}a(TJe,"preprocess");function AJe(e){return ure(e,sre).result}a(AJe,"postprocess");function RJe(e){return ure(e,sre)}a(RJe,"postprocessWithLogs");var fre=(0,lre.create)();_Je(fre);var zSr=Object.keys(fre.helpers),kJe=(0,lre.create)();are(kJe);var WSr={noHelpers:!1,cacheTemplates:!1,noEscaping:!1,escapeNewlines:!1,noFinalise:!1};function CJe(e){try{JSON.stringify(e)}catch{throw"Unable to process inputs to JSON, cannot recurse"}}a(CJe,"testObject");function GSr(e){return e?Object.keys(e).filter(r=>zSr.includes(r)):[]}a(GSr,"findOverlappingHelpers");var cre={};function HSr(e,t,r){t={...WSr,...t};let n=!t?.noHelpers,i=`${e}-${JSON.stringify(t)}`;if(t.cacheTemplates&&cre[i])return cre[i];let o=n?GSr(r):[];if(e=TJe(e,{...t,disabledHelpers:o}),r&&n&&o.length>0)for(let c of al(e))e=e.replace(c,sJe(c,o,"./"));t.noEscaping&&(e=KSr(e));let u=(t.noHelpers?kJe:fre).compile(e,{strict:!1});return cre[i]=u,u}a(HSr,"createTemplate");async function hM(e,t,r){CJe(e);for(let n of Object.keys(e||{}))if(e[n]!=null){let i=e[n],o=i;typeof i=="string"?o=await pre(e[n],t,r):typeof i=="object"&&(o=await hM(e[n],t,r)),e[n]=o}return e}a(hM,"processObject");async function pre(e,t,r){return Zn(e,t,r)}a(pre,"processString");function eI(e,t,r){CJe(e);for(let n of Object.keys(e||{})){let i=e[n];typeof i=="string"?e[n]=Zn(e[n],t,r):typeof i=="object"&&(e[n]=eI(e[n],t,r))}return e}a(eI,"processObjectSync");function VSr(e,t,r){let n=e;if(typeof e!="string")throw new Error("Cannot process non-string types.");function i(o){let s=HSr(o,r,t),u=Math.floor(Date.now()/1e3)*1e3,c=s({now:new Date(u).toISOString(),__opts:{...r,input:o},...t});return r?.logging?RJe(c):AJe(c)}a(i,"process");try{if(r&&r.onlyFound){let o=[],s=al(e);for(let u of s){let c=i(u);typeof c=="object"&&"result"in c?(o=o.concat(c.logs||[]),e=e.replace(u,c.result)):e=e.replace(u,c)}return r?.logging?{result:e,logs:o}:e}else return i(e)}catch(o){let{noThrow:s=!0}=r||{};if(s)return n;throw o}}a(VSr,"processStringSyncInternal");function Zn(e,t,r){return VSr(e,t,{...r,logging:!1})}a(Zn,"processStringSync");function KSr(e){let t=aJe(e);if(t==null)return e;let r=[...new Set(t)];for(let n of r){let i=new RegExp(`${n}(?!})`,"g");e=e.replace(i,`{${n}}`)}return e}a(KSr,"disableEscaping");function dre(e){return mM(e)!=null}a(dre,"isJSBinding");function mM(e){if(!e||typeof e!="string"||!e.trim().startsWith("{{ js "))return null;let t=new RegExp(/{{ js "(.*)" }}/),r=e.match(t);return!r||r.length<2?null:lM(r[1])}a(mM,"decodeJSBinding");function DJe(e,t){let r=new RegExp(YO),n=e.match(r);if(n==null)return!1;for(let i of n){let o=i;dre(i)&&(o=mM(i));let s=!0;for(let u of t)o.includes(u)||(s=!1);if(s)return!0}return!1}a(DJe,"doesContainStrings");function al(e){if(!e||typeof e!="string")return[];let t=new RegExp(tre),r=e.match(t);return r??[]}a(al,"findHBSBlocks");function QSr(){let e=gb()?IJe.default:OJe.default;ZO((t,r)=>{e.createContext(r);let n=fM(t),i=e.runInNewContext(n,r);if(i.error)throw new il(i.error);return i.result})}a(QSr,"browserJSSetup");function YSr(){JO()?vJe():QSr()}a(YSr,"defaultJSSetup");YSr();var JSr=gr.MIN_VALID_DATE.toISOString(),XSr=gr.MAX_VALID_DATE.toISOString();function hre(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||JSr,e.endDate=e.endDate||XSr),e}a(hre,"fillDates");async function PJe(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(n=>re.getProdWorkspaceID(n)));let t={};function r(n,i){i?.length&&(t.oneOf={...t.oneOf,[n]:i})}return a(r,"addStringParams"),r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=hre(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}a(PJe,"getSearchFilters");function mre(e,t,r){let n={_id:e,status:"deleted"};switch(t){case"app":n.name=r?.appName;break;case"user":n.email=r?.email;break}return n}a(mre,"deleted");function gre(e){let t=al(e);for(let r of t){let n=` "${r}"`;e=e.replace(e.includes(n)?n:` ${r}`,""),e=Zn(e,{})}return e}a(gre,"removeTemplateStrings");function NJe(e,t){let r=Bb[e];if(!r)throw new Error("No friendly name found.");let n=Zn(r,t);return n.includes('""')&&(n=gre(r)),n}a(NJe,"getEventFriendlyName");async function ZSr(e,t,r){if(!await oj()||!Cr.isAudited(e))return;let n=NJe(e,t),i=new Date;r?.timestamp&&(i=new Date(r.timestamp));let o={timestamp:i.toISOString(),event:e,name:n,userId:r?.userId||sse,metadata:{...t,...r?.hostInfo}},s={};try{if(r?.appId){o.appId=re.getProdWorkspaceID(r.appId);let u=await Ht.workspace.getWorkspaceMetadata(r.appId);"name"in u&&(s.appName=u.name)}if(r?.userId){let u=await qt.getById(r?.userId);s.email=u.email}}catch(u){kt.logAlert("Failed to retrieve fallback information for audit log",u)}return o.fallback=s,await WVe(o)}a(ZSr,"write");async function e0r(e){let t=e.map(u=>u.userId),n=e.filter(u=>u.appId).map(u=>re.getDevWorkspaceID(u.appId)),i=await qt.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),o=await re.getWorkspacesByIDs([...new Set(n)]),s=[];for(let u of e){let c=i.find(p=>p?._id===u.userId),l=o.find(p=>re.isSameWorkspaceID(p?.appId,u.appId)),f={event:u.event,timestamp:u.timestamp,name:u.name,metadata:u.metadata,user:c||mre(u.userId,"user",u.fallback)};u.appId&&(f.app=l||mre(u.appId,"app",u.fallback)),s.push(f)}return s}a(e0r,"enrich");async function t0r(e){if(!await oj())throw new Error("Audit logs not available - license required.");let t=await PJe(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await _ee(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await e0r(r.rows)}}a(t0r,"fetch");function r0r(e){return e=hre(e),GVe(e)}a(r0r,"download");function n0r(){let e=Object.entries(Bb).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=gre(r[1]);return t}a(n0r,"definitions");var wre={};oe(wre,{applications:()=>vre,roles:()=>bre,users:()=>yre});var yre={};oe(yre,{roleCheck:()=>a0r});function i0r(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(i0r,"removeRoles");async function a0r(e,t){return await Mp()||i0r(e,t),e}a(a0r,"roleCheck");var bre={};oe(bre,{assign:()=>o0r,unAssign:()=>s0r});async function o0r(e,t){if(!await Mp())throw new Error("Unable to assign roles - license required.");let r=await Wu.bulkGet(e);for(let n of r){if(t.role&&t.role.roleId){let i=re.getProdWorkspaceID(t.role.appId);n.roles[i]=t.role.roleId}if(t.appBuilder){let i=re.getProdWorkspaceID(t.appBuilder.appId),o=n.builder?.apps||[];n.builder={apps:o.concat([i])}}t.builder&&(n.builder={global:!0}),t.admin&&(n.admin={global:!0}),n.roles}await Wu.bulkUpdate(r)}a(o0r,"assign");async function s0r(e,t){if(!await Mp())throw new Error("Unable to un-assign roles - license required.");let r=await Wu.bulkGet(e);for(let n of r){if(t.role){let i=re.getProdWorkspaceID(t.role?.appId);n.roles[i]===t.role.roleId&&delete n.roles[i]}if(t.appBuilder&&n.builder?.apps){let i=re.getProdWorkspaceID(t.appBuilder.appId);n.builder.apps=n.builder.apps.filter(o=>o!==i)}t.builder&&n.builder&&delete n.builder,t.admin&&n.admin&&delete n.admin}}a(s0r,"unAssign");var vre={};oe(vre,{buildExportFn:()=>c0r,buildImportFn:()=>u0r});function u0r(e){return async(t,r)=>{await Mp()||t.throw(403,"Endpoint unavailable, license required."),t.request.files?.appExport||t.throw(400,"Must provide app export file for import."),await W.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}a(u0r,"buildImportFn");function c0r(e){return async(t,r)=>{await Mp()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:n,excludeRows:i}=t.request.body;await W.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:n,excludeRows:i},t.query.appId=t.params.appId,await e(t),await r()})}}a(c0r,"buildExportFn");var UJe=te(require("fs")),jJe=require("path");var LJe;function FJe(){LJe=new fo.BudibaseQueue(fo.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}a(FJe,"init");function bb(){return LJe}a(bb,"getBackupQueue");async function Ere(e,t={}){return zu.storeAppBackupMetadata(e,t)}a(Ere,"storeAppBackupMetadata");function MJe(e){let t=new Date().toISOString();switch(e){case"complete":case"failed":return{timestamp:t,finishedAt:t};case"started":return{timestamp:t,startedAt:t};case"pending":return{timestamp:t,createdAt:t}}}a(MJe,"getTimestamps");async function f0r(e,t,r,n){let i=await gM(e);return await zu.storeAppBackupMetadata({...i,...MJe(t),contents:r,status:t,type:"backup"},{filename:n,docId:e})}a(f0r,"updateBackupStatus");async function p0r(e,t,r){let n=await gM(e);return await zu.storeAppBackupMetadata({...n,...MJe(r),status:r,type:"restore",trigger:"manual"},{docId:e,docRev:t})}a(p0r,"updateRestoreStatus");async function gM(e){return zu.getAppBackupMetadata(e)}a(gM,"getAppBackup");async function d0r(e,t){return zu.updateAppBackupMetadata(e,t)}a(d0r,"updateAppBackup");async function BJe(e){let t=await zu.getAppBackupMetadata(e);return t.filename&&await bt.deleteFile(bt.ObjectStoreBuckets.BACKUPS,t.filename),zu.deleteAppBackupMetadata(e)}a(BJe,"deleteAppBackup");async function h0r(e){let t=[];for(let r of e)try{await BJe(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(h0r,"deleteAppBackups");async function m0r(e,t){return zu.fetchAppBackups(e,t)}a(m0r,"fetchAppBackups");async function qJe(e){let t=await zu.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let r=await bt.getReadStream(bt.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}a(qJe,"getBackupDownloadStream");async function g0r(e){let{stream:t}=await qJe(e),r=(0,jJe.join)(bt.budibaseTempDir(),Cr.newid()),n=UJe.default.createWriteStream(r);return new Promise((i,o)=>{t.on("error",o),n.on("error",o),t.pipe(n).on("close",()=>i(r))})}a(g0r,"downloadAppBackup");async function y0r(e,t,r={}){let n;try{n=await Ere({appId:e,trigger:t,timestamp:new Date().toISOString(),status:"pending",type:"backup",...r})}catch(i){if(i.status===409)return;throw i}return await bb().add({docId:n.id,docRev:n.rev,appId:e,export:{trigger:t,...r}}),await Tt.backup.appBackupTriggered(e,n.id,"backup",t,r?.name),n.id}a(y0r,"triggerAppBackup");async function b0r(e,t,r,n){let i=await gM(t),o;try{o=await Ere({appId:e,timestamp:new Date().toISOString(),status:"pending",type:"restore",createdBy:n})}catch(s){if(s?.status===409)return;throw s}return await bb().add({appId:e,docId:o.id,docRev:o.rev,import:{nameForBackup:r,backupId:t,createdBy:n}}),{restoreId:o.id,metadata:i}}a(b0r,"triggerAppRestore");async function v0r(e,t,r){let n=re.getProdWorkspaceID(e);await W.doInWorkspaceContext(n,async()=>{let i=W.getProdWorkspaceDB();if(!await i.exists())return;let s=await i.tryGet("app_metadata");s&&(s.backupErrors||(s.backupErrors={}),s.backupErrors[t]||(s.backupErrors[t]=[]),s.backupErrors[t].push(r),await i.put(s),await Ht.workspace.invalidateWorkspaceMetadata(s.appId,s))})}a(v0r,"trackBackupError");var w0r={isEnabled:YZ,triggerAppRestore:qo(b0r),triggerAppBackup:qo(y0r),getBackupDownloadStream:qo(qJe),downloadAppBackup:qo(g0r),fetchAppBackups:qo(m0r),storeAppBackupMetadata:qo(Ere),updateBackupStatus:qo(f0r),updateRestoreStatus:qo(p0r),getAppBackup:qo(gM),updateAppBackup:qo(d0r),deleteAppBackup:qo(BJe),deleteAppBackups:qo(h0r),trackBackupError:qo(v0r)},Qu=w0r;var Sre={};oe(Sre,{init:()=>_re});var P_=te(require("fs"));async function _re(e){bb().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),S0r(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),_0r(t,e)}catch(n){kt.logAlert(`Failed to perform backup for app ID: ${r.appId}`,n)}})}a(_re,"init");async function E0r(e){await re.getDB(e,{skip_setup:!0}).destroy()}a(E0r,"removeExistingApp");async function $Je(e,t,r,n){let i=re.getDevWorkspaceID(r),o=re.getProdWorkspaceID(r),s=new Date().toISOString(),u=a(async(c,l)=>{n?.doc?await Qu.updateBackupStatus(n.doc.id,c,l?.contents,l?.filename):await Qu.storeAppBackupMetadata({appId:o,timestamp:s,trigger:e,status:c,name:n?.name,type:"backup",contents:l?.contents,createdBy:n?.createdBy},{filename:l?.filename})},"updateMetadata");try{let c=await n.processing.exportAppFn(i,{tar:!0}),l=await n.processing.statsFn(i),f=`${o}/backup-${s}.tar.gz`,p=bt.ObjectStoreBuckets.BACKUPS,d=P_.default.createReadStream(c);await bt.streamUpload({bucket:p,filename:f,stream:d,extra:{type:"application/gzip",metadata:{name:n?.name,trigger:e,timestamp:s,appId:o}}}),await u("complete",{filename:f,contents:l}),P_.default.existsSync(c)&&P_.default.rmSync(c)}catch(c){kt.logAlert("App backup error",c),await u("failed");let l=n?.doc?.id||`backup-${s}`,f=c instanceof Error?c.message:String(c);await Qu.trackBackupError(o,l,`Backup export failed: ${f}`)}}a($Je,"runBackup");async function _0r(e,t){let r=e.data,n=r.appId,i=r.import.backupId,o=r.import.nameForBackup,s=r.import.createdBy,u=vt.getTenantIDFromWorkspaceID(n);return vt.doInTenant(u,async()=>{let c=re.getDevWorkspaceID(n),l=`${c}_temp_${Date.now()}`,{rev:f}=await Qu.updateRestoreStatus(r.docId,r.docRev,"started");await $Je("restoring",u,n,{processing:t,createdBy:s,name:o});let p=await Qu.downloadAppBackup(i),d="complete";try{await t.importAppFn(l,re.getDB(l),{file:{type:"application/gzip",path:p},key:p}),await E0r(c),await new re.Replication({source:l,target:c}).replicate()}catch(h){kt.logAlert("App restore error",h),d="failed";let m=h instanceof Error?h.message:String(h);await Qu.trackBackupError(n,i,`Backup restore failed: ${m}`)}finally{try{await re.getDB(l,{skip_setup:!0}).destroy()}catch{}}await Qu.updateRestoreStatus(r.docId,f,d),P_.default.existsSync(p)&&P_.default.rmSync(p,{force:!0})})}a(_0r,"importProcessor");async function S0r(e,t){let r=e.data,n=r.appId,i=r.export.trigger,o=r.export.name,s=vt.getTenantIDFromWorkspaceID(n);await vt.doInTenant(s,async()=>{try{let{rev:u}=await Qu.updateBackupStatus(r.docId,"started");return $Je(i,s,n,{processing:t,doc:{id:r.docId,rev:u},name:o})}catch(u){kt.logAlert("App backup error",u);let c=u instanceof Error?u.message:String(u);await Qu.trackBackupError(n,r.docId,`Backup export failed: ${c}`)}})}a(S0r,"exportProcessor");var x0r=a(async e=>{FJe(),await _re(e.processing)},"init"),Xs={...Qu,processing:Sre,init:x0r,getBackupQueue:bb};var T0r=a(async e=>{e.backups&&await Xs.init(e.backups)},"init");var Zs={};oe(Zs,{create:()=>O0r,find:()=>R0r,get:()=>A0r,remove:()=>k0r,update:()=>I0r});var zJe=te(require("lodash/fp/merge"));async function A0r(e){let t=vt.getGlobalDB(),r=new re.QueryBuilder(t.name,"user");r.setIndexBuilder(re.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[i,o]of Object.entries(e.filters?.equal??{}))r.addEqual(i,o);r.setSort("_id"),r.setSkip(e.skip);let n=await r.run();return{users:n.rows,total:n.totalRows}}a(A0r,"get");async function R0r(e){return await qt.getById(e)}a(R0r,"find");async function O0r(e){let t=await Wu.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new Ie("User is already synched",409);e={...t,scimInfo:(0,zJe.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Wu.save(e,{requirePassword:!1})}a(O0r,"create");async function I0r(e,t){return await Wu.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}a(I0r,"update");async function k0r(e){return await Wu.destroy(e)}a(k0r,"remove");var tI={};oe(tI,{create:()=>C0r});var WJe=te(require("lodash/fp/merge"));async function C0r(e){let t=await AZ(e.name),r;if(!t)r=(await on.save(e)).id;else{if(t.scimInfo?.isSync)throw new Ie("Group is already synched",409);r=t._id,t.users&&(await on.removeUsers(r,t.users.map(i=>i._id)),delete t.users),t.scimInfo=(0,WJe.default)(t.scimInfo,e.scimInfo),await on.save(t)}return await on.get(r)}a(C0r,"create");var N_={};oe(N_,{logRequest:()=>D0r,logResponse:()=>P0r});async function D0r(e){kt.logWarn("SCIM request log",e)}a(D0r,"logRequest");async function P0r(e){kt.logWarn("SCIM response error",e)}a(P0r,"logResponse");var ki={};oe(ki,{requireFeature:()=>N0r,requireFeatures:()=>L0r});var N0r=a(e=>async(t,r)=>{await aj(e),await r()},"requireFeature"),L0r=a((...e)=>async(t,r)=>{await QZ(e),await r()},"requireFeatures");var GJe=a(async(e,t)=>(V.DISABLE_SCIM_CALLS||await N_.logRequest({...e.request.toJSON(),body:e.request.body}),await W.doInScimContext(async()=>{let r=await t();return await N_.logResponse({...e.response.toJSON(),body:e.response.body}),r})),"doInScimContext");var HJe=a(async(e,t)=>{await ZZ(),await t()},"requireSCIM");var yM=a(e=>xre(qt.getById,e,!0),"scimUserOnly"),bM=a(e=>xre(Xn.get,e,!0),"scimGroupOnly"),vM=a(e=>xre(Xn.get,e,!1),"internalGroupOnly");function xre(e,t,r){return async(n,i)=>{let o=n.params[t];return typeof o!="string"&&n.throw(404),!!(await e(o)).scimInfo?.isSync!==r&&n.throw(404),i()}}a(xre,"scimSyncChecks");var F0r=require("dd-trace");async function VJe(e){let t=e.request.body;if(t.name=t.name.trim(),delete t.roles,t._id){let n=await im(t._id);t.roles=n.roles,t.scimInfo=n.scimInfo}let r=await h_(t);e.body={_id:r.id,_rev:r.rev}}a(VJe,"save");async function KJe(e){let t=e.params.groupId,r=e.request.body.add,n=e.request.body.remove;(r&&!Array.isArray(r)||n&&!Array.isArray(n))&&e.throw(400,"Must supply a list of users to add or to remove");let i,o;r&&(i=await lj(t,r)),n&&(o=await lee(t,n)),e.body={added:i,removed:o}}a(KJe,"updateGroupUsers");async function QJe(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 fee(t,{appsToAdd:r,appsToRemove:n})}a(QJe,"updateGroupApps");async function YJe(e){e.body={data:await _O()}}a(YJe,"fetch");async function JJe(e){let{groupId:t,rev:r}=e.params;try{await cee(t,r),e.body={message:"Group deleted successfully"}}catch(n){e.throw(n.status,n)}}a(JJe,"destroy");async function XJe(e){try{e.body=await im(e.params.groupId)}catch(t){e.throw(t.status,t)}}a(XJe,"find");async function ZJe(e){let{pageSize:t=10,bookmark:r,emailSearch:n}=e.request.query,i=e.params.groupId,o={limit:t+1},s=await GU(i,{...o,emailSearch:n,bookmark:r}),u=n?s[t]?.email:s[t]?._id,c=!!u;e.body={users:s.slice(0,t),bookmark:u,hasNextPage:c}}a(ZJe,"searchUsers");async function eXe(e){let{groupId:t,appId:r}=e.params;await pee(t,r),e.body={message:"Group app builder access updated."}}a(eXe,"addAppBuilder");async function tXe(e){let{groupId:t,appId:r}=e.params;await dee(t,r),e.body={message:"group app builder access removed."}}a(tXe,"removeAppBuilder");async function rXe(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 GR.jsonFromCsvString(r,{allowSingleColumn:!0});(!n||n.length===0)&&e.throw(400,"CSV file is invalid");let o=Object.keys(n[0]).find(p=>/^(email|e-mail|email address|mail|e_mail)$/i.test(p.trim()));o||e.throw(400,"CSV file must contain an email column");let s=Array.from(new Set(n.map(p=>p[o]).filter(p=>p&&typeof p=="string"&&p.trim().length>0).map(p=>p.trim())));s.length===0&&e.throw(400,"No valid email addresses found in CSV");try{await im(t)}catch(p){if(p.status===404)e.throw(404,"Group not found");else throw p}let u=[],c=[],l=[],f=await Promise.all(s.map(p=>Wu.getUserByEmail(p)));for(let p of s){let d=f.find(h=>h?.email===p);d?(u.push({_id:d._id,email:d.email}),l.push(d._id)):c.push({email:p,reason:"User not found"})}l.length>0&&await lj(t,l),e.body={added:u,skipped:c}}a(rXe,"bulkAddUsersFromCsv");var nXe=te(require("@koa/router")),zo=te(require("joi"));var M0r=new nXe.default;function B0r(){return Qt.joiValidator.body(zo.default.object({_id:zo.default.string().optional(),_rev:zo.default.string().optional(),color:zo.default.string().required(),icon:zo.default.string().required(),name:zo.default.string().trim().required().max(50),role:zo.default.string().optional(),users:zo.default.array().optional(),apps:zo.default.array().optional(),roles:zo.default.object().optional(),createdAt:zo.default.string().optional(),updatedAt:zo.default.string().optional()}).required())}a(B0r,"buildGroupSaveValidation");M0r.post("/api/global/groups",Qt.adminOnly,ki.requireFeature("userGroups"),B0r(),VJe).get("/api/global/groups",ki.requireFeature("userGroups"),YJe).delete("/api/global/groups/:groupId/:rev",ki.requireFeature("userGroups"),Qt.adminOnly,vM("groupId"),JJe).get("/api/global/groups/:groupId",ki.requireFeature("userGroups"),Qt.builderOrAdmin,XJe).get("/api/global/groups/:groupId/users",ki.requireFeature("userGroups"),Qt.builderOrAdmin,ZJe).post("/api/global/groups/:groupId/users",Qt.adminOnly,ki.requireFeature("userGroups"),vM("groupId"),KJe).post("/api/global/groups/:groupId/users/bulk",Qt.adminOnly,ki.requireFeature("userGroups"),vM("groupId"),Qt.joiValidator.body(zo.default.object({csvContent:zo.default.string().required()}).required()),rXe).post("/api/global/groups/:groupId/apps",Qt.builderOrAdmin,ki.requireFeature("userGroups"),QJe).post("/api/global/groups/:groupId/app/:appId/builder",Qt.builderOrAdmin,ki.requireFeatures("userGroups","appBuilders"),eXe).delete("/api/global/groups/:groupId/app/:appId/builder",Qt.builderOrAdmin,ki.requireFeatures("userGroups","appBuilders"),tXe);async function iXe(e){e.body={encryptionKeyAvailable:rl.isEncryptionKeyAvailable()}}a(iXe,"status");async function aXe(e){e.body={variables:await rl.fetch()}}a(aXe,"fetch");async function oXe(e){let{name:t,production:r,development:n}=e.request.body;await rl.update(t,{production:r,development:n});let i=["production"];r!==n&&i.push("development"),await Tt.environmentVariable.created(t,i),e.body={message:`Environment variable "${t}" created.`}}a(oXe,"create");async function sXe(e){let{production:t,development:r}=e.request.body,n=e.params.varName;await rl.update(n,{production:t,development:r}),e.body={message:`Environment variable "${n}" updated.`}}a(sXe,"update");async function uXe(e){let t=e.params.varName;await rl.remove(t),await Tt.environmentVariable.deleted(t),e.body={message:`Environment variable "${t}" deleted.`}}a(uXe,"destroy");var lXe=te(require("@koa/router")),rI=te(require("joi"));var $0r=new lXe.default;function cXe(){return Qt.joiValidator.body(rI.default.object({name:rI.default.string().optional(),production:rI.default.string().required(),development:rI.default.string().required()}))}a(cXe,"buildEnvVarUpdateValidator");$0r.get("/api/env/variables/status",Qt.builderOrAdmin,iXe).get("/api/env/variables",Qt.builderOrAdmin,aXe).post("/api/env/variables",Qt.builderOrAdmin,cXe(),oXe).patch("/api/env/variables/:varName",Qt.builderOrAdmin,cXe(),sXe).delete("/api/env/variables/:varName",Qt.builderOrAdmin,uXe);async function fXe(e){let t=e.request.body,r=await yb.fetch(t);await Tt.auditLog.filtered(t),e.body=r}a(fXe,"search");async function pXe(e){let t=e.request.body,{stream:r}=yb.download(t);await Tt.auditLog.downloaded(t),e.attachment(`audit-logs-${Date.now()}.log`),e.body=r}a(pXe,"download");async function dXe(e){e.body={events:yb.definitions()}}a(dXe,"definitions");var mXe=te(require("@koa/router")),Yu=te(require("joi"));function hXe(){return Qt.joiValidator.body(Yu.default.object({userIds:Yu.default.array().items(Yu.default.string()).optional(),appIds:Yu.default.array().items(Yu.default.string()).optional(),events:Yu.default.array().items(Yu.default.string().valid(...Object.values(Er))).optional(),startDate:Yu.default.string().optional().allow(""),endDate:Yu.default.string().optional().allow(""),fullSearch:Yu.default.string().optional().allow(""),bookmark:Yu.default.number()}))}a(hXe,"buildAuditLogSearchValidator");var W0r=new mXe.default;W0r.post("/api/global/auditlogs/search",Qt.adminOnly,hXe(),fXe).get("/api/global/auditlogs/download",Qt.adminOnly,AU.querystringToBody,hXe(),pXe).get("/api/global/auditlogs/definitions",Qt.adminOnly,dXe);var SXe=te(require("@koa/router")),Eb=te(require("joi"));async function wb(e,t){t||e.throw(400,"App ID missing"),await bO.workspaceExists(t)||e.throw(400,`Provided app ID: ${t} - is invalid.`)}a(wb,"checkAppID");async function gXe(e){let t=e.params.appId;await wb(e,t);let{body:r}=e.request,n=e.user?._id,i=await Xs.triggerAppBackup(t,"manual",{name:r.name,createdBy:n});i||e.throw(500,"Unable to start backup."),e.body={backupId:i,message:"Backup triggered - process starting."}}a(gXe,"manualBackup");async function yXe(e){let t=e.params.appId;await wb(e,t);let r=e.params.backupId,n=e.request.body.name,i=await Xs.triggerAppRestore(t,r,n,e.user?._id);i||e.throw(500,"Unable to start restore."),await Tt.backup.appBackupRestored(i.metadata),e.body={restoreId:i?.restoreId,message:"Restore triggered - process starting."}}a(yXe,"importBackup");async function bXe(e){let t=e.params.appId;await wb(e,t);let r=e.params.backupId;await Xs.deleteAppBackup(r),e.body={message:"Backup deleted successfully."}}a(bXe,"deleteBackup");async function vXe(e){let t=W.getWorkspaceId();await wb(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 Xs.deleteAppBackups(r),i=n.filter(s=>s.success).length,o=n.length-i;e.body={message:`${i} backups deleted successfully${o>0?`, ${o} failed`:""}.`,results:n,successCount:i,failureCount:o}}a(vXe,"deleteBackups");async function wXe(e){let t=e.params.appId;await wb(e,t);let r=e.request.body;r?.trigger&&(r.trigger=r.trigger.toLowerCase(),Object.values(Rm).includes(r.trigger)||e.throw(400,"Provided trigger is not a valid option.")),e.body=await Xs.fetchAppBackups(t,{paginate:!0,...r})}a(wXe,"fetchBackups");async function EXe(e){let t=e.params.appId;await wb(e,t);let r=e.params.backupId,n=e.request.body;e.body=await Xs.updateAppBackup(r,n.name)}a(EXe,"updateBackup");async function _Xe(e){let t=e.params.appId;await wb(e,t);let r=e.params.backupId,{metadata:n,stream:i}=await Xs.getBackupDownloadStream(r);e.attachment(`backup-${n.timestamp}.tar.gz`),e.body=i}a(_Xe,"downloadBackup");var H0r=new SXe.default;function V0r(){return Qt.joiValidator.body(Eb.default.object({trigger:Eb.default.string().valid(...Object.values(Rm)),type:Eb.default.string().valid(...Object.values(bS)),startDate:Eb.default.date(),endDate:Eb.default.date(),page:Eb.default.string()}))}a(V0r,"validateBackupSearch");H0r.post("/api/apps/:appId/backups",Qt.builderOrAdmin,gXe).post("/api/apps/:appId/backups/search",Qt.builderOrAdmin,V0r(),wXe).get("/api/apps/:appId/backups/:backupId/file",Qt.builderOrAdmin,_Xe).patch("/api/apps/:appId/backups/:backupId",Qt.builderOrAdmin,EXe).delete("/api/apps/:appId/backups/:backupId",Qt.builderOrAdmin,bXe).delete("/api/apps/:appId/backups",Qt.builderOrAdmin,vXe).post("/api/apps/:appId/backups/:backupId/import",Qt.builderOrAdmin,yXe);var QXe=te(require("@koa/router"));var AM=te(Gre());function UXe(e,t){let r=e.request.query[t];if(r!==void 0)return+r}a(UXe,"tryGetQueryAsNumber");var jXe=a(async e=>{let t=UXe(e,"pageSize")??20,r=UXe(e,"startIndex"),n;e.request.query.filter&&(n=la.user.userFilters(e.request.query.filter));let i=await Zs.get({pageSize:t,skip:r,filters:n});e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:i.total,Resources:i.users.map(la.user.toScimUserResponse),startIndex:(r||0)+1,itemsPerPage:t}},"get"),MXe=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404);let r=await Zs.find(t);e.body=la.user.toScimUserResponse(r)},"find"),BXe=a(async e=>{let t=la.user.fromScimUser(e.request.body);try{let r=await Zs.create(t);e.body=la.user.toScimUserResponse(r)}catch(r){throw r instanceof mp&&e.throw(409,"Email already in use"),r}},"create");function gxr(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(gxr,"isDeactivation");var qXe=a(async e=>{let t=await Zs.find(e.params.id);t||e.throw(404);let r=la.user.toScimUserResponse(t),n=e.request.body;try{(0,AM.patchBodyValidation)(n)}catch{}if(gxr(n))return Hre(e);let i;try{i=(0,AM.scimPatch)(r,n.Operations)}catch{}i||e.throw(500);let o=la.user.fromScimUser(i);await Zs.update(o,{allowChangingEmail:!0}),e.body=la.user.toScimUserResponse(o)},"update"),Hre=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404),await Zs.remove(t),e.status=204},"remove");var $Xe=te(require("lodash/groupBy"));var RM=te(Gre());var OM=te(TM());function zXe(e,t){for(let r of t.split(","))delete e[r]}a(zXe,"cleanResponse");var WXe=a(async e=>{let r=(await on.fetch()).filter(o=>o.scimInfo?.isSync).map(la.group.toScimGroupResponse),{filter:n,excludedAttributes:i}=e.request.query;if(n){let o=(0,OM.filter)((0,OM.parse)(n));r=r.filter(o)}i&&r.forEach(o=>{zXe(o,i)}),e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:r.length,Resources:r,startIndex:1,itemsPerPage:r.length}},"get"),GXe=a(async e=>{let t=la.group.fromScimGroup(e.request.body),r=await tI.create(t);e.body=la.group.toScimGroupResponse(r)},"create"),HXe=a(async e=>{let{id:t}=e.params,r=await on.get(t),n=la.group.toScimGroupResponse(r),{excludedAttributes:i}=e.request.query;i&&zXe(n,i),e.body=n},"find"),VXe=a(async e=>{let{id:t}=e.params,r=await on.get(t);await on.remove(t,r._rev),e.status=204},"remove"),KXe=a(async e=>{let{id:t}=e.params,r=await on.get(t),n=la.group.toScimGroupResponse(r),i=e.request.body;try{(0,RM.patchBodyValidation)(i)}catch{e.throw(400)}let{true:o,false:s}=(0,$Xe.default)(i.Operations,u=>u.path==="members");if(s?.length){let u=(0,RM.scimPatch)(n,s);u||e.throw(500);let c={...la.group.fromScimGroup(u),_rev:r._rev};await on.save(c)}if(o?.length){let u=[],c=[];for(let{op:l,value:f}of o)switch(l){case"add":case"Add":for(let p of f)u.push(await Zs.find(p.value));break;case"remove":case"Remove":for(let p of f)c.push(await Zs.find(p.value));break;case"replace":case"Replace":throw new Error("Replacing members is not allowed");default:tr.unreachable(l)}u.length&&await on.addUsers(t,u.map(l=>l._id)),c.length&&await on.removeUsers(t,c.map(l=>l._id))}e.body=la.group.toScimGroupResponse(await on.get(t))},"update");var Ju=new QXe.default({prefix:"/api/global/scim/v2"});Ju.use(HJe);Ju.use(GJe);Ju.get("/users",jXe);Ju.get("/users/:id",yM("id"),MXe);Ju.post("/users",BXe);Ju.patch("/users/:id",yM("id"),qXe);Ju.delete("/users/:id",yM("id"),Hre);Ju.get("/groups",WXe);Ju.post("/groups",ki.requireFeature("userGroups"),GXe);Ju.get("/groups/:id",ki.requireFeature("userGroups"),bM("id"),HXe);Ju.delete("/groups/:id",ki.requireFeature("userGroups"),bM("id"),VXe);Ju.patch("/groups/:id",ki.requireFeature("userGroups"),bM("id"),KXe);var XXe=te(require("@koa/router"));async function YXe(e){let{userId:t,appId:r}=e.params,n=await am.db.getUser(t);if(qt.isGlobalBuilder(n)){e.body={message:"User already admin - no permissions updated."};return}await am.addAppBuilder(n,r),e.body={message:`User "${n.email}" app builder access updated.`}}a(YXe,"addAppBuilder");async function JXe(e){let{userId:t,appId:r}=e.params,n=await am.db.getUser(t);if(qt.isGlobalBuilder(n)){e.body={message:"User already admin - no permissions removed."};return}await am.removeAppBuilder(n,r),e.body={message:`User "${n.email}" app builder access removed.`}}a(JXe,"removeAppBuilder");var wxr=new XXe.default;wxr.post("/api/global/users/:userId/app/:appId/builder",Qt.builderOrAdmin,ki.requireFeatures("appBuilders"),YXe).delete("/api/global/users/:userId/app/:appId/builder",Qt.builderOrAdmin,ki.requireFeatures("appBuilders"),JXe);var la={};oe(la,{group:()=>Kre,user:()=>Vre});var Vre={};oe(Vre,{fromScimUser:()=>Axr,toScimUserResponse:()=>Sxr,userFilters:()=>Rxr});var ZXe=te(TM());var{unreachable:_xr}=tr,Sxr=a(e=>{let{isSync:t,roles:r,...n}=e.scimInfo||{},i={...n,schemas:["urn:ietf:params:scim:schemas:core:2.0:User"],id:e._id,meta:{resourceType:"User",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},active:e.status==="active"};return(e.firstName||e.lastName)&&(i.name={formatted:[e.firstName,e.lastName].filter(o=>o).join(" "),familyName:e.lastName,givenName:e.firstName}),i},"toScimUserResponse"),xxr=a(e=>!!e?.id,"isScimUserResponse");function Txr(e){if(Cr.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}a(Txr,"tryGetEmail");var Axr=a(e=>{let t=xxr(e)?e:void 0,r=Txr(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:_xr(e.active)}let i,o;return e.name?.givenName?(i=e.name?.givenName,o=e.name?.familyName):i=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:i,lastName:o,scimInfo:{...e,isSync:!0},roles:{},status:n?"active":"inactive",createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimUser"),Rxr=a(e=>{let t={equal:{}},r=(0,ZXe.parse)(e);function n(i){switch(i.op){case"eq":{let o=i.attrPath,s;switch(o){case"emails.value":s="email";break;default:s=`scimInfo.${o}`}t.equal[s]=i.compValue;break}case"and":for(let o of i.filters)n(o);break;default:console.warn("Filter not handled",{filter:i})}}return a(n,"parseFilters"),n(r),t},"userFilters");var Kre={};oe(Kre,{fromScimGroup:()=>kxr,toScimGroupResponse:()=>Oxr});var Oxr=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"),Ixr=a(e=>!!e?.id,"isScimGroup"),kxr=a(e=>{let t=Ixr(e)?e:void 0;return{_id:t?.id,name:e.displayName,scimInfo:{externalId:e.externalId,isSync:!0},icon:"UserGroup",color:"var(--spectrum-global-color-blue-600)",createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimGroup");var ci={};oe(ci,{LLM:()=>mf,LLMRequest:()=>Ci,TableGeneration:()=>yne,agentHistoryTitleSystemPrompt:()=>qxr,agentSystemPrompt:()=>Bxr,aiColumnSchemas:()=>mne,aiTableResponseToTableSchema:()=>fne,appendAIColumns:()=>pne,classifyText:()=>Jre,cleanData:()=>Xre,extractFileData:()=>Fxr,generateAIColumns:()=>cne,generateCode:()=>Mxr,generateCronExpression:()=>Zre,generateData:()=>lne,generateJs:()=>nne,generateSQL:()=>jxr,generateTables:()=>une,generationStructure:()=>hne,getLLM:()=>lI,getLLMConfig:()=>sne,getLLMOrThrow:()=>oZe,normalizeContentType:()=>Qre,parseResponseFormat:()=>kM,sanitiseToolName:()=>Cxr,searchWeb:()=>rne,sentimentAnalysis:()=>tne,summarizeText:()=>IM,tableDataStructuredOutput:()=>gne,translate:()=>ene});function Cxr(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(Cxr,"sanitiseToolName");function Qre(e){return e?e.includes("/")?e:{pdf:"application/pdf",jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png"}[e.toLowerCase()]||"application/octet-stream":"application/octet-stream"}a(Qre,"normalizeContentType");var CM=te(require("openai"));var pm=te(require("dd-trace"));function Yre(e,t){return t.map(r=>e[r]).join(" ")}a(Yre,"extractTextFromColumns");var mf=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 pm.default.trace("prompt",async()=>{let r=typeof t=="string"?new Ci().addUserMessage(t):t,{messages:n,tokensUsed:i}=await pm.default.trace("chatCompletion",()=>this.chatCompletion(r));return!n||n.length===0?{message:"",tokensUsed:i}:{message:n[n.length-1].content||"",tokensUsed:i}})}async chat(t){return await pm.default.trace("chat",async()=>await this.chatCompletion(t))}async*chatStream(t){yield*this.chatCompletionStream(t)}async summarizeText(t){return pm.default.trace("summarizeText",()=>this.prompt(IM(t)))}async generateCronExpression(t){return pm.default.trace("generateCronExpression",()=>this.prompt(Zre(t)))}async operation(t,r){return pm.default.trace("operation",n=>{n.addTags({operation:t.operation,rowId:r.id});let i=this.promptForOperation(t,r);return this.prompt(i)})}promptForOperation(t,r){let{operation:n,column:i,columns:o,language:s,categories:u,prompt:c}=t;switch(n){case"SUMMARISE_TEXT":return IM(Yre(r,o));case"CLEAN_DATA":return Xre(r[i]);case"TRANSLATE":return ene(r[i],s);case"CATEGORISE_TEXT":if(!u)throw Error("No categories provided for categorise text operation. Please provide categories.");return Jre(Yre(r,o),u.split(","));case"SENTIMENT_ANALYSIS":return tne(r[i]);case"PROMPT":return c;case"SEARCH_WEB":return rne(Yre(r,o));default:throw tr.unreachable(n)}}async generateJs(t,r){return await pm.default.trace("generateJs",async()=>{let{bindings:n=[],snippets:i=[]}=r||{};return await this.prompt(nne(n,i).addUserMessage(t))})}};var ine=require("openai/helpers/zod");var tZe=(n=>(n.GPT_5_MINI="gpt-5-mini",n.GPT_5="gpt-5",n.GPT_5_NANO="gpt-5-nano",n))(tZe||{});function kM(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}a(kM,"parseResponseFormat");function eZe(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}a(eZe,"calculateBudibaseAICredits");var Xu=class extends mf{constructor(r){super(r);this.client=this.getClient(r)}static{a(this,"OpenAI")}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new CM.default({apiKey:r.apiKey})}async uploadFile(r,n,i){let o=Qre(i);if(ok.includes(o.toLowerCase())){let c;if(Buffer.isBuffer(r))c=r;else{let f=[];for await(let p of r)f.push(new Uint8Array(p));c=Buffer.concat(f)}let l=c.toString("base64");return`data:${o};base64,${l}`}let s=await(0,CM.toFile)(r,n);return(await this.client.files.create({file:s,purpose:"assistants"})).id}async chatCompletion(r){let n={model:this.model,messages:r.messages,max_completion_tokens:this._maxTokens,response_format:kM(r.format)};Object.values(tZe).includes(this.model)&&(n.verbosity="low",n.reasoning_effort="minimal"),r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(ine.zodFunction));let i=await this.client.chat.completions.create(n),o=i?.choices?.[0]?.message;if(o?.tool_calls){r.addMessage(o);let s=[];for(let u of o.tool_calls){if(u.type!=="function"||!u.function){console.warn(`[OPENAI TOOL WARN] Unsupported tool call type: ${u.type}`);continue}let c=u.function.name,l=r.findTool(c);if(!l)throw new Error(`Tool ${c} not found in prompt tools`);let f=JSON.parse(u.function.arguments);s.push(l.handler(f).then(p=>({role:"tool",tool_call_id:u.id,content:p})).catch(p=>(console.error(`[OPENAI TOOL ERROR] Tool ${c} failed in OpenAI handler:`,p),{role:"tool",tool_call_id:u.id,content:`Error: ${p.message}`})))}return r.addMessages(await Promise.all(s)),this.chatCompletion(r)}else{if(o?.content)return{messages:[...r.messages,{role:o.role,content:o.content}],tokensUsed:eZe(i.usage)};throw new Error("No response found")}}async*chatCompletionStream(r){let n={model:this.model,messages:r.messages,max_tokens:this.maxTokens,response_format:kM(r.format),stream:!0};r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(ine.zodFunction));try{let i=await this.client.chat.completions.create(n),o=null,s="",u=null;for await(let l of i){let f=l?.choices?.[0]?.delta;if(f){if(f.content&&(s+=f.content,yield{type:"content",content:f.content}),f.tool_calls&&f.tool_calls.length>0){let p=f.tool_calls[0];p.id?(o={id:p.id,name:p.function?.name||"",arguments:p.function?.arguments||""},yield{type:"tool_call_start",toolCall:{id:o.id,name:o.name,arguments:o.arguments}}):o&&p.function?.arguments&&(o.arguments+=p.function.arguments,yield{type:"tool_call_start",toolCall:{id:o.id,name:o.name,arguments:o.arguments}})}l.usage&&(u=l.usage)}}let c=u?eZe(u):0;if(o){r.addMessage({role:"assistant",content:"",tool_calls:[{id:o.id,type:"function",function:{name:o.name,arguments:o.arguments}}]});let l=r.findTool(o.name);if(l)try{let f=JSON.parse(o.arguments),p=await l.handler(f);yield{type:"tool_call_result",toolResult:{id:o.id,result:p}},r.addMessage({role:"tool",tool_call_id:o.id,content:p}),yield*this.chatCompletionStream(r);return}catch(f){yield{type:"tool_call_result",toolResult:{id:o.id,result:`Error: ${f.message}`,error:f.message}},r.addMessage({role:"tool",tool_call_id:o.id,content:`Error: ${f.message}`}),yield*this.chatCompletionStream(r);return}else{let f=`Tool '${o.name}' not found`;yield{type:"tool_call_result",toolResult:{id:o.id,result:f,error:f}},r.addMessage({role:"tool",tool_call_id:o.id,content:f}),yield*this.chatCompletionStream(r);return}}s&&r.addMessage({role:"assistant",content:s}),yield{type:"done",messages:r.messages,tokensUsed:c}}catch(i){yield{type:"error",content:i.message}}}};var ane=require("dd-trace");var DM=class extends mf{static{a(this,"BudibaseAI")}async prompt(t){let r=await super.prompt(t);return r.tokensUsed&&await uj(r.tokensUsed),r}async chat(t){let r=await super.chat(t);return r.tokensUsed&&await uj(r.tokensUsed),r}async uploadFile(t,r,n){return V.SELF_HOSTED?this.uploadFileSelfHost(t,r,n):this.uploadFileCloud(t,r,n)}async uploadFileCloud(t,r,n){return new Xu({apiKey:V.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).uploadFile(t,r,n)}async uploadFileSelfHost(t,r,n){let i;if(Buffer.isBuffer(t))i=t;else{let c=[];for await(let l of t)c.push(new Uint8Array(l));i=Buffer.concat(c)}let o=i.toString("base64");if(n&&ok.includes(n.toLowerCase()))return`data:image/jpeg;base64,${o}`;if(!V.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let c=await nj();if(!c)throw new Error("No license key found");this._apiKey=c}let s=await fetch(`${V.BUDICLOUD_URL}/api/ai/upload-file`,{method:"POST",headers:{"Content-Type":"application/json",[gr.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:o,filename:r,contentType:n})});if(!s.ok)throw await Ie.fromResponse(s);return(await s.json()).fileId}async chatCompletion(t){return V.SELF_HOSTED?this.chatCompletionSelfHost(t):this.chatCompletionCloud(t)}async chatCompletionCloud(t){return await ane.tracer.trace("chatCompletionCloud",async()=>await new Xu({apiKey:V.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletion(t))}async chatCompletionSelfHost(t){return await ane.tracer.trace("chatCompletionSelfHost",async r=>{if(!V.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(r.addTags({budicloudUrl:V.BUDICLOUD_URL}),!this._apiKey){let o=await nj();if(!o)throw new Error("No license key found");this._apiKey=o,r.addTags({licenseKey:this._apiKey})}let n={messages:t.messages,format:t.format,useTools:t.tools.length>0},i=await fetch(`${V.BUDICLOUD_URL}/api/ai/chat`,{method:"POST",headers:{"Content-Type":"application/json",[gr.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(n)});if(!i.ok)throw await Ie.fromResponse(i);return await i.json()})}async*chatCompletionStream(t){V.SELF_HOSTED?yield*this.chatCompletionStreamSelfHost(t):yield*this.chatCompletionStreamCloud(t)}async*chatCompletionStreamCloud(t){yield*new Xu({apiKey:V.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletionStream(t)}async*chatCompletionStreamSelfHost(t){try{let r=await this.chatCompletionSelfHost(t);if(r.messages.length>0){let n=r.messages[r.messages.length-1];n.content&&(yield{type:"content",content:n.content})}yield{type:"done",messages:r.messages,tokensUsed:r.tokensUsed}}catch(r){yield{type:"error",content:r.message}}}};var cI=require("dd-trace");var one=te(require("@anthropic-ai/sdk"));function Dxr(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}a(Dxr,"calculateBudibaseAICredits");var PM=class extends mf{constructor(r){super(r);this.client=new one.default({apiKey:r.apiKey})}static{a(this,"Anthropic")}firstTextBlock(r){for(let n of r.content)if(n.type==="text")return n.text}async uploadFile(r,n,i){throw new Error("File upload not supported for this LLM provider")}async chatCompletion(r){try{let n=await this.client.messages.create({model:this.model,messages:r.messages.map(({content:o})=>{if(o==null)return{role:"user",content:""};if(typeof o=="string")return{role:"user",content:o};let s="";for(let u of o)u.type==="text"?s+=u.text:["image_url","input_audio","file"].includes(u.type);return{role:"user",content:s}}),max_tokens:this.maxTokens}),i=this.firstTextBlock(n)||"";return{messages:[...r.messages,{role:"assistant",content:i}],tokensUsed:Dxr(n.usage)}}catch(n){throw n instanceof one.default.APIError&&console.error(`Anthropic Prompt failed with error ${n.name} and status: ${n.status}`),n}}async*chatCompletionStream(r){try{let n=await this.chatCompletion(r);if(n.messages.length>0){let i=n.messages[n.messages.length-1];i.content&&(yield{type:"content",content:i.content})}yield{type:"done",messages:n.messages,tokensUsed:n.tokensUsed}}catch(n){yield{type:"error",content:n.message}}}};var nZe=require("zod"),iZe=require("openai/helpers/zod");var rZe=require("openai");var NM=class extends Xu{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 rZe.AzureOpenAI({apiKey:t.apiKey,apiVersion:"2024-10-01-preview",baseURL:t.baseUrl})}};var aZe="gpt-5-mini",Pxr={OpenAI:Xu,TogetherAI:Xu,AzureOpenAI:NM,Custom:Xu,Anthropic:PM,BudibaseAI:DM};async function Nxr(){return await cI.tracer.trace("getAIConfig",async e=>{let t={type:"ai",config:{}};if(!W.isSelfHostUsingCloud()){let n=await Ba.getAIConfig();n&&(t=n)}await tee(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||aZe,apiKey:r.apiKey,baseUrl:r.baseUrl}})}a(Nxr,"getAIConfig");async function Lxr(){return cI.tracer.trace("getSelfHostOpenAIKeyConfig",e=>{if(!V.SELF_HOSTED){e.addTags({enabled:!1,reason:"not self host"});return}if(!V.OPENAI_API_KEY){e.addTags({enabled:!1,reason:"no OPENAI_API_KEY"});return}return e.addTags({enabled:!0}),{provider:"OpenAI",model:aZe,apiKey:V.OPENAI_API_KEY}})}a(Lxr,"getSelfHostOpenAIKeyConfig");async function sne(){return cI.tracer.trace("getLLMConfig",async()=>await Nxr()||await Lxr())}a(sne,"getLLMConfig");async function lI(e){return await cI.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:n}=e||{},i=await sne();if(!i){t.addTags({enabled:!1,reason:"no config found"});return}r&&(i.model=r),n&&(i.maxTokens=n);let o=Pxr[i.provider];if(!o){t.addTags({enabled:!1,reason:"no provider found",provider:i.provider});return}return new o(i)})}a(lI,"getLLM");async function oZe(){let e=await lI();if(!e)throw new Ie("No available LLM configurations",500);return e}a(oZe,"getLLMOrThrow");var Ci=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 nZe.z.ZodType?this.format=(0,iZe.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 Xp=require("zod");function IM(e,t){let r=`Summarize this text:
|
|
587
|
+
`).length,t=a(r=>(...n)=>{gb()||console[r](...n),n.forEach((o,s)=>{typeof o=="object"&&(n[s]=JSON.stringify(o))});let i=new Error().stack?.match(/<anonymous>:(\d+):\d+/)?.[1];logs.push({log:n,line:i?parseInt(i)-e:void 0,type:r})},"buildLogResponse");sandboxContext.console={log:t("log"),info:t("info"),debug:t("debug"),warn:t("warn"),error:t("error"),table:t("table")}}let res={data:pM(js,sandboxContext),logs};return`{{${C_} js_result-${JSON.stringify(res)}}}`}catch(e){nre&&nre(e);let{noThrow:t=!0}=context.__opts||{};if(e.code==="ERR_SCRIPT_EXECUTION_TIMEOUT")return"Timed out while executing JS";if(e.code==="JS_REQUEST_TIMEOUT_ERROR")return e.message;if(e.code===lm.code)return lm.message;if(e.code===il.code){if(t)return e.userScriptError.toString();throw e}if(e.name==="SyntaxError"){if(t)return e.toString();throw e}return"Error while executing JS"}}a(wJe,"processJS");var jSr={"<":"<",">":">"};function MSr(e){return e==null||typeof e!="object"?!1:e.toString()==="[object Object]"||e.length>0&&typeof e[0]=="object"}a(MSr,"isObject");var BSr=[new Hp(mb.OBJECT,e=>new dM.default.SafeString(JSON.stringify(e))),new Hp(mb.JS,wJe,!1),new Hp(mb.DECODE_ID,e=>{if(!e)return[];let t=typeof e=="string"?e:e._id,r=decodeURIComponent(t).replace(/'/g,'"');try{let n=JSON.parse(r);return Array.isArray(n)?n:[n]}catch{return[e]}}),new Hp(mb.ALL,(e,t)=>{let{__opts:r}=t;if(MSr(e))return new dM.default.SafeString(JSON.stringify(e));if(r&&r.onlyFound&&e==null)return r.input;if(e==null||typeof e!="string")return e??"";e&&e.string&&(e=e.string);let n=e;return r&&r.escapeNewlines&&(n=e.replace(/\n/g,"\\n")),n=new dM.default.SafeString(n.replace(/&/g,"&")),n==null||typeof n!="string"?n:n.replace(/[<>]/g,i=>jSr[i]||i)}),new Hp(mb.LITERAL,e=>{if(e===void 0)return"";let t=typeof e,r=t==="object"?JSON.stringify(e):e;return`{{${C_} ${t}-${r}}}`})];function EJe(){return Object.values(mb).concat(cM,Zte)}a(EJe,"HelperNames");function are(e){for(let t of BSr)t.register(e)}a(are,"registerMinimum");function _Je(e){are(e),rJe(e)}a(_Je,"registerAll");var SJe=["#","else","/"];var D_=class{static{a(this,"Preprocessor")}constructor(t,r){this.name=t,this.fn=r}process(t,r,n){let i=this.fn(r,n),o=t.indexOf(r);return rre(t,o,r.length,i)}},xJe=[new D_("swap-to-dot-notation",e=>{let t=e.indexOf("["),r=0;for(;t!==-1;){oJe(e.charAt(t-1))&&(e=rre(e,t+r,1,".[")),r=t+1;let n=e.substring(r+1).indexOf("[");t=n>0?r+1+n:-1}return e}),new D_("fix-functions",e=>{for(let t of SJe){let r=`{ ${t}`,n=`{${t}`;e=e.replace(new RegExp(r,"g"),n)}return e}),new D_("normalize-spaces",e=>e.replace(/{{(\s{2,})/g,"{{ ")),new D_("finalise",(e,t)=>{let n=!t?.noHelpers,i=e.slice(2,e.length-2);i.charAt(0)===" "&&(i=i.slice(1)),i.charAt(i.length-1)===" "&&(i=i.slice(0,i.length-1));let o=i.split(" ")[0];for(let u of SJe)if(o.includes(u))return e;let s=o.trim().toLowerCase();return n&&!t?.disabledHelpers?.includes(s)&&EJe().some(u=>s===u.toLowerCase())&&(i=`(${i})`),`{{ all ${i} }}`})];var ore=class{static{a(this,"Postprocessor")}constructor(t,r){this.name=t,this.fn=r}process(t){return this.fn(t)}},sre=[new ore("convert-literals",e=>{if(typeof e!="string"||!e.includes(C_))return{result:e};let t=e.indexOf("-"),r=e.substring(12,t),n=e.substring(t+1,e.length-2);switch(r){case"string":return{result:n};case"number":return{result:parseFloat(n)};case"boolean":return{result:n==="true"};case"object":return{result:JSON.parse(n)};case"js_result":{let i=JSON.parse(n);return{result:i.data,logs:i.logs}}}return{result:n}})];function ure(e,t,r){let n=[];for(let i of t){if(typeof e!="string")break;let o=new RegExp(YO),s=e.match(o);if(s!=null)for(let u of s){let c=i.process(e,u,r||{});typeof c=="object"?("logs"in c&&c.logs&&(n=n.concat(c.logs)),e=c.result):e=c}}return{result:e,logs:n}}a(ure,"process");function TJe(e,t){let r=xJe;return t.noFinalise&&(r=r.filter(n=>n.name!=="finalise")),ure(e,r,t).result}a(TJe,"preprocess");function AJe(e){return ure(e,sre).result}a(AJe,"postprocess");function RJe(e){return ure(e,sre)}a(RJe,"postprocessWithLogs");var fre=(0,lre.create)();_Je(fre);var zSr=Object.keys(fre.helpers),kJe=(0,lre.create)();are(kJe);var WSr={noHelpers:!1,cacheTemplates:!1,noEscaping:!1,escapeNewlines:!1,noFinalise:!1};function CJe(e){try{JSON.stringify(e)}catch{throw"Unable to process inputs to JSON, cannot recurse"}}a(CJe,"testObject");function GSr(e){return e?Object.keys(e).filter(r=>zSr.includes(r)):[]}a(GSr,"findOverlappingHelpers");var cre={};function HSr(e,t,r){t={...WSr,...t};let n=!t?.noHelpers,i=`${e}-${JSON.stringify(t)}`;if(t.cacheTemplates&&cre[i])return cre[i];let o=n?GSr(r):[];if(e=TJe(e,{...t,disabledHelpers:o}),r&&n&&o.length>0)for(let c of al(e))e=e.replace(c,sJe(c,o,"./"));t.noEscaping&&(e=KSr(e));let u=(t.noHelpers?kJe:fre).compile(e,{strict:!1});return cre[i]=u,u}a(HSr,"createTemplate");async function hM(e,t,r){CJe(e);for(let n of Object.keys(e||{}))if(e[n]!=null){let i=e[n],o=i;typeof i=="string"?o=await pre(e[n],t,r):typeof i=="object"&&(o=await hM(e[n],t,r)),e[n]=o}return e}a(hM,"processObject");async function pre(e,t,r){return Zn(e,t,r)}a(pre,"processString");function eI(e,t,r){CJe(e);for(let n of Object.keys(e||{})){let i=e[n];typeof i=="string"?e[n]=Zn(e[n],t,r):typeof i=="object"&&(e[n]=eI(e[n],t,r))}return e}a(eI,"processObjectSync");function VSr(e,t,r){let n=e;if(typeof e!="string")throw new Error("Cannot process non-string types.");function i(o){let s=HSr(o,r,t),u=Math.floor(Date.now()/1e3)*1e3,c=s({now:new Date(u).toISOString(),__opts:{...r,input:o},...t});return r?.logging?RJe(c):AJe(c)}a(i,"process");try{if(r&&r.onlyFound){let o=[],s=al(e);for(let u of s){let c=i(u);typeof c=="object"&&"result"in c?(o=o.concat(c.logs||[]),e=e.replace(u,c.result)):e=e.replace(u,c)}return r?.logging?{result:e,logs:o}:e}else return i(e)}catch(o){let{noThrow:s=!0}=r||{};if(s)return n;throw o}}a(VSr,"processStringSyncInternal");function Zn(e,t,r){return VSr(e,t,{...r,logging:!1})}a(Zn,"processStringSync");function KSr(e){let t=aJe(e);if(t==null)return e;let r=[...new Set(t)];for(let n of r){let i=new RegExp(`${n}(?!})`,"g");e=e.replace(i,`{${n}}`)}return e}a(KSr,"disableEscaping");function dre(e){return mM(e)!=null}a(dre,"isJSBinding");function mM(e){if(!e||typeof e!="string"||!e.trim().startsWith("{{ js "))return null;let t=new RegExp(/{{ js "(.*)" }}/),r=e.match(t);return!r||r.length<2?null:lM(r[1])}a(mM,"decodeJSBinding");function DJe(e,t){let r=new RegExp(YO),n=e.match(r);if(n==null)return!1;for(let i of n){let o=i;dre(i)&&(o=mM(i));let s=!0;for(let u of t)o.includes(u)||(s=!1);if(s)return!0}return!1}a(DJe,"doesContainStrings");function al(e){if(!e||typeof e!="string")return[];let t=new RegExp(tre),r=e.match(t);return r??[]}a(al,"findHBSBlocks");function QSr(){let e=gb()?IJe.default:OJe.default;ZO((t,r)=>{e.createContext(r);let n=fM(t),i=e.runInNewContext(n,r);if(i.error)throw new il(i.error);return i.result})}a(QSr,"browserJSSetup");function YSr(){JO()?vJe():QSr()}a(YSr,"defaultJSSetup");YSr();var JSr=gr.MIN_VALID_DATE.toISOString(),XSr=gr.MAX_VALID_DATE.toISOString();function hre(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||JSr,e.endDate=e.endDate||XSr),e}a(hre,"fillDates");async function PJe(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(n=>re.getProdWorkspaceID(n)));let t={};function r(n,i){i?.length&&(t.oneOf={...t.oneOf,[n]:i})}return a(r,"addStringParams"),r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=hre(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}a(PJe,"getSearchFilters");function mre(e,t,r){let n={_id:e,status:"deleted"};switch(t){case"app":n.name=r?.appName;break;case"user":n.email=r?.email;break}return n}a(mre,"deleted");function gre(e){let t=al(e);for(let r of t){let n=` "${r}"`;e=e.replace(e.includes(n)?n:` ${r}`,""),e=Zn(e,{})}return e}a(gre,"removeTemplateStrings");function NJe(e,t){let r=Bb[e];if(!r)throw new Error("No friendly name found.");let n=Zn(r,t);return n.includes('""')&&(n=gre(r)),n}a(NJe,"getEventFriendlyName");async function ZSr(e,t,r){if(!await oj()||!Cr.isAudited(e))return;let n=NJe(e,t),i=new Date;r?.timestamp&&(i=new Date(r.timestamp));let o={timestamp:i.toISOString(),event:e,name:n,userId:r?.userId||sse,metadata:{...t,...r?.hostInfo}},s={};try{if(r?.appId){o.appId=re.getProdWorkspaceID(r.appId);let u=await Ht.workspace.getWorkspaceMetadata(r.appId);"name"in u&&(s.appName=u.name)}if(r?.userId){let u=await qt.getById(r?.userId);s.email=u.email}}catch(u){kt.logAlert("Failed to retrieve fallback information for audit log",u)}return o.fallback=s,await WVe(o)}a(ZSr,"write");async function e0r(e){let t=e.map(u=>u.userId),n=e.filter(u=>u.appId).map(u=>re.getDevWorkspaceID(u.appId)),i=await qt.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),o=await re.getWorkspacesByIDs([...new Set(n)]),s=[];for(let u of e){let c=i.find(p=>p?._id===u.userId),l=o.find(p=>re.isSameWorkspaceID(p?.appId,u.appId)),f={event:u.event,timestamp:u.timestamp,name:u.name,metadata:u.metadata,user:c||mre(u.userId,"user",u.fallback)};u.appId&&(f.app=l||mre(u.appId,"app",u.fallback)),s.push(f)}return s}a(e0r,"enrich");async function t0r(e){if(!await oj())throw new Error("Audit logs not available - license required.");let t=await PJe(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await _ee(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await e0r(r.rows)}}a(t0r,"fetch");function r0r(e){return e=hre(e),GVe(e)}a(r0r,"download");function n0r(){let e=Object.entries(Bb).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=gre(r[1]);return t}a(n0r,"definitions");var wre={};oe(wre,{applications:()=>vre,roles:()=>bre,users:()=>yre});var yre={};oe(yre,{roleCheck:()=>a0r});function i0r(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(i0r,"removeRoles");async function a0r(e,t){return await Mp()||i0r(e,t),e}a(a0r,"roleCheck");var bre={};oe(bre,{assign:()=>o0r,unAssign:()=>s0r});async function o0r(e,t){if(!await Mp())throw new Error("Unable to assign roles - license required.");let r=await Wu.bulkGet(e);for(let n of r){if(t.role&&t.role.roleId){let i=re.getProdWorkspaceID(t.role.appId);n.roles[i]=t.role.roleId}if(t.appBuilder){let i=re.getProdWorkspaceID(t.appBuilder.appId),o=n.builder?.apps||[];n.builder={apps:o.concat([i])}}t.builder&&(n.builder={global:!0}),t.admin&&(n.admin={global:!0}),n.roles}await Wu.bulkUpdate(r)}a(o0r,"assign");async function s0r(e,t){if(!await Mp())throw new Error("Unable to un-assign roles - license required.");let r=await Wu.bulkGet(e);for(let n of r){if(t.role){let i=re.getProdWorkspaceID(t.role?.appId);n.roles[i]===t.role.roleId&&delete n.roles[i]}if(t.appBuilder&&n.builder?.apps){let i=re.getProdWorkspaceID(t.appBuilder.appId);n.builder.apps=n.builder.apps.filter(o=>o!==i)}t.builder&&n.builder&&delete n.builder,t.admin&&n.admin&&delete n.admin}}a(s0r,"unAssign");var vre={};oe(vre,{buildExportFn:()=>c0r,buildImportFn:()=>u0r});function u0r(e){return async(t,r)=>{await Mp()||t.throw(403,"Endpoint unavailable, license required."),t.request.files?.appExport||t.throw(400,"Must provide app export file for import."),await W.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}a(u0r,"buildImportFn");function c0r(e){return async(t,r)=>{await Mp()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:n,excludeRows:i}=t.request.body;await W.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:n,excludeRows:i},t.query.appId=t.params.appId,await e(t),await r()})}}a(c0r,"buildExportFn");var UJe=te(require("fs")),jJe=require("path");var LJe;function FJe(){LJe=new fo.BudibaseQueue(fo.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}a(FJe,"init");function bb(){return LJe}a(bb,"getBackupQueue");async function Ere(e,t={}){return zu.storeAppBackupMetadata(e,t)}a(Ere,"storeAppBackupMetadata");function MJe(e){let t=new Date().toISOString();switch(e){case"complete":case"failed":return{timestamp:t,finishedAt:t};case"started":return{timestamp:t,startedAt:t};case"pending":return{timestamp:t,createdAt:t}}}a(MJe,"getTimestamps");async function f0r(e,t,r,n){let i=await gM(e);return await zu.storeAppBackupMetadata({...i,...MJe(t),contents:r,status:t,type:"backup"},{filename:n,docId:e})}a(f0r,"updateBackupStatus");async function p0r(e,t,r){let n=await gM(e);return await zu.storeAppBackupMetadata({...n,...MJe(r),status:r,type:"restore",trigger:"manual"},{docId:e,docRev:t})}a(p0r,"updateRestoreStatus");async function gM(e){return zu.getAppBackupMetadata(e)}a(gM,"getAppBackup");async function d0r(e,t){return zu.updateAppBackupMetadata(e,t)}a(d0r,"updateAppBackup");async function BJe(e){let t=await zu.getAppBackupMetadata(e);return t.filename&&await bt.deleteFile(bt.ObjectStoreBuckets.BACKUPS,t.filename),zu.deleteAppBackupMetadata(e)}a(BJe,"deleteAppBackup");async function h0r(e){let t=[];for(let r of e)try{await BJe(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(h0r,"deleteAppBackups");async function m0r(e,t){return zu.fetchAppBackups(e,t)}a(m0r,"fetchAppBackups");async function qJe(e){let t=await zu.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let r=await bt.getReadStream(bt.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}a(qJe,"getBackupDownloadStream");async function g0r(e){let{stream:t}=await qJe(e),r=(0,jJe.join)(bt.budibaseTempDir(),Cr.newid()),n=UJe.default.createWriteStream(r);return new Promise((i,o)=>{t.on("error",o),n.on("error",o),t.pipe(n).on("close",()=>i(r))})}a(g0r,"downloadAppBackup");async function y0r(e,t,r={}){let n;try{n=await Ere({appId:e,trigger:t,timestamp:new Date().toISOString(),status:"pending",type:"backup",...r})}catch(i){if(i.status===409)return;throw i}return await bb().add({docId:n.id,docRev:n.rev,appId:e,export:{trigger:t,...r}}),await Tt.backup.appBackupTriggered(e,n.id,"backup",t,r?.name),n.id}a(y0r,"triggerAppBackup");async function b0r(e,t,r,n){let i=await gM(t),o;try{o=await Ere({appId:e,timestamp:new Date().toISOString(),status:"pending",type:"restore",createdBy:n})}catch(s){if(s?.status===409)return;throw s}return await bb().add({appId:e,docId:o.id,docRev:o.rev,import:{nameForBackup:r,backupId:t,createdBy:n}}),{restoreId:o.id,metadata:i}}a(b0r,"triggerAppRestore");async function v0r(e,t,r){let n=re.getProdWorkspaceID(e);await W.doInWorkspaceContext(n,async()=>{let i=W.getProdWorkspaceDB();if(!await i.exists())return;let s=await i.tryGet("app_metadata");s&&(s.backupErrors||(s.backupErrors={}),s.backupErrors[t]||(s.backupErrors[t]=[]),s.backupErrors[t].push(r),await i.put(s),await Ht.workspace.invalidateWorkspaceMetadata(s.appId,s))})}a(v0r,"trackBackupError");var w0r={isEnabled:YZ,triggerAppRestore:qo(b0r),triggerAppBackup:qo(y0r),getBackupDownloadStream:qo(qJe),downloadAppBackup:qo(g0r),fetchAppBackups:qo(m0r),storeAppBackupMetadata:qo(Ere),updateBackupStatus:qo(f0r),updateRestoreStatus:qo(p0r),getAppBackup:qo(gM),updateAppBackup:qo(d0r),deleteAppBackup:qo(BJe),deleteAppBackups:qo(h0r),trackBackupError:qo(v0r)},Qu=w0r;var Sre={};oe(Sre,{init:()=>_re});var P_=te(require("fs"));async function _re(e){bb().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),S0r(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),_0r(t,e)}catch(n){kt.logAlert(`Failed to perform backup for app ID: ${r.appId}`,n)}})}a(_re,"init");async function E0r(e){await re.getDB(e,{skip_setup:!0}).destroy()}a(E0r,"removeExistingApp");async function $Je(e,t,r,n){let i=re.getDevWorkspaceID(r),o=re.getProdWorkspaceID(r),s=new Date().toISOString(),u=a(async(c,l)=>{n?.doc?await Qu.updateBackupStatus(n.doc.id,c,l?.contents,l?.filename):await Qu.storeAppBackupMetadata({appId:o,timestamp:s,trigger:e,status:c,name:n?.name,type:"backup",contents:l?.contents,createdBy:n?.createdBy},{filename:l?.filename})},"updateMetadata");try{let c=await n.processing.exportAppFn(i,{tar:!0}),l=await n.processing.statsFn(i),f=`${o}/backup-${s}.tar.gz`,p=bt.ObjectStoreBuckets.BACKUPS,d=P_.default.createReadStream(c);await bt.streamUpload({bucket:p,filename:f,stream:d,extra:{type:"application/gzip",metadata:{name:n?.name,trigger:e,timestamp:s,appId:o}}}),await u("complete",{filename:f,contents:l}),P_.default.existsSync(c)&&P_.default.rmSync(c)}catch(c){kt.logAlert("App backup error",c),await u("failed");let l=n?.doc?.id||`backup-${s}`,f=c instanceof Error?c.message:String(c);await Qu.trackBackupError(o,l,`Backup export failed: ${f}`)}}a($Je,"runBackup");async function _0r(e,t){let r=e.data,n=r.appId,i=r.import.backupId,o=r.import.nameForBackup,s=r.import.createdBy,u=vt.getTenantIDFromWorkspaceID(n);return vt.doInTenant(u,async()=>{let c=re.getDevWorkspaceID(n),l=`${c}_temp_${Date.now()}`,{rev:f}=await Qu.updateRestoreStatus(r.docId,r.docRev,"started");await $Je("restoring",u,n,{processing:t,createdBy:s,name:o});let p=await Qu.downloadAppBackup(i),d="complete";try{await t.importAppFn(l,re.getDB(l),{file:{type:"application/gzip",path:p},key:p}),await E0r(c),await new re.Replication({source:l,target:c}).replicate()}catch(h){kt.logAlert("App restore error",h),d="failed";let m=h instanceof Error?h.message:String(h);await Qu.trackBackupError(n,i,`Backup restore failed: ${m}`)}finally{try{await re.getDB(l,{skip_setup:!0}).destroy()}catch{}}await Qu.updateRestoreStatus(r.docId,f,d),P_.default.existsSync(p)&&P_.default.rmSync(p,{force:!0})})}a(_0r,"importProcessor");async function S0r(e,t){let r=e.data,n=r.appId,i=r.export.trigger,o=r.export.name,s=vt.getTenantIDFromWorkspaceID(n);await vt.doInTenant(s,async()=>{try{let{rev:u}=await Qu.updateBackupStatus(r.docId,"started");return $Je(i,s,n,{processing:t,doc:{id:r.docId,rev:u},name:o})}catch(u){kt.logAlert("App backup error",u);let c=u instanceof Error?u.message:String(u);await Qu.trackBackupError(n,r.docId,`Backup export failed: ${c}`)}})}a(S0r,"exportProcessor");var x0r=a(async e=>{FJe(),await _re(e.processing)},"init"),Xs={...Qu,processing:Sre,init:x0r,getBackupQueue:bb};var T0r=a(async e=>{e.backups&&await Xs.init(e.backups)},"init");var Zs={};oe(Zs,{create:()=>O0r,find:()=>R0r,get:()=>A0r,remove:()=>k0r,update:()=>I0r});var zJe=te(require("lodash/fp/merge"));async function A0r(e){let t=vt.getGlobalDB(),r=new re.QueryBuilder(t.name,"user");r.setIndexBuilder(re.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[i,o]of Object.entries(e.filters?.equal??{}))r.addEqual(i,o);r.setSort("_id"),r.setSkip(e.skip);let n=await r.run();return{users:n.rows,total:n.totalRows}}a(A0r,"get");async function R0r(e){return await qt.getById(e)}a(R0r,"find");async function O0r(e){let t=await Wu.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new Ie("User is already synched",409);e={...t,scimInfo:(0,zJe.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await Wu.save(e,{requirePassword:!1})}a(O0r,"create");async function I0r(e,t){return await Wu.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}a(I0r,"update");async function k0r(e){return await Wu.destroy(e)}a(k0r,"remove");var tI={};oe(tI,{create:()=>C0r});var WJe=te(require("lodash/fp/merge"));async function C0r(e){let t=await AZ(e.name),r;if(!t)r=(await on.save(e)).id;else{if(t.scimInfo?.isSync)throw new Ie("Group is already synched",409);r=t._id,t.users&&(await on.removeUsers(r,t.users.map(i=>i._id)),delete t.users),t.scimInfo=(0,WJe.default)(t.scimInfo,e.scimInfo),await on.save(t)}return await on.get(r)}a(C0r,"create");var N_={};oe(N_,{logRequest:()=>D0r,logResponse:()=>P0r});async function D0r(e){kt.logWarn("SCIM request log",e)}a(D0r,"logRequest");async function P0r(e){kt.logWarn("SCIM response error",e)}a(P0r,"logResponse");var ki={};oe(ki,{requireFeature:()=>N0r,requireFeatures:()=>L0r});var N0r=a(e=>async(t,r)=>{await aj(e),await r()},"requireFeature"),L0r=a((...e)=>async(t,r)=>{await QZ(e),await r()},"requireFeatures");var GJe=a(async(e,t)=>(V.DISABLE_SCIM_CALLS||await N_.logRequest({...e.request.toJSON(),body:e.request.body}),await W.doInScimContext(async()=>{let r=await t();return await N_.logResponse({...e.response.toJSON(),body:e.response.body}),r})),"doInScimContext");var HJe=a(async(e,t)=>{await ZZ(),await t()},"requireSCIM");var yM=a(e=>xre(qt.getById,e,!0),"scimUserOnly"),bM=a(e=>xre(Xn.get,e,!0),"scimGroupOnly"),vM=a(e=>xre(Xn.get,e,!1),"internalGroupOnly");function xre(e,t,r){return async(n,i)=>{let o=n.params[t];return typeof o!="string"&&n.throw(404),!!(await e(o)).scimInfo?.isSync!==r&&n.throw(404),i()}}a(xre,"scimSyncChecks");var F0r=require("dd-trace");async function VJe(e){let t=e.request.body;if(t.name=t.name.trim(),delete t.roles,t._id){let n=await im(t._id);t.roles=n.roles,t.scimInfo=n.scimInfo}let r=await h_(t);e.body={_id:r.id,_rev:r.rev}}a(VJe,"save");async function KJe(e){let t=e.params.groupId,r=e.request.body.add,n=e.request.body.remove;(r&&!Array.isArray(r)||n&&!Array.isArray(n))&&e.throw(400,"Must supply a list of users to add or to remove");let i,o;r&&(i=await lj(t,r)),n&&(o=await lee(t,n)),e.body={added:i,removed:o}}a(KJe,"updateGroupUsers");async function QJe(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 fee(t,{appsToAdd:r,appsToRemove:n})}a(QJe,"updateGroupApps");async function YJe(e){e.body={data:await _O()}}a(YJe,"fetch");async function JJe(e){let{groupId:t,rev:r}=e.params;try{await cee(t,r),e.body={message:"Group deleted successfully"}}catch(n){e.throw(n.status,n)}}a(JJe,"destroy");async function XJe(e){try{e.body=await im(e.params.groupId)}catch(t){e.throw(t.status,t)}}a(XJe,"find");async function ZJe(e){let{pageSize:t=10,bookmark:r,emailSearch:n}=e.request.query,i=e.params.groupId,o={limit:t+1},s=await GU(i,{...o,emailSearch:n,bookmark:r}),u=n?s[t]?.email:s[t]?._id,c=!!u;e.body={users:s.slice(0,t),bookmark:u,hasNextPage:c}}a(ZJe,"searchUsers");async function eXe(e){let{groupId:t,appId:r}=e.params;await pee(t,r),e.body={message:"Group app builder access updated."}}a(eXe,"addAppBuilder");async function tXe(e){let{groupId:t,appId:r}=e.params;await dee(t,r),e.body={message:"group app builder access removed."}}a(tXe,"removeAppBuilder");async function rXe(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 GR.jsonFromCsvString(r,{allowSingleColumn:!0});(!n||n.length===0)&&e.throw(400,"CSV file is invalid");let o=Object.keys(n[0]).find(p=>/^(email|e-mail|email address|mail|e_mail)$/i.test(p.trim()));o||e.throw(400,"CSV file must contain an email column");let s=Array.from(new Set(n.map(p=>p[o]).filter(p=>p&&typeof p=="string"&&p.trim().length>0).map(p=>p.trim())));s.length===0&&e.throw(400,"No valid email addresses found in CSV");try{await im(t)}catch(p){if(p.status===404)e.throw(404,"Group not found");else throw p}let u=[],c=[],l=[],f=await Promise.all(s.map(p=>Wu.getUserByEmail(p)));for(let p of s){let d=f.find(h=>h?.email===p);d?(u.push({_id:d._id,email:d.email}),l.push(d._id)):c.push({email:p,reason:"User not found"})}l.length>0&&await lj(t,l),e.body={added:u,skipped:c}}a(rXe,"bulkAddUsersFromCsv");var nXe=te(require("@koa/router")),zo=te(require("joi"));var M0r=new nXe.default;function B0r(){return Qt.joiValidator.body(zo.default.object({_id:zo.default.string().optional(),_rev:zo.default.string().optional(),color:zo.default.string().required(),icon:zo.default.string().required(),name:zo.default.string().trim().required().max(50),role:zo.default.string().optional(),users:zo.default.array().optional(),apps:zo.default.array().optional(),roles:zo.default.object().optional(),createdAt:zo.default.string().optional(),updatedAt:zo.default.string().optional()}).required())}a(B0r,"buildGroupSaveValidation");M0r.post("/api/global/groups",Qt.adminOnly,ki.requireFeature("userGroups"),B0r(),VJe).get("/api/global/groups",ki.requireFeature("userGroups"),YJe).delete("/api/global/groups/:groupId/:rev",ki.requireFeature("userGroups"),Qt.adminOnly,vM("groupId"),JJe).get("/api/global/groups/:groupId",ki.requireFeature("userGroups"),Qt.builderOrAdmin,XJe).get("/api/global/groups/:groupId/users",ki.requireFeature("userGroups"),Qt.builderOrAdmin,ZJe).post("/api/global/groups/:groupId/users",Qt.adminOnly,ki.requireFeature("userGroups"),vM("groupId"),KJe).post("/api/global/groups/:groupId/users/bulk",Qt.adminOnly,ki.requireFeature("userGroups"),vM("groupId"),Qt.joiValidator.body(zo.default.object({csvContent:zo.default.string().required()}).required()),rXe).post("/api/global/groups/:groupId/apps",Qt.builderOrAdmin,ki.requireFeature("userGroups"),QJe).post("/api/global/groups/:groupId/app/:appId/builder",Qt.builderOrAdmin,ki.requireFeatures("userGroups","appBuilders"),eXe).delete("/api/global/groups/:groupId/app/:appId/builder",Qt.builderOrAdmin,ki.requireFeatures("userGroups","appBuilders"),tXe);async function iXe(e){e.body={encryptionKeyAvailable:rl.isEncryptionKeyAvailable()}}a(iXe,"status");async function aXe(e){e.body={variables:await rl.fetch()}}a(aXe,"fetch");async function oXe(e){let{name:t,production:r,development:n}=e.request.body;await rl.update(t,{production:r,development:n});let i=["production"];r!==n&&i.push("development"),await Tt.environmentVariable.created(t,i),e.body={message:`Environment variable "${t}" created.`}}a(oXe,"create");async function sXe(e){let{production:t,development:r}=e.request.body,n=e.params.varName;await rl.update(n,{production:t,development:r}),e.body={message:`Environment variable "${n}" updated.`}}a(sXe,"update");async function uXe(e){let t=e.params.varName;await rl.remove(t),await Tt.environmentVariable.deleted(t),e.body={message:`Environment variable "${t}" deleted.`}}a(uXe,"destroy");var lXe=te(require("@koa/router")),rI=te(require("joi"));var $0r=new lXe.default;function cXe(){return Qt.joiValidator.body(rI.default.object({name:rI.default.string().optional(),production:rI.default.string().required(),development:rI.default.string().required()}))}a(cXe,"buildEnvVarUpdateValidator");$0r.get("/api/env/variables/status",Qt.builderOrAdmin,iXe).get("/api/env/variables",Qt.builderOrAdmin,aXe).post("/api/env/variables",Qt.builderOrAdmin,cXe(),oXe).patch("/api/env/variables/:varName",Qt.builderOrAdmin,cXe(),sXe).delete("/api/env/variables/:varName",Qt.builderOrAdmin,uXe);async function fXe(e){let t=e.request.body,r=await yb.fetch(t);await Tt.auditLog.filtered(t),e.body=r}a(fXe,"search");async function pXe(e){let t=e.request.body,{stream:r}=yb.download(t);await Tt.auditLog.downloaded(t),e.attachment(`audit-logs-${Date.now()}.log`),e.body=r}a(pXe,"download");async function dXe(e){e.body={events:yb.definitions()}}a(dXe,"definitions");var mXe=te(require("@koa/router")),Yu=te(require("joi"));function hXe(){return Qt.joiValidator.body(Yu.default.object({userIds:Yu.default.array().items(Yu.default.string()).optional(),appIds:Yu.default.array().items(Yu.default.string()).optional(),events:Yu.default.array().items(Yu.default.string().valid(...Object.values(Er))).optional(),startDate:Yu.default.string().optional().allow(""),endDate:Yu.default.string().optional().allow(""),fullSearch:Yu.default.string().optional().allow(""),bookmark:Yu.default.number()}))}a(hXe,"buildAuditLogSearchValidator");var W0r=new mXe.default;W0r.post("/api/global/auditlogs/search",Qt.adminOnly,hXe(),fXe).get("/api/global/auditlogs/download",Qt.adminOnly,AU.querystringToBody,hXe(),pXe).get("/api/global/auditlogs/definitions",Qt.adminOnly,dXe);var SXe=te(require("@koa/router")),Eb=te(require("joi"));async function wb(e,t){t||e.throw(400,"App ID missing"),await bO.workspaceExists(t)||e.throw(400,`Provided app ID: ${t} - is invalid.`)}a(wb,"checkAppID");async function gXe(e){let t=e.params.appId;await wb(e,t);let{body:r}=e.request,n=e.user?._id,i=await Xs.triggerAppBackup(t,"manual",{name:r.name,createdBy:n});i||e.throw(500,"Unable to start backup."),e.body={backupId:i,message:"Backup triggered - process starting."}}a(gXe,"manualBackup");async function yXe(e){let t=e.params.appId;await wb(e,t);let r=e.params.backupId,n=e.request.body.name,i=await Xs.triggerAppRestore(t,r,n,e.user?._id);i||e.throw(500,"Unable to start restore."),await Tt.backup.appBackupRestored(i.metadata),e.body={restoreId:i?.restoreId,message:"Restore triggered - process starting."}}a(yXe,"importBackup");async function bXe(e){let t=e.params.appId;await wb(e,t);let r=e.params.backupId;await Xs.deleteAppBackup(r),e.body={message:"Backup deleted successfully."}}a(bXe,"deleteBackup");async function vXe(e){let t=W.getWorkspaceId();await wb(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 Xs.deleteAppBackups(r),i=n.filter(s=>s.success).length,o=n.length-i;e.body={message:`${i} backups deleted successfully${o>0?`, ${o} failed`:""}.`,results:n,successCount:i,failureCount:o}}a(vXe,"deleteBackups");async function wXe(e){let t=e.params.appId;await wb(e,t);let r=e.request.body;r?.trigger&&(r.trigger=r.trigger.toLowerCase(),Object.values(Rm).includes(r.trigger)||e.throw(400,"Provided trigger is not a valid option.")),e.body=await Xs.fetchAppBackups(t,{paginate:!0,...r})}a(wXe,"fetchBackups");async function EXe(e){let t=e.params.appId;await wb(e,t);let r=e.params.backupId,n=e.request.body;e.body=await Xs.updateAppBackup(r,n.name)}a(EXe,"updateBackup");async function _Xe(e){let t=e.params.appId;await wb(e,t);let r=e.params.backupId,{metadata:n,stream:i}=await Xs.getBackupDownloadStream(r);e.attachment(`backup-${n.timestamp}.tar.gz`),e.body=i}a(_Xe,"downloadBackup");var H0r=new SXe.default;function V0r(){return Qt.joiValidator.body(Eb.default.object({trigger:Eb.default.string().valid(...Object.values(Rm)),type:Eb.default.string().valid(...Object.values(bS)),startDate:Eb.default.date(),endDate:Eb.default.date(),page:Eb.default.string()}))}a(V0r,"validateBackupSearch");H0r.post("/api/apps/:appId/backups",Qt.builderOrAdmin,gXe).post("/api/apps/:appId/backups/search",Qt.builderOrAdmin,V0r(),wXe).get("/api/apps/:appId/backups/:backupId/file",Qt.builderOrAdmin,_Xe).patch("/api/apps/:appId/backups/:backupId",Qt.builderOrAdmin,EXe).delete("/api/apps/:appId/backups/:backupId",Qt.builderOrAdmin,bXe).delete("/api/apps/:appId/backups",Qt.builderOrAdmin,vXe).post("/api/apps/:appId/backups/:backupId/import",Qt.builderOrAdmin,yXe);var QXe=te(require("@koa/router"));var AM=te(Gre());function UXe(e,t){let r=e.request.query[t];if(r!==void 0)return+r}a(UXe,"tryGetQueryAsNumber");var jXe=a(async e=>{let t=UXe(e,"pageSize")??20,r=UXe(e,"startIndex"),n;e.request.query.filter&&(n=la.user.userFilters(e.request.query.filter));let i=await Zs.get({pageSize:t,skip:r,filters:n});e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:i.total,Resources:i.users.map(la.user.toScimUserResponse),startIndex:(r||0)+1,itemsPerPage:t}},"get"),MXe=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404);let r=await Zs.find(t);e.body=la.user.toScimUserResponse(r)},"find"),BXe=a(async e=>{let t=la.user.fromScimUser(e.request.body);try{let r=await Zs.create(t);e.body=la.user.toScimUserResponse(r)}catch(r){throw r instanceof mp&&e.throw(409,"Email already in use"),r}},"create");function gxr(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(gxr,"isDeactivation");var qXe=a(async e=>{let t=await Zs.find(e.params.id);t||e.throw(404);let r=la.user.toScimUserResponse(t),n=e.request.body;try{(0,AM.patchBodyValidation)(n)}catch{}if(gxr(n))return Hre(e);let i;try{i=(0,AM.scimPatch)(r,n.Operations)}catch{}i||e.throw(500);let o=la.user.fromScimUser(i);await Zs.update(o,{allowChangingEmail:!0}),e.body=la.user.toScimUserResponse(o)},"update"),Hre=a(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404),await Zs.remove(t),e.status=204},"remove");var $Xe=te(require("lodash/groupBy"));var RM=te(Gre());var OM=te(TM());function zXe(e,t){for(let r of t.split(","))delete e[r]}a(zXe,"cleanResponse");var WXe=a(async e=>{let r=(await on.fetch()).filter(o=>o.scimInfo?.isSync).map(la.group.toScimGroupResponse),{filter:n,excludedAttributes:i}=e.request.query;if(n){let o=(0,OM.filter)((0,OM.parse)(n));r=r.filter(o)}i&&r.forEach(o=>{zXe(o,i)}),e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:r.length,Resources:r,startIndex:1,itemsPerPage:r.length}},"get"),GXe=a(async e=>{let t=la.group.fromScimGroup(e.request.body),r=await tI.create(t);e.body=la.group.toScimGroupResponse(r)},"create"),HXe=a(async e=>{let{id:t}=e.params,r=await on.get(t),n=la.group.toScimGroupResponse(r),{excludedAttributes:i}=e.request.query;i&&zXe(n,i),e.body=n},"find"),VXe=a(async e=>{let{id:t}=e.params,r=await on.get(t);await on.remove(t,r._rev),e.status=204},"remove"),KXe=a(async e=>{let{id:t}=e.params,r=await on.get(t),n=la.group.toScimGroupResponse(r),i=e.request.body;try{(0,RM.patchBodyValidation)(i)}catch{e.throw(400)}let{true:o,false:s}=(0,$Xe.default)(i.Operations,u=>u.path==="members");if(s?.length){let u=(0,RM.scimPatch)(n,s);u||e.throw(500);let c={...la.group.fromScimGroup(u),_rev:r._rev};await on.save(c)}if(o?.length){let u=[],c=[];for(let{op:l,value:f}of o)switch(l){case"add":case"Add":for(let p of f)u.push(await Zs.find(p.value));break;case"remove":case"Remove":for(let p of f)c.push(await Zs.find(p.value));break;case"replace":case"Replace":throw new Error("Replacing members is not allowed");default:tr.unreachable(l)}u.length&&await on.addUsers(t,u.map(l=>l._id)),c.length&&await on.removeUsers(t,c.map(l=>l._id))}e.body=la.group.toScimGroupResponse(await on.get(t))},"update");var Ju=new QXe.default({prefix:"/api/global/scim/v2"});Ju.use(HJe);Ju.use(GJe);Ju.get("/users",jXe);Ju.get("/users/:id",yM("id"),MXe);Ju.post("/users",BXe);Ju.patch("/users/:id",yM("id"),qXe);Ju.delete("/users/:id",yM("id"),Hre);Ju.get("/groups",WXe);Ju.post("/groups",ki.requireFeature("userGroups"),GXe);Ju.get("/groups/:id",ki.requireFeature("userGroups"),bM("id"),HXe);Ju.delete("/groups/:id",ki.requireFeature("userGroups"),bM("id"),VXe);Ju.patch("/groups/:id",ki.requireFeature("userGroups"),bM("id"),KXe);var XXe=te(require("@koa/router"));async function YXe(e){let{userId:t,appId:r}=e.params,n=await am.db.getUser(t);if(qt.isGlobalBuilder(n)){e.body={message:"User already admin - no permissions updated."};return}await am.addAppBuilder(n,r),e.body={message:`User "${n.email}" app builder access updated.`}}a(YXe,"addAppBuilder");async function JXe(e){let{userId:t,appId:r}=e.params,n=await am.db.getUser(t);if(qt.isGlobalBuilder(n)){e.body={message:"User already admin - no permissions removed."};return}await am.removeAppBuilder(n,r),e.body={message:`User "${n.email}" app builder access removed.`}}a(JXe,"removeAppBuilder");var wxr=new XXe.default;wxr.post("/api/global/users/:userId/app/:appId/builder",Qt.builderOrAdmin,ki.requireFeatures("appBuilders"),YXe).delete("/api/global/users/:userId/app/:appId/builder",Qt.builderOrAdmin,ki.requireFeatures("appBuilders"),JXe);var la={};oe(la,{group:()=>Kre,user:()=>Vre});var Vre={};oe(Vre,{fromScimUser:()=>Axr,toScimUserResponse:()=>Sxr,userFilters:()=>Rxr});var ZXe=te(TM());var{unreachable:_xr}=tr,Sxr=a(e=>{let{isSync:t,roles:r,...n}=e.scimInfo||{},i={...n,schemas:["urn:ietf:params:scim:schemas:core:2.0:User"],id:e._id,meta:{resourceType:"User",created:new Date(e.createdAt),lastModified:new Date(e.updatedAt)},active:e.status==="active"};return(e.firstName||e.lastName)&&(i.name={formatted:[e.firstName,e.lastName].filter(o=>o).join(" "),familyName:e.lastName,givenName:e.firstName}),i},"toScimUserResponse"),xxr=a(e=>!!e?.id,"isScimUserResponse");function Txr(e){if(Cr.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}a(Txr,"tryGetEmail");var Axr=a(e=>{let t=xxr(e)?e:void 0,r=Txr(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:_xr(e.active)}let i,o;return e.name?.givenName?(i=e.name?.givenName,o=e.name?.familyName):i=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:i,lastName:o,scimInfo:{...e,isSync:!0},roles:{},status:n?"active":"inactive",createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimUser"),Rxr=a(e=>{let t={equal:{}},r=(0,ZXe.parse)(e);function n(i){switch(i.op){case"eq":{let o=i.attrPath,s;switch(o){case"emails.value":s="email";break;default:s=`scimInfo.${o}`}t.equal[s]=i.compValue;break}case"and":for(let o of i.filters)n(o);break;default:console.warn("Filter not handled",{filter:i})}}return a(n,"parseFilters"),n(r),t},"userFilters");var Kre={};oe(Kre,{fromScimGroup:()=>kxr,toScimGroupResponse:()=>Oxr});var Oxr=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"),Ixr=a(e=>!!e?.id,"isScimGroup"),kxr=a(e=>{let t=Ixr(e)?e:void 0;return{_id:t?.id,name:e.displayName,scimInfo:{externalId:e.externalId,isSync:!0},icon:"UserGroup",color:"var(--spectrum-global-color-blue-600)",createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimGroup");var ci={};oe(ci,{LLM:()=>mf,LLMRequest:()=>Ci,TableGeneration:()=>yne,agentHistoryTitleSystemPrompt:()=>qxr,agentSystemPrompt:()=>Bxr,aiColumnSchemas:()=>mne,aiTableResponseToTableSchema:()=>fne,appendAIColumns:()=>pne,classifyText:()=>Jre,cleanData:()=>Xre,extractFileData:()=>Fxr,generateAIColumns:()=>cne,generateCode:()=>Mxr,generateCronExpression:()=>Zre,generateData:()=>lne,generateJs:()=>nne,generateSQL:()=>jxr,generateTables:()=>une,generationStructure:()=>hne,getLLM:()=>lI,getLLMConfig:()=>sne,getLLMOrThrow:()=>oZe,normalizeContentType:()=>Qre,parseResponseFormat:()=>kM,sanitiseToolName:()=>Cxr,searchWeb:()=>rne,sentimentAnalysis:()=>tne,summarizeText:()=>IM,tableDataStructuredOutput:()=>gne,translate:()=>ene});function Cxr(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(Cxr,"sanitiseToolName");function Qre(e){return e?e.includes("/")?e:{pdf:"application/pdf",jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png"}[e.toLowerCase()]||"application/octet-stream":"application/octet-stream"}a(Qre,"normalizeContentType");var CM=te(require("openai"));var pm=te(require("dd-trace"));function Yre(e,t){return t.map(r=>e[r]).join(" ")}a(Yre,"extractTextFromColumns");var mf=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 pm.default.trace("prompt",async()=>{let r=typeof t=="string"?new Ci().addUserMessage(t):t,{messages:n,tokensUsed:i}=await pm.default.trace("chatCompletion",()=>this.chatCompletion(r));return!n||n.length===0?{message:"",tokensUsed:i}:{message:n[n.length-1].content||"",tokensUsed:i}})}async chat(t){return await pm.default.trace("chat",async()=>await this.chatCompletion(t))}async*chatStream(t){yield*this.chatCompletionStream(t)}async summarizeText(t){return pm.default.trace("summarizeText",()=>this.prompt(IM(t)))}async generateCronExpression(t){return pm.default.trace("generateCronExpression",()=>this.prompt(Zre(t)))}async operation(t,r){return pm.default.trace("operation",n=>{n.addTags({operation:t.operation,rowId:r.id});let i=this.promptForOperation(t,r);return this.prompt(i)})}promptForOperation(t,r){let{operation:n,column:i,columns:o,language:s,categories:u,prompt:c}=t;switch(n){case"SUMMARISE_TEXT":return IM(Yre(r,o));case"CLEAN_DATA":return Xre(r[i]);case"TRANSLATE":return ene(r[i],s);case"CATEGORISE_TEXT":if(!u)throw Error("No categories provided for categorise text operation. Please provide categories.");return Jre(Yre(r,o),u.split(","));case"SENTIMENT_ANALYSIS":return tne(r[i]);case"PROMPT":return c;case"SEARCH_WEB":return rne(Yre(r,o));default:throw tr.unreachable(n)}}async generateJs(t,r){return await pm.default.trace("generateJs",async()=>{let{bindings:n=[],snippets:i=[]}=r||{};return await this.prompt(nne(n,i).addUserMessage(t))})}};var ine=require("openai/helpers/zod");var tZe=(n=>(n.GPT_5_MINI="gpt-5-mini",n.GPT_5="gpt-5",n.GPT_5_NANO="gpt-5-nano",n))(tZe||{});function kM(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}a(kM,"parseResponseFormat");function eZe(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}a(eZe,"calculateBudibaseAICredits");var Xu=class extends mf{constructor(r){super(r);this.client=this.getClient(r)}static{a(this,"OpenAI")}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new CM.default({apiKey:r.apiKey})}async uploadFile(r,n,i){let o=Qre(i);if(ok.includes(o.toLowerCase())){let c;if(Buffer.isBuffer(r))c=r;else{let f=[];for await(let p of r)f.push(new Uint8Array(p));c=Buffer.concat(f)}let l=c.toString("base64");return`data:${o};base64,${l}`}let s=await(0,CM.toFile)(r,n);return(await this.client.files.create({file:s,purpose:"assistants"})).id}async chatCompletion(r){let n={model:this.model,messages:r.messages,max_completion_tokens:this._maxTokens,response_format:kM(r.format)};Object.values(tZe).includes(this.model)&&(n.verbosity="low",n.reasoning_effort="minimal"),r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(ine.zodFunction));let i=await this.client.chat.completions.create(n),o=i?.choices?.[0]?.message;if(o?.tool_calls){r.addMessage(o);let s=[];for(let u of o.tool_calls){if(u.type!=="function"||!u.function){console.warn(`[OPENAI TOOL WARN] Unsupported tool call type: ${u.type}`);continue}let c=u.function.name,l=r.findTool(c);if(!l)throw new Error(`Tool ${c} not found in prompt tools`);let f=JSON.parse(u.function.arguments);s.push(l.handler(f).then(p=>({role:"tool",tool_call_id:u.id,content:p})).catch(p=>(console.error(`[OPENAI TOOL ERROR] Tool ${c} failed in OpenAI handler:`,p),{role:"tool",tool_call_id:u.id,content:`Error: ${p.message}`})))}return r.addMessages(await Promise.all(s)),this.chatCompletion(r)}else{if(o?.content)return{messages:[...r.messages,{role:o.role,content:o.content}],tokensUsed:eZe(i.usage)};throw new Error("No response found")}}async*chatCompletionStream(r){let n={model:this.model,messages:r.messages,max_tokens:this.maxTokens,response_format:kM(r.format),stream:!0};r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(ine.zodFunction));try{let i=await this.client.chat.completions.create(n),o=null,s="",u=null;for await(let l of i){let f=l?.choices?.[0]?.delta;if(f){if(f.content&&(s+=f.content,yield{type:"content",content:f.content}),f.tool_calls&&f.tool_calls.length>0){let p=f.tool_calls[0];p.id?(o={id:p.id,name:p.function?.name||"",arguments:p.function?.arguments||""},yield{type:"tool_call_start",toolCall:{id:o.id,name:o.name,arguments:o.arguments}}):o&&p.function?.arguments&&(o.arguments+=p.function.arguments,yield{type:"tool_call_start",toolCall:{id:o.id,name:o.name,arguments:o.arguments}})}l.usage&&(u=l.usage)}}let c=u?eZe(u):0;if(o){r.addMessage({role:"assistant",content:"",tool_calls:[{id:o.id,type:"function",function:{name:o.name,arguments:o.arguments}}]});let l=r.findTool(o.name);if(l)try{let f=JSON.parse(o.arguments),p=await l.handler(f);yield{type:"tool_call_result",toolResult:{id:o.id,result:p}},r.addMessage({role:"tool",tool_call_id:o.id,content:p}),yield*this.chatCompletionStream(r);return}catch(f){yield{type:"tool_call_result",toolResult:{id:o.id,result:`Error: ${f.message}`,error:f.message}},r.addMessage({role:"tool",tool_call_id:o.id,content:`Error: ${f.message}`}),yield*this.chatCompletionStream(r);return}else{let f=`Tool '${o.name}' not found`;yield{type:"tool_call_result",toolResult:{id:o.id,result:f,error:f}},r.addMessage({role:"tool",tool_call_id:o.id,content:f}),yield*this.chatCompletionStream(r);return}}s&&r.addMessage({role:"assistant",content:s}),yield{type:"done",messages:r.messages,tokensUsed:c}}catch(i){yield{type:"error",content:i.message}}}};var ane=require("dd-trace");var DM=class extends mf{static{a(this,"BudibaseAI")}async prompt(t){let r=await super.prompt(t);return r.tokensUsed&&await uj(r.tokensUsed),r}async chat(t){let r=await super.chat(t);return r.tokensUsed&&await uj(r.tokensUsed),r}async uploadFile(t,r,n){return V.SELF_HOSTED?this.uploadFileSelfHost(t,r,n):this.uploadFileCloud(t,r,n)}async uploadFileCloud(t,r,n){return new Xu({apiKey:V.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).uploadFile(t,r,n)}async uploadFileSelfHost(t,r,n){let i;if(Buffer.isBuffer(t))i=t;else{let f=[];for await(let p of t)f.push(new Uint8Array(p));i=Buffer.concat(f)}let o=i.toString("base64");if(n&&ok.includes(n.toLowerCase()))return`data:image/jpeg;base64,${o}`;if(!V.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let f=await nj();if(!f)throw new Error("No license key found");this._apiKey=f}let s=`${V.BUDICLOUD_URL}/api/ai/upload-file`,u={method:"POST",headers:{"Content-Type":"application/json",[gr.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:o,filename:r,contentType:n})};console.debug("[BudibaseAI] uploadFileSelfHost - Making network call",{url:s,method:u.method,headers:u.headers,bodyKeys:["data","filename","contentType"],filename:r,contentType:n});let c=await fetch(s,u);if(console.debug("[BudibaseAI] uploadFileSelfHost - Network response",{url:s,status:c.status,statusText:c.statusText,ok:c.ok}),!c.ok)throw await Ie.fromResponse(c);return(await c.json()).fileId}async chatCompletion(t){return V.SELF_HOSTED?this.chatCompletionSelfHost(t):this.chatCompletionCloud(t)}async chatCompletionCloud(t){return await ane.tracer.trace("chatCompletionCloud",async()=>await new Xu({apiKey:V.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletion(t))}async chatCompletionSelfHost(t){return await ane.tracer.trace("chatCompletionSelfHost",async r=>{if(!V.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(r.addTags({budicloudUrl:V.BUDICLOUD_URL}),!this._apiKey){let c=await nj();if(!c)throw new Error("No license key found");this._apiKey=c,r.addTags({licenseKey:this._apiKey})}let n={messages:t.messages,format:t.format,useTools:t.tools.length>0},i=`${V.BUDICLOUD_URL}/api/ai/chat`,o={method:"POST",headers:{"Content-Type":"application/json",[gr.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(n)};console.debug("[BudibaseAI] chatCompletionSelfHost - Making network call",{url:i,method:o.method,headers:o.headers,bodyKeys:Object.keys(n),messagesCount:t.messages.length,useTools:n.useTools,format:n.format});let s=await fetch(i,o);if(console.debug("[BudibaseAI] chatCompletionSelfHost - Network response",{url:i,status:s.status,statusText:s.statusText,ok:s.ok}),!s.ok)throw await Ie.fromResponse(s);let u=await s.json();return console.debug("[BudibaseAI] chatCompletionSelfHost - Response data",{url:i,tokensUsed:u.tokensUsed,messagesCount:u.messages?.length}),u})}async*chatCompletionStream(t){V.SELF_HOSTED?yield*this.chatCompletionStreamSelfHost(t):yield*this.chatCompletionStreamCloud(t)}async*chatCompletionStreamCloud(t){yield*new Xu({apiKey:V.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 cI=require("dd-trace");var one=te(require("@anthropic-ai/sdk"));function Dxr(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}a(Dxr,"calculateBudibaseAICredits");var PM=class extends mf{constructor(r){super(r);this.client=new one.default({apiKey:r.apiKey})}static{a(this,"Anthropic")}firstTextBlock(r){for(let n of r.content)if(n.type==="text")return n.text}async uploadFile(r,n,i){throw new Error("File upload not supported for this LLM provider")}async chatCompletion(r){try{let n=await this.client.messages.create({model:this.model,messages:r.messages.map(({content:o})=>{if(o==null)return{role:"user",content:""};if(typeof o=="string")return{role:"user",content:o};let s="";for(let u of o)u.type==="text"?s+=u.text:["image_url","input_audio","file"].includes(u.type);return{role:"user",content:s}}),max_tokens:this.maxTokens}),i=this.firstTextBlock(n)||"";return{messages:[...r.messages,{role:"assistant",content:i}],tokensUsed:Dxr(n.usage)}}catch(n){throw n instanceof one.default.APIError&&console.error(`Anthropic Prompt failed with error ${n.name} and status: ${n.status}`),n}}async*chatCompletionStream(r){try{let n=await this.chatCompletion(r);if(n.messages.length>0){let i=n.messages[n.messages.length-1];i.content&&(yield{type:"content",content:i.content})}yield{type:"done",messages:n.messages,tokensUsed:n.tokensUsed}}catch(n){yield{type:"error",content:n.message}}}};var nZe=require("zod"),iZe=require("openai/helpers/zod");var rZe=require("openai");var NM=class extends Xu{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 rZe.AzureOpenAI({apiKey:t.apiKey,apiVersion:"2024-10-01-preview",baseURL:t.baseUrl})}};var aZe="gpt-5-mini",Pxr={OpenAI:Xu,TogetherAI:Xu,AzureOpenAI:NM,Custom:Xu,Anthropic:PM,BudibaseAI:DM};async function Nxr(){return await cI.tracer.trace("getAIConfig",async e=>{let t={type:"ai",config:{}};if(!W.isSelfHostUsingCloud()){let n=await Ba.getAIConfig();n&&(t=n)}await tee(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||aZe,apiKey:r.apiKey,baseUrl:r.baseUrl}})}a(Nxr,"getAIConfig");async function Lxr(){return cI.tracer.trace("getSelfHostOpenAIKeyConfig",e=>{if(!V.SELF_HOSTED){e.addTags({enabled:!1,reason:"not self host"});return}if(!V.OPENAI_API_KEY){e.addTags({enabled:!1,reason:"no OPENAI_API_KEY"});return}return e.addTags({enabled:!0}),{provider:"OpenAI",model:aZe,apiKey:V.OPENAI_API_KEY}})}a(Lxr,"getSelfHostOpenAIKeyConfig");async function sne(){return cI.tracer.trace("getLLMConfig",async()=>await Nxr()||await Lxr())}a(sne,"getLLMConfig");async function lI(e){return await cI.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:n}=e||{},i=await sne();if(!i){t.addTags({enabled:!1,reason:"no config found"});return}r&&(i.model=r),n&&(i.maxTokens=n);let o=Pxr[i.provider];if(!o){t.addTags({enabled:!1,reason:"no provider found",provider:i.provider});return}return new o(i)})}a(lI,"getLLM");async function oZe(){let e=await lI();if(!e)throw new Ie("No available LLM configurations",500);return e}a(oZe,"getLLMOrThrow");var Ci=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 nZe.z.ZodType?this.format=(0,iZe.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 Xp=require("zod");function IM(e,t){let r=`Summarize this text:
|
|
588
588
|
${e}`,n="";if(t)switch(t){case"short":n="In 1-2 concise sentences, ";break;case"medium":n="In 2-3 paragraphs, ";break;case"long":n="In multiple detailed paragraphs, ";break}return new Ci().addUserMessage(`${n}${r}.
|
|
589
589
|
Only return the summary.`)}a(IM,"summarizeText");function Fxr(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(`
|
|
590
590
|
|