@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/index.js
CHANGED
|
@@ -584,7 +584,7 @@ $1`)};jD.parseAttributes=o(function(t){return Object.keys(t).map(function(r){var
|
|
|
584
584
|
`}var Z9r,JD,tpe,e7r,XD,Wyt,Gyt,zyt,rpe,q$,Vyt,TA=v(()=>{"use strict";YD();Z9r=/^[A-Za-z0-9]+$/g,JD=/{{([^{].*?)}}/g,tpe=/{?{{([^{].*?)}}}?/g,e7r=/{{{([^{].*?)}}}/g,XD=o(()=>Pw()&&$yt()?!0:Pw()?!1:typeof window>"u","isBackendService"),Wyt=o(()=>process&&!process.env.NO_JS,"isJSAllowed"),Gyt=o(e=>{let t=e,r=new RegExp(JD),n=new RegExp(e7r),i=t.match(n);i&&i.forEach(s=>{t=t.replace(s,"")});let a=t.match(r);return a||[]},"findDoubleHbsInstances"),zyt=o(e=>e.match(Z9r),"isAlphaNumeric"),rpe=o((e,t,r,n)=>e.slice(0,t)+n+e.slice(t+r),"swapStrings"),q$=o(e=>Buffer.from(e,"base64").toString("utf-8"),"atob"),Vyt=o((e,t,r)=>{let n=t.map(a=>a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),i=new RegExp(`\\b(${n.join("|")})\\b`,"g");return e.replace(i,`${r}$1`)},"prefixStrings");o($$,"frontendWrapJS")});function ZD(){if(Bm)return Bm;Bm={};for(let e of Object.values(t7r))for(let[t,r]of Object.entries(e))Bm[t]=(...n)=>r(...n,{});Bm={...Bm,...r7r};for(let e of rbt)delete Bm[e];return Object.freeze(Bm),Bm}var Hyt,Kyt,Qyt,Yyt,Jyt,Xyt,Zyt,ebt,tbt,t7r,rbt,r7r,Bm,W$=v(()=>{"use strict";Jle();Hyt=te(jle()),Kyt=te(wA()),Qyt=te(qle()),Yyt=te(zle()),Jyt=te(Wle()),Xyt=te(wle()),Zyt=te(R$()),ebt=te($le()),tbt=te(Vle()),t7r={math:Hyt.default,array:Kyt.default,number:Qyt.default,url:Yyt.default,string:Jyt.default,comparison:Xyt.default,object:Zyt.default,regex:ebt.default,uuid:tbt.default},rbt=["sortBy"],r7r={date:B$,duration:KD};o(ZD,"getJsHelperList")});var oy,npe=v(()=>{"use strict";oy=o(e=>`(function(){
|
|
585
585
|
${e}
|
|
586
586
|
})();`,"iifeWrapper")});var ay,Ip,G$=v(()=>{"use strict";ay=class e extends Error{constructor(){super(e.message);this.code=e.code}static{o(this,"JsTimeoutError")}static{this.message="Timed out while executing JS"}static{this.code="JS_TIMEOUT_ERROR"}},Ip=class e extends Error{constructor(r){super(`error while running user-supplied JavaScript: ${r.toString()}`);this.userScriptError=r;this.code=e.code}static{o(this,"UserScriptError")}static{this.code="USER_SCRIPT_ERROR"}}});function obt(handlebars,context){if(!Wyt()||!z$)throw new Error("JS disabled in environment.");try{let js=oy(q$(handlebars)),snippetMap={},snippetCache={};for(let e of context.snippets||[])snippetMap[e.name]=e.code;let clonedContext;XD()?clonedContext=context:clonedContext=(0,nbt.default)(context);let sandboxContext={$:e=>o7r(e,clonedContext),helpers:ZD(),snippets:new Proxy({},{get:function(_,name){return name in snippetCache||(snippetCache[name]=eval(oy(snippetMap[name]))),snippetCache[name]}})},logs=[];if(!XD()){let e=$$(js).split(js)[0].split(`
|
|
587
|
-
`).length,t=o(r=>(...n)=>{Pw()||console[r](...n),n.forEach((a,s)=>{typeof a=="object"&&(n[s]=JSON.stringify(a))});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:z$(js,sandboxContext),logs};return`{{${AA} js_result-${JSON.stringify(res)}}}`}catch(e){ipe&&ipe(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===ay.code)return ay.message;if(e.code===Ip.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"}}var nbt,z$,e1,ibt,ipe,ope,n7r,i7r,o7r,V$=v(()=>{"use strict";TA();QD();W$();npe();G$();nbt=te(require("lodash/fp/cloneDeep"));YD();e1=o(e=>z$=e,"setJSRunner"),ibt=o(()=>{z$=void 0},"removeJSRunner"),ope=o(e=>ipe=e,"setOnErrorLog"),n7r=o(e=>{if(!e||typeof e!="string")return e;let t=/\[+(.+)]+/,r=e.match(t);return r&&r[1]?r[1]:e},"removeSquareBrackets"),i7r=o(e=>e==="snippets"||e==="helpers"||e.startsWith("snippets.")||e.startsWith("helpers."),"isReservedKey"),o7r=o((e,t)=>{if(i7r(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[n7r(i)]}),n)},"getContextValue");o(obt,"processJS")});function s7r(e){return e==null||typeof e!="object"?!1:e.toString()==="[object Object]"||e.length>0&&typeof e[0]=="object"}function abt(){return Object.values(Dw).concat(j$,Zle)}function ape(e){for(let t of u7r)t.register(e)}function sbt(e){ape(e),jyt(e)}var H$,a7r,u7r,K$=v(()=>{"use strict";_mt();H$=te(LD());qyt();V$();QD();W$();a7r={"<":"<",">":">"};o(s7r,"isObject");u7r=[new Nm(Dw.OBJECT,e=>new H$.default.SafeString(JSON.stringify(e))),new Nm(Dw.JS,obt,!1),new Nm(Dw.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 Nm(Dw.ALL,(e,t)=>{let{__opts:r}=t;if(s7r(e))return new H$.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 H$.default.SafeString(n.replace(/&/g,"&")),n==null||typeof n!="string"?n:n.replace(/[<>]/g,i=>a7r[i]||i)}),new Nm(Dw.LITERAL,e=>{if(e===void 0)return"";let t=typeof e,r=t==="object"?JSON.stringify(e):e;return`{{${AA} ${t}-${r}}}`})];o(abt,"HelperNames");o(ape,"registerMinimum");o(sbt,"registerAll")});var ubt,RA,cbt,lbt=v(()=>{"use strict";K$();TA();ubt=["#","else","/"],RA=class{static{o(this,"Preprocessor")}constructor(t,r){this.name=t,this.fn=r}process(t,r,n){let i=this.fn(r,n),a=t.indexOf(r);return rpe(t,a,r.length,i)}},cbt=[new RA("swap-to-dot-notation",e=>{let t=e.indexOf("["),r=0;for(;t!==-1;){zyt(e.charAt(t-1))&&(e=rpe(e,t+r,1,".[")),r=t+1;let n=e.substring(r+1).indexOf("[");t=n>0?r+1+n:-1}return e}),new RA("fix-functions",e=>{for(let t of ubt){let r=`{ ${t}`,n=`{${t}`;e=e.replace(new RegExp(r,"g"),n)}return e}),new RA("normalize-spaces",e=>e.replace(/{{(\s{2,})/g,"{{ ")),new RA("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 a=i.split(" ")[0];for(let u of ubt)if(a.includes(u))return e;let s=a.trim().toLowerCase();return n&&!t?.disabledHelpers?.includes(s)&&abt().some(u=>s===u.toLowerCase())&&(i=`(${i})`),`{{ all ${i} }}`})]});var spe,upe,pbt=v(()=>{"use strict";QD();spe=class{static{o(this,"Postprocessor")}constructor(t,r){this.name=t,this.fn=r}process(t){return this.fn(t)}},upe=[new spe("convert-literals",e=>{if(typeof e!="string"||!e.includes(AA))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 cpe(e,t,r){let n=[];for(let i of t){if(typeof e!="string")break;let a=new RegExp(JD),s=e.match(a);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}}function fbt(e,t){let r=cbt;return t.noFinalise&&(r=r.filter(n=>n.name!=="finalise")),cpe(e,r,t).result}function dbt(e){return cpe(e,upe).result}function mbt(e){return cpe(e,upe)}var hbt=v(()=>{"use strict";TA();lbt();pbt();o(cpe,"process");o(fbt,"preprocess");o(dbt,"postprocess");o(mbt,"postprocessWithLogs")});var gbt=v(()=>{"use strict";K$()});function wbt(e){try{JSON.stringify(e)}catch{throw"Unable to process inputs to JSON, cannot recurse"}}function d7r(e){return e?Object.keys(e).filter(r=>p7r.includes(r)):[]}function m7r(e,t,r){t={...f7r,...t};let n=!t?.noHelpers,i=`${e}-${JSON.stringify(t)}`;if(t.cacheTemplates&&lpe[i])return lpe[i];let a=n?d7r(r):[];if(e=fbt(e,{...t,disabledHelpers:a}),r&&n&&a.length>0)for(let c of fl(e))e=e.replace(c,Vyt(c,a,"./"));t.noEscaping&&(e=g7r(e));let u=(t.noHelpers?vbt:fpe).compile(e,{strict:!1});return lpe[i]=u,u}async function Q$(e,t,r){wbt(e);for(let n of Object.keys(e||{}))if(e[n]!=null){let i=e[n],a=i;typeof i=="string"?a=await IA(e[n],t,r):typeof i=="object"&&(a=await Q$(e[n],t,r)),e[n]=a}return e}async function IA(e,t,r){return Li(e,t,r)}function t1(e,t,r){wbt(e);for(let n of Object.keys(e||{})){let i=e[n];typeof i=="string"?e[n]=Li(e[n],t,r):typeof i=="object"&&(e[n]=t1(e[n],t,r))}return e}function h7r(e,t,r){let n=e;if(typeof e!="string")throw new Error("Cannot process non-string types.");function i(a){let s=m7r(a,r,t),u=Math.floor(Date.now()/1e3)*1e3,c=s({now:new Date(u).toISOString(),__opts:{...r,input:a},...t});return r?.logging?mbt(c):dbt(c)}o(i,"process");try{if(r&&r.onlyFound){let a=[],s=fl(e);for(let u of s){let c=i(u);typeof c=="object"&&"result"in c?(a=a.concat(c.logs||[]),e=e.replace(u,c.result)):e=e.replace(u,c)}return r?.logging?{result:e,logs:a}:e}else return i(e)}catch(a){let{noThrow:s=!0}=r||{};if(s)return n;throw a}}function Li(e,t,r){return h7r(e,t,{...r,logging:!1})}function g7r(e){let t=Gyt(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}function Y$(e){return r1(e)!=null}function r1(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:q$(r[1])}function Ebt(e,t){let r=new RegExp(JD),n=e.match(r);if(n==null)return!1;for(let i of n){let a=i;Y$(i)&&(a=r1(i));let s=!0;for(let u of t)a.includes(u)||(s=!1);if(s)return!0}return!1}function fl(e){if(!e||typeof e!="string")return[];let t=new RegExp(tpe),r=e.match(t);return r??[]}function y7r(){let e=Pw()?bbt.default:ybt.default;e1((t,r)=>{e.createContext(r);let n=$$(t),i=e.runInNewContext(n,r);if(i.error)throw new Ip(i.error);return i.result})}function b7r(){XD()?ibt():y7r()}var ybt,bbt,ppe,fpe,p7r,vbt,f7r,lpe,So=v(()=>{"use strict";ybt=te(kft()),bbt=te(require("vm")),ppe=te(LD());K$();hbt();TA();gbt();V$();G$();YD();YD();W$();TA();V$();npe();G$();fpe=(0,ppe.create)();sbt(fpe);p7r=Object.keys(fpe.helpers),vbt=(0,ppe.create)();ape(vbt);f7r={noHelpers:!1,cacheTemplates:!1,noEscaping:!1,escapeNewlines:!1,noFinalise:!1};o(wbt,"testObject");o(d7r,"findOverlappingHelpers");lpe={};o(m7r,"createTemplate");o(Q$,"processObject");o(IA,"processString");o(t1,"processObjectSync");o(h7r,"processStringSyncInternal");o(Li,"processStringSync");o(g7r,"disableEscaping");o(Y$,"isJSBinding");o(r1,"decodeJSBinding");o(Ebt,"doesContainStrings");o(fl,"findHBSBlocks");o(y7r,"browserJSSetup");o(b7r,"defaultJSSetup");b7r()});function dpe(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||v7r,e.endDate=e.endDate||w7r),e}async function _bt(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(n=>J.getProdWorkspaceID(n)));let t={};function r(n,i){i?.length&&(t.oneOf={...t.oneOf,[n]:i})}return o(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=dpe(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}function mpe(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}function hpe(e){let t=fl(e);for(let r of t){let n=` "${r}"`;e=e.replace(e.includes(n)?n:` ${r}`,""),e=Li(e,{})}return e}function Sbt(e,t){let r=bE[e];if(!r)throw new Error("No friendly name found.");let n=Li(r,t);return n.includes('""')&&(n=hpe(r)),n}var v7r,w7r,xbt=v(()=>{"use strict";X();So();H();v7r=ur.MIN_VALID_DATE.toISOString(),w7r=ur.MAX_VALID_DATE.toISOString();o(dpe,"fillDates");o(_bt,"getSearchFilters");o(mpe,"deleted");o(hpe,"removeTemplateStrings");o(Sbt,"getEventFriendlyName")});async function E7r(e,t,r){if(!await U4()||!jt.isAudited(e))return;let n=Sbt(e,t),i=new Date;r?.timestamp&&(i=new Date(r.timestamp));let a={timestamp:i.toISOString(),event:e,name:n,userId:r?.userId||Jve,metadata:{...t,...r?.hostInfo}},s={};try{if(r?.appId){a.appId=J.getProdWorkspaceID(r.appId);let u=await Ct.workspace.getWorkspaceMetadata(r.appId);"name"in u&&(s.appName=u.name)}if(r?.userId){let u=await Pt.getById(r?.userId);s.email=u.email}}catch(u){Dt.logAlert("Failed to retrieve fallback information for audit log",u)}return a.fallback=s,await Tft(a)}async function _7r(e){let t=e.map(u=>u.userId),n=e.filter(u=>u.appId).map(u=>J.getDevWorkspaceID(u.appId)),i=await Pt.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),a=await J.getWorkspacesByIDs([...new Set(n)]),s=[];for(let u of e){let c=i.find(f=>f?._id===u.userId),l=a.find(f=>J.isSameWorkspaceID(f?.appId,u.appId)),p={event:u.event,timestamp:u.timestamp,name:u.name,metadata:u.metadata,user:c||mpe(u.userId,"user",u.fallback)};u.appId&&(p.app=l||mpe(u.appId,"app",u.fallback)),s.push(p)}return s}async function S7r(e){if(!await U4())throw new Error("Audit logs not available - license required.");let t=await _bt(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await Ece(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await _7r(r.rows)}}function x7r(e){return e=dpe(e),Rft(e)}function A7r(){let e=Object.entries(bE).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=hpe(r[1]);return t}var Abt=v(()=>{"use strict";X();H();Ift();al();xbt();o(E7r,"write");o(_7r,"enrich");o(S7r,"fetch");o(x7r,"download");o(A7r,"definitions")});var Nw={};ae(Nw,{definitions:()=>A7r,download:()=>x7r,fetch:()=>S7r,write:()=>E7r});var Tbt=v(()=>{"use strict";Abt()});var gpe={};ae(gpe,{roleCheck:()=>R7r});function T7r(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}async function R7r(e,t){return await Rm()||T7r(e,t),e}var Rbt=v(()=>{"use strict";al();o(T7r,"removeRoles");o(R7r,"roleCheck")});var ype={};ae(ype,{assign:()=>I7r,unAssign:()=>O7r});async function I7r(e,t){if(!await Rm())throw new Error("Unable to assign roles - license required.");let r=await sl.bulkGet(e);for(let n of r){if(t.role&&t.role.roleId){let i=J.getProdWorkspaceID(t.role.appId);n.roles[i]=t.role.roleId}if(t.appBuilder){let i=J.getProdWorkspaceID(t.appBuilder.appId),a=n.builder?.apps||[];n.builder={apps:a.concat([i])}}t.builder&&(n.builder={global:!0}),t.admin&&(n.admin={global:!0}),n.roles}await sl.bulkUpdate(r)}async function O7r(e,t){if(!await Rm())throw new Error("Unable to un-assign roles - license required.");let r=await sl.bulkGet(e);for(let n of r){if(t.role){let i=J.getProdWorkspaceID(t.role?.appId);n.roles[i]===t.role.roleId&&delete n.roles[i]}if(t.appBuilder&&n.builder?.apps){let i=J.getProdWorkspaceID(t.appBuilder.appId);n.builder.apps=n.builder.apps.filter(a=>a!==i)}t.builder&&n.builder&&delete n.builder,t.admin&&n.admin&&delete n.admin}}var Ibt=v(()=>{"use strict";X();al();ED();o(I7r,"assign");o(O7r,"unAssign")});var bpe={};ae(bpe,{buildExportFn:()=>k7r,buildImportFn:()=>C7r});function C7r(e){return async(t,r)=>{await Rm()||t.throw(403,"Endpoint unavailable, license required."),t.request.files?.appExport||t.throw(400,"Must provide app export file for import."),await F.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}function k7r(e){return async(t,r)=>{await Rm()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:n,excludeRows:i}=t.request.body;await F.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:n,excludeRows:i},t.query.appId=t.params.appId,await e(t),await r()})}}var Obt=v(()=>{"use strict";X();al();o(C7r,"buildImportFn");o(k7r,"buildExportFn")});var vpe={};ae(vpe,{applications:()=>bpe,roles:()=>ype,users:()=>gpe});var Cbt=v(()=>{"use strict";Rbt();Ibt();Obt()});function Dbt(){kbt=new Fa.BudibaseQueue(Fa.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}function Lw(){return kbt}var kbt,J$=v(()=>{"use strict";X();o(Dbt,"init");o(Lw,"getBackupQueue")});async function wpe(e,t={}){return ol.storeAppBackupMetadata(e,t)}function Lbt(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}}}async function P7r(e,t,r,n){let i=await X$(e);return await ol.storeAppBackupMetadata({...i,...Lbt(t),contents:r,status:t,type:"backup"},{filename:n,docId:e})}async function N7r(e,t,r){let n=await X$(e);return await ol.storeAppBackupMetadata({...n,...Lbt(r),status:r,type:"restore",trigger:"manual"},{docId:e,docRev:t})}async function X$(e){return ol.getAppBackupMetadata(e)}async function L7r(e,t){return ol.updateAppBackupMetadata(e,t)}async function Ubt(e){let t=await ol.getAppBackupMetadata(e);return t.filename&&await qe.deleteFile(qe.ObjectStoreBuckets.BACKUPS,t.filename),ol.deleteAppBackupMetadata(e)}async function U7r(e){let t=[];for(let r of e)try{await Ubt(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}async function F7r(e,t){return ol.fetchAppBackups(e,t)}async function Fbt(e){let t=await ol.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let r=await qe.getReadStream(qe.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}async function M7r(e){let{stream:t}=await Fbt(e),r=(0,Nbt.join)(qe.budibaseTempDir(),jt.newid()),n=Pbt.default.createWriteStream(r);return new Promise((i,a)=>{t.on("error",a),n.on("error",a),t.pipe(n).on("close",()=>i(r))})}async function B7r(e,t,r={}){let n;try{n=await wpe({appId:e,trigger:t,timestamp:new Date().toISOString(),status:"pending",type:"backup",...r})}catch(i){if(i.status===409)return;throw i}return await Lw().add({docId:n.id,docRev:n.rev,appId:e,export:{trigger:t,...r}}),await Oe.backup.appBackupTriggered(e,n.id,"backup",t,r?.name),n.id}async function j7r(e,t,r,n){let i=await X$(t),a;try{a=await wpe({appId:e,timestamp:new Date().toISOString(),status:"pending",type:"restore",createdBy:n})}catch(s){if(s?.status===409)return;throw s}return await Lw().add({appId:e,docId:a.id,docRev:a.rev,import:{nameForBackup:r,backupId:t,createdBy:n}}),{restoreId:a.id,metadata:i}}async function q7r(e,t,r){let n=J.getProdWorkspaceID(e);await F.doInWorkspaceContext(n,async()=>{let i=F.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 Ct.workspace.invalidateWorkspaceMetadata(s.appId,s))})}var Pbt,Nbt,$7r,dl,Epe=v(()=>{"use strict";X();H();Pbt=te(require("fs")),Nbt=require("path");Tm();al();J$();o(wpe,"storeAppBackupMetadata");o(Lbt,"getTimestamps");o(P7r,"updateBackupStatus");o(N7r,"updateRestoreStatus");o(X$,"getAppBackup");o(L7r,"updateAppBackup");o(Ubt,"deleteAppBackup");o(U7r,"deleteAppBackups");o(F7r,"fetchAppBackups");o(Fbt,"getBackupDownloadStream");o(M7r,"downloadAppBackup");o(B7r,"triggerAppBackup");o(j7r,"triggerAppRestore");o(q7r,"trackBackupError");$7r={isEnabled:Que,triggerAppRestore:zs(j7r),triggerAppBackup:zs(B7r),getBackupDownloadStream:zs(Fbt),downloadAppBackup:zs(M7r),fetchAppBackups:zs(F7r),storeAppBackupMetadata:zs(wpe),updateBackupStatus:zs(P7r),updateRestoreStatus:zs(N7r),getAppBackup:zs(X$),updateAppBackup:zs(L7r),deleteAppBackup:zs(Ubt),deleteAppBackups:zs(U7r),trackBackupError:zs(q7r)},dl=$7r});var Spe={};ae(Spe,{init:()=>_pe});async function _pe(e){Lw().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),z7r(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),G7r(t,e)}catch(n){Dt.logAlert(`Failed to perform backup for app ID: ${r.appId}`,n)}})}async function W7r(e){await J.getDB(e,{skip_setup:!0}).destroy()}async function Mbt(e,t,r,n){let i=J.getDevWorkspaceID(r),a=J.getProdWorkspaceID(r),s=new Date().toISOString(),u=o(async(c,l)=>{n?.doc?await dl.updateBackupStatus(n.doc.id,c,l?.contents,l?.filename):await dl.storeAppBackupMetadata({appId:a,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),p=`${a}/backup-${s}.tar.gz`,f=qe.ObjectStoreBuckets.BACKUPS,d=OA.default.createReadStream(c);await qe.streamUpload({bucket:f,filename:p,stream:d,extra:{type:"application/gzip",metadata:{name:n?.name,trigger:e,timestamp:s,appId:a}}}),await u("complete",{filename:p,contents:l}),OA.default.existsSync(c)&&OA.default.rmSync(c)}catch(c){Dt.logAlert("App backup error",c),await u("failed");let l=n?.doc?.id||`backup-${s}`,p=c instanceof Error?c.message:String(c);await dl.trackBackupError(a,l,`Backup export failed: ${p}`)}}async function G7r(e,t){let r=e.data,n=r.appId,i=r.import.backupId,a=r.import.nameForBackup,s=r.import.createdBy,u=ot.getTenantIDFromWorkspaceID(n);return ot.doInTenant(u,async()=>{let c=J.getDevWorkspaceID(n),l=`${c}_temp_${Date.now()}`,{rev:p}=await dl.updateRestoreStatus(r.docId,r.docRev,"started");await Mbt("restoring",u,n,{processing:t,createdBy:s,name:a});let f=await dl.downloadAppBackup(i),d="complete";try{await t.importAppFn(l,J.getDB(l),{file:{type:"application/gzip",path:f},key:f}),await W7r(c),await new J.Replication({source:l,target:c}).replicate()}catch(m){Dt.logAlert("App restore error",m),d="failed";let h=m instanceof Error?m.message:String(m);await dl.trackBackupError(n,i,`Backup restore failed: ${h}`)}finally{try{await J.getDB(l,{skip_setup:!0}).destroy()}catch{}}await dl.updateRestoreStatus(r.docId,p,d),OA.default.existsSync(f)&&OA.default.rmSync(f,{force:!0})})}async function z7r(e,t){let r=e.data,n=r.appId,i=r.export.trigger,a=r.export.name,s=ot.getTenantIDFromWorkspaceID(n);await ot.doInTenant(s,async()=>{try{let{rev:u}=await dl.updateBackupStatus(r.docId,"started");return Mbt(i,s,n,{processing:t,doc:{id:r.docId,rev:u},name:a})}catch(u){Dt.logAlert("App backup error",u);let c=u instanceof Error?u.message:String(u);await dl.trackBackupError(n,r.docId,`Backup export failed: ${c}`)}})}var OA,Bbt=v(()=>{"use strict";X();H();OA=te(require("fs"));Epe();J$();o(_pe,"init");o(W7r,"removeExistingApp");o(Mbt,"runBackup");o(G7r,"importProcessor");o(z7r,"exportProcessor")});var V7r,Qa,xpe=v(()=>{"use strict";Epe();Bbt();J$();V7r=o(async e=>{Dbt(),await _pe(e.processing)},"init"),Qa={...dl,processing:Spe,init:V7r,getBackupQueue:Lw}});var Ape,jbt=v(()=>{"use strict";xpe();Ape=o(async e=>{e.backups&&await Qa.init(e.backups)},"init")});var pc={};ae(pc,{create:()=>Q7r,find:()=>K7r,get:()=>H7r,remove:()=>J7r,update:()=>Y7r});async function H7r(e){let t=ot.getGlobalDB(),r=new J.QueryBuilder(t.name,"user");r.setIndexBuilder(J.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[i,a]of Object.entries(e.filters?.equal??{}))r.addEqual(i,a);r.setSort("_id"),r.setSkip(e.skip);let n=await r.run();return{users:n.rows,total:n.totalRows}}async function K7r(e){return await Pt.getById(e)}async function Q7r(e){let t=await sl.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new Ie("User is already synched",409);e={...t,scimInfo:(0,qbt.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await sl.save(e,{requirePassword:!1})}async function Y7r(e,t){return await sl.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}async function J7r(e){return await sl.destroy(e)}var qbt,$bt=v(()=>{"use strict";qbt=te(require("lodash/fp/merge"));X();ED();H();o(H7r,"get");o(K7r,"find");o(Q7r,"create");o(Y7r,"update");o(J7r,"remove")});var n1={};ae(n1,{create:()=>X7r});async function X7r(e){let t=await pue(e.name),r;if(!t)r=(await Pn.save(e)).id;else{if(t.scimInfo?.isSync)throw new Ie("Group is already synched",409);r=t._id,t.users&&(await Pn.removeUsers(r,t.users.map(i=>i._id)),delete t.users),t.scimInfo=(0,Wbt.default)(t.scimInfo,e.scimInfo),await Pn.save(t)}return await Pn.get(r)}var Wbt,Gbt=v(()=>{"use strict";Wbt=te(require("lodash/fp/merge"));v4();Ap();X();o(X7r,"create")});var CA={};ae(CA,{logRequest:()=>Z7r,logResponse:()=>eKr});async function Z7r(e){Dt.logWarn("SCIM request log",e)}async function eKr(e){Dt.logWarn("SCIM response error",e)}var zbt=v(()=>{"use strict";X();o(Z7r,"logRequest");o(eKr,"logResponse")});var Tpe=v(()=>{"use strict";$bt();Gbt();zbt()});var xo={};ae(xo,{ai:()=>ece,auditLogs:()=>Nw,automations:()=>ty,backups:()=>Qa,branding:()=>bD,environmentVariables:()=>Tp,features:()=>ao,groups:()=>Pn,init:()=>Ape,licensing:()=>oc,logger:()=>CA,plugins:()=>wce,publicApi:()=>vpe,quotas:()=>an,scimGroups:()=>n1,scimUsers:()=>pc,users:()=>ey,utils:()=>hD});var Ap=v(()=>{"use strict";Upt();tce();tA();uA();ED();dft();al();q4();bft();Sft();Tbt();Cbt();xpe();Lue();jbt();Tpe()});var tKr,Vbt,Hbt=v(()=>{"use strict";hue();X();Ap();H();tKr=o((e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(K.SELF_HOSTED&&K.DEFAULT_LICENSE)return t.user.license=mue,r();t.user.license=await oc.cache.getCachedLicense(t,{populateLicense:e.populateLicense,populateFreeLicense:e.populateFreeLicense}),e.checkUsersLimit&&(jt.isServingApp(t)||jt.isServingBuilder(t)||jt.isServingBuilderPreview(t)||jt.isPublicApiRequest(t))&&await an.usageLimitIsExceeded({name:"users",type:"static",usageChange:0})}return r()},"licensing"),Vbt=tKr});var uo={};ae(uo,{requireFeature:()=>rKr,requireFeatures:()=>nKr});var rKr,nKr,Kbt=v(()=>{"use strict";al();rKr=o(e=>async(t,r)=>{await L4(e),await r()},"requireFeature"),nKr=o((...e)=>async(t,r)=>{await Kue(e),await r()},"requireFeatures")});var Rpe,Qbt=v(()=>{"use strict";X();Tpe();Rpe=o(async(e,t)=>(K.DISABLE_SCIM_CALLS||await CA.logRequest({...e.request.toJSON(),body:e.request.body}),await F.doInScimContext(async()=>{let r=await t();return await CA.logResponse({...e.response.toJSON(),body:e.response.body}),r})),"doInScimContext")});var Ipe,Ybt=v(()=>{"use strict";al();Ipe=o(async(e,t)=>{await Xue(),await t()},"requireSCIM")});function Ope(e,t,r){return async(n,i)=>{let a=n.params[t];return typeof a!="string"&&n.throw(404),!!(await e(a)).scimInfo?.isSync!==r&&n.throw(404),i()}}var i1,o1,a1,Jbt=v(()=>{"use strict";X();Tm();i1=o(e=>Ope(Pt.getById,e,!0),"scimUserOnly"),o1=o(e=>Ope(Ni.get,e,!0),"scimGroupOnly"),a1=o(e=>Ope(Ni.get,e,!1),"internalGroupOnly");o(Ope,"scimSyncChecks")});async function kpe(e,t){await Cpe.tracer.trace("licenseAuth",async r=>{let n=e.request.headers[ur.Header.LICENSE_KEY];Array.isArray(n)&&(n=n[0]),r.addTags({licenseKey:n}),n||e.throw(403,"License key not provided");let i=await $ue(n);i||(r.addTags({licenseFound:!1}),e.throw(403,"License not found or invalid")),i.tenantId||e.throw(403,"License does not have a tenant ID"),Cpe.tracer.setUser({id:"anonymous",tenantId:i.tenantId}),await F.doInSelfHostTenantUsingCloud(i.tenantId,async()=>{await F.doInLicenseContext(i,async()=>{await t()})})})}var Cpe,Xbt=v(()=>{"use strict";X();tA();Cpe=require("dd-trace");o(kpe,"default")});var kA={};ae(kA,{doInScimContext:()=>Rpe,feature:()=>uo,internalGroupOnly:()=>a1,licenseAuth:()=>kpe,licensing:()=>Vbt,requireSCIM:()=>Ipe,scimGroupOnly:()=>o1,scimUserOnly:()=>i1});var s1=v(()=>{"use strict";Hbt();Kbt();Qbt();Ybt();Jbt();Xbt()});async function Zbt(e){let t=e.request.body;if(t.name=t.name.trim(),delete t.roles,t._id){let n=await Zg(t._id);t.roles=n.roles,t.scimInfo=n.scimInfo}let r=await cA(t);e.body={_id:r.id,_rev:r.rev}}async function evt(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,a;r&&(i=await j4(t,r)),n&&(a=await cce(t,n)),e.body={added:i,removed:a}}async function tvt(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 lce(t,{appsToAdd:r,appsToRemove:n})}async function rvt(e){e.body={data:await wD()}}async function nvt(e){let{groupId:t,rev:r}=e.params;try{await uce(t,r),e.body={message:"Group deleted successfully"}}catch(n){e.throw(n.status,n)}}async function ivt(e){try{e.body=await Zg(e.params.groupId)}catch(t){e.throw(t.status,t)}}async function ovt(e){let{pageSize:t=10,bookmark:r,emailSearch:n}=e.request.query,i=e.params.groupId,a={limit:t+1},s=await b4(i,{...a,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}}async function avt(e){let{groupId:t,appId:r}=e.params;await pce(t,r),e.body={message:"Group app builder access updated."}}async function svt(e){let{groupId:t,appId:r}=e.params;await fce(t,r),e.body={message:"group app builder access removed."}}async function uvt(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 Hx.jsonFromCsvString(r,{allowSingleColumn:!0});(!n||n.length===0)&&e.throw(400,"CSV file is invalid");let a=Object.keys(n[0]).find(f=>/^(email|e-mail|email address|mail|e_mail)$/i.test(f.trim()));a||e.throw(400,"CSV file must contain an email column");let s=Array.from(new Set(n.map(f=>f[a]).filter(f=>f&&typeof f=="string"&&f.trim().length>0).map(f=>f.trim())));s.length===0&&e.throw(400,"No valid email addresses found in CSV");try{await Zg(t)}catch(f){if(f.status===404)e.throw(404,"Group not found");else throw f}let u=[],c=[],l=[],p=await Promise.all(s.map(f=>sl.getUserByEmail(f)));for(let f of s){let d=p.find(m=>m?.email===f);d?(u.push({_id:d._id,email:d.email}),l.push(d._id)):c.push({email:f,reason:"User not found"})}l.length>0&&await j4(t,l),e.body={added:u,skipped:c}}var cvt=v(()=>{"use strict";q4();v4();ED();X();o(Zbt,"save");o(evt,"updateGroupUsers");o(tvt,"updateGroupApps");o(rvt,"fetch");o(nvt,"destroy");o(ivt,"find");o(ovt,"searchUsers");o(avt,"addAppBuilder");o(svt,"removeAppBuilder");o(uvt,"bulkAddUsersFromCsv")});function oKr(){return vt.joiValidator.body(Hs.default.object({_id:Hs.default.string().optional(),_rev:Hs.default.string().optional(),color:Hs.default.string().required(),icon:Hs.default.string().required(),name:Hs.default.string().trim().required().max(50),role:Hs.default.string().optional(),users:Hs.default.array().optional(),apps:Hs.default.array().optional(),roles:Hs.default.object().optional(),createdAt:Hs.default.string().optional(),updatedAt:Hs.default.string().optional()}).required())}var lvt,Hs,pvt,fvt,dvt=v(()=>{"use strict";cvt();lvt=te(require("@koa/router")),Hs=te(require("joi"));s1();H();X();pvt=new lvt.default;o(oKr,"buildGroupSaveValidation");pvt.post("/api/global/groups",vt.adminOnly,uo.requireFeature("userGroups"),oKr(),Zbt).get("/api/global/groups",uo.requireFeature("userGroups"),rvt).delete("/api/global/groups/:groupId/:rev",uo.requireFeature("userGroups"),vt.adminOnly,a1("groupId"),nvt).get("/api/global/groups/:groupId",uo.requireFeature("userGroups"),vt.builderOrAdmin,ivt).get("/api/global/groups/:groupId/users",uo.requireFeature("userGroups"),vt.builderOrAdmin,ovt).post("/api/global/groups/:groupId/users",vt.adminOnly,uo.requireFeature("userGroups"),a1("groupId"),evt).post("/api/global/groups/:groupId/users/bulk",vt.adminOnly,uo.requireFeature("userGroups"),a1("groupId"),vt.joiValidator.body(Hs.default.object({csvContent:Hs.default.string().required()}).required()),uvt).post("/api/global/groups/:groupId/apps",vt.builderOrAdmin,uo.requireFeature("userGroups"),tvt).post("/api/global/groups/:groupId/app/:appId/builder",vt.builderOrAdmin,uo.requireFeatures("userGroups","appBuilders"),avt).delete("/api/global/groups/:groupId/app/:appId/builder",vt.builderOrAdmin,uo.requireFeatures("userGroups","appBuilders"),svt);fvt=pvt});async function mvt(e){e.body={encryptionKeyAvailable:Tp.isEncryptionKeyAvailable()}}async function hvt(e){e.body={variables:await Tp.fetch()}}async function gvt(e){let{name:t,production:r,development:n}=e.request.body;await Tp.update(t,{production:r,development:n});let i=["production"];r!==n&&i.push("development"),await Oe.environmentVariable.created(t,i),e.body={message:`Environment variable "${t}" created.`}}async function yvt(e){let{production:t,development:r}=e.request.body,n=e.params.varName;await Tp.update(n,{production:t,development:r}),e.body={message:`Environment variable "${n}" updated.`}}async function bvt(e){let t=e.params.varName;await Tp.remove(t),await Oe.environmentVariable.deleted(t),e.body={message:`Environment variable "${t}" deleted.`}}var vvt=v(()=>{"use strict";X();H();Ap();o(mvt,"status");o(hvt,"fetch");o(gvt,"create");o(yvt,"update");o(bvt,"destroy")});function wvt(){return vt.joiValidator.body(u1.default.object({name:u1.default.string().optional(),production:u1.default.string().required(),development:u1.default.string().required()}))}var Evt,u1,_vt,Svt,xvt=v(()=>{"use strict";vvt();X();Evt=te(require("@koa/router")),u1=te(require("joi")),_vt=new Evt.default;o(wvt,"buildEnvVarUpdateValidator");_vt.get("/api/env/variables/status",vt.builderOrAdmin,mvt).get("/api/env/variables",vt.builderOrAdmin,hvt).post("/api/env/variables",vt.builderOrAdmin,wvt(),gvt).patch("/api/env/variables/:varName",vt.builderOrAdmin,wvt(),yvt).delete("/api/env/variables/:varName",vt.builderOrAdmin,bvt);Svt=_vt});async function Avt(e){let t=e.request.body,r=await Nw.fetch(t);await Oe.auditLog.filtered(t),e.body=r}async function Tvt(e){let t=e.request.body,{stream:r}=Nw.download(t);await Oe.auditLog.downloaded(t),e.attachment(`audit-logs-${Date.now()}.log`),e.body=r}async function Rvt(e){e.body={events:Nw.definitions()}}var Ivt=v(()=>{"use strict";Ap();X();o(Avt,"search");o(Tvt,"download");o(Rvt,"definitions")});function Ovt(){return vt.joiValidator.body(ml.default.object({userIds:ml.default.array().items(ml.default.string()).optional(),appIds:ml.default.array().items(ml.default.string()).optional(),events:ml.default.array().items(ml.default.string().valid(...Object.values(zr))).optional(),startDate:ml.default.string().optional().allow(""),endDate:ml.default.string().optional().allow(""),fullSearch:ml.default.string().optional().allow(""),bookmark:ml.default.number()}))}var Cvt,ml,kvt,Dvt,Pvt=v(()=>{"use strict";Ivt();H();X();Cvt=te(require("@koa/router")),ml=te(require("joi"));o(Ovt,"buildAuditLogSearchValidator");kvt=new Cvt.default;kvt.post("/api/global/auditlogs/search",vt.adminOnly,Ovt(),Avt).get("/api/global/auditlogs/download",vt.adminOnly,Qn.querystringToBody,Ovt(),Tvt).get("/api/global/auditlogs/definitions",vt.adminOnly,Rvt);Dvt=kvt});async function Uw(e,t){t||e.throw(400,"App ID missing"),await hD.workspaceExists(t)||e.throw(400,`Provided app ID: ${t} - is invalid.`)}async function Nvt(e){let t=e.params.appId;await Uw(e,t);let{body:r}=e.request,n=e.user?._id,i=await Qa.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."}}async function Lvt(e){let t=e.params.appId;await Uw(e,t);let r=e.params.backupId,n=e.request.body.name,i=await Qa.triggerAppRestore(t,r,n,e.user?._id);i||e.throw(500,"Unable to start restore."),await Oe.backup.appBackupRestored(i.metadata),e.body={restoreId:i?.restoreId,message:"Restore triggered - process starting."}}async function Uvt(e){let t=e.params.appId;await Uw(e,t);let r=e.params.backupId;await Qa.deleteAppBackup(r),e.body={message:"Backup deleted successfully."}}async function Fvt(e){let t=F.getWorkspaceId();await Uw(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 Qa.deleteAppBackups(r),i=n.filter(s=>s.success).length,a=n.length-i;e.body={message:`${i} backups deleted successfully${a>0?`, ${a} failed`:""}.`,results:n,successCount:i,failureCount:a}}async function Mvt(e){let t=e.params.appId;await Uw(e,t);let r=e.request.body;r?.trigger&&(r.trigger=r.trigger.toLowerCase(),Object.values(oh).includes(r.trigger)||e.throw(400,"Provided trigger is not a valid option.")),e.body=await Qa.fetchAppBackups(t,{paginate:!0,...r})}async function Bvt(e){let t=e.params.appId;await Uw(e,t);let r=e.params.backupId,n=e.request.body;e.body=await Qa.updateAppBackup(r,n.name)}async function jvt(e){let t=e.params.appId;await Uw(e,t);let r=e.params.backupId,{metadata:n,stream:i}=await Qa.getBackupDownloadStream(r);e.attachment(`backup-${n.timestamp}.tar.gz`),e.body=i}var qvt=v(()=>{"use strict";X();H();Ap();o(Uw,"checkAppID");o(Nvt,"manualBackup");o(Lvt,"importBackup");o(Uvt,"deleteBackup");o(Fvt,"deleteBackups");o(Mvt,"fetchBackups");o(Bvt,"updateBackup");o(jvt,"downloadBackup")});function cKr(){return vt.joiValidator.body(Fw.default.object({trigger:Fw.default.string().valid(...Object.values(oh)),type:Fw.default.string().valid(...Object.values(VT)),startDate:Fw.default.date(),endDate:Fw.default.date(),page:Fw.default.string()}))}var $vt,Fw,Wvt,Gvt,zvt=v(()=>{"use strict";X();H();$vt=te(require("@koa/router")),Fw=te(require("joi"));qvt();Wvt=new $vt.default;o(cKr,"validateBackupSearch");Wvt.post("/api/apps/:appId/backups",vt.builderOrAdmin,Nvt).post("/api/apps/:appId/backups/search",vt.builderOrAdmin,cKr(),Mvt).get("/api/apps/:appId/backups/:backupId/file",vt.builderOrAdmin,jvt).patch("/api/apps/:appId/backups/:backupId",vt.builderOrAdmin,Bvt).delete("/api/apps/:appId/backups/:backupId",vt.builderOrAdmin,Uvt).delete("/api/apps/:appId/backups",vt.builderOrAdmin,Fvt).post("/api/apps/:appId/backups/:backupId/import",vt.builderOrAdmin,Lvt);Gvt=Wvt});var Vvt=x(oi=>{"use strict";Object.defineProperty(oi,"__esModule",{value:!0});oi.InvalidRemoveOpPath=oi.NoTarget=oi.InvalidScimPatchRequest=oi.NoPathInScimPatchOp=oi.FilterArrayTargetNotFound=oi.FilterOnEmptyArray=oi.InvalidScimPatchOp=oi.RemoveValueNotArray=oi.RemoveValueNestedArrayNotSupported=oi.InvalidScimRemoveValue=oi.InvalidScimPatch=oi.ScimError=void 0;var c1=class extends Error{static{o(this,"ScimError")}constructor(t){super(),this.scimCode=t}};oi.ScimError=c1;var sy=class extends c1{static{o(this,"InvalidScimPatch")}constructor(t,r="invalidSyntax"){super(r),this.message=`Invalid SCIM Patch: ${t}`}};oi.InvalidScimPatch=sy;var l1=class extends c1{static{o(this,"InvalidScimRemoveValue")}constructor(t,r="invalidSyntax"){super(r),this.message=`Invalid SCIM Remove Operation: ${t}`}};oi.InvalidScimRemoveValue=l1;var Dpe=class extends l1{static{o(this,"RemoveValueNestedArrayNotSupported")}constructor(){super("Invalid patch value, remove does not support arrays inside arrays.")}};oi.RemoveValueNestedArrayNotSupported=Dpe;var Ppe=class extends l1{static{o(this,"RemoveValueNotArray")}constructor(){super("Remove with patch value is supported only for array properties.")}};oi.RemoveValueNotArray=Ppe;var p1=class extends sy{static{o(this,"InvalidScimPatchOp")}constructor(t){super(`${t}`,"invalidSyntax")}};oi.InvalidScimPatchOp=p1;var Npe=class extends p1{static{o(this,"FilterOnEmptyArray")}constructor(t,r,n){super(`${t}`),this.attrName=r,this.valuePath=n}};oi.FilterOnEmptyArray=Npe;var Lpe=class extends p1{static{o(this,"FilterArrayTargetNotFound")}constructor(t,r,n,i){super(`${t}`),this.attrName=r,this.valuePath=n,this.schema=i}};oi.FilterArrayTargetNotFound=Lpe;var Upe=class extends sy{static{o(this,"NoPathInScimPatchOp")}constructor(){super('Missing path in "remove" patch operation',"noTarget")}};oi.NoPathInScimPatchOp=Upe;var Fpe=class extends sy{static{o(this,"InvalidScimPatchRequest")}constructor(t){super(`The SCIM patch request is invalid: ${t}`)}};oi.InvalidScimPatchRequest=Fpe;var Mpe=class extends sy{static{o(this,"NoTarget")}constructor(t){super(`Target location is a multi-valued attribute for which a value selection filter (${t}) has been supplied and no record match was made.`,"noTarget")}};oi.NoTarget=Mpe;var Bpe=class extends sy{static{o(this,"InvalidRemoveOpPath")}constructor(){super("Path specified in 'remove' operation doesn't exist")}};oi.InvalidRemoveOpPath=Bpe});var Yvt=x(Hf=>{"use strict";Object.defineProperty(Hf,"__esModule",{value:!0});Hf.parseExpression=Hf.parseFilter=Hf.Tokens=Hf.tokenizer=void 0;var Kvt={type:"EOT",literal:""};function lKr(e){let t=[],r=e,n=/^(?:(\s+)|(-?\d+(?:\.\d+)?(?:[eE][-+]?\d+)?(?![-\w._:\/\)\s]))|("(?:[^"\\]|\\.|\n)*")|([[()]|]\.?)|(\w[-\w._:\/%]*))/,i;for(;i=n.exec(r);){if(!(i[1]||i[0].length===0))if(i[2])t.push({literal:i[2],type:"Number"});else if(i[3]){let a=i[3].replace(/\\(?!")/g,"\\\\");t.push({literal:a,type:"Quoted"})}else i[4]?t.push({literal:i[4],type:"Bracket"}):i[5]&&t.push({literal:i[5],type:"Word"});r=r.substring(i.index+i[0].length)}if(r.length!==0)throw new Error(`unexpected token ${r}`);return t.push(Kvt),t}o(lKr,"tokenizer");Hf.tokenizer=lKr;var jpe=class{static{o(this,"Tokens")}getList(){return this.list.map((t,r)=>r==this.i?`[${t.literal}]`:t.literal)}peek(){return this.current||Kvt}constructor(t){this.list=t,this.i=0,this.current=this.list[this.i]}forward(){return this.current=this.list[++this.i],this}shift(){let t=this.peek();return this.forward(),t}};Hf.Tokens=jpe;var pKr=new Set(["eq","ne","co","sw","ew","gt","lt","ge","le"]),fKr=new Set(["pr"]);function qpe(e){return Z$(e6(e),e,Mw.LOWEST)}o(qpe,"parseFilter");Hf.parseFilter=qpe;function e6(e){let t=e.shift();if(t.literal=="("){let r=qpe(e),n=e.shift();if(n.literal!==")")throw new Error(`Unexpected token [${n.literal}(${n.type})] expected ')'`);return r}else if(t.literal.toLowerCase()=="not"){let r={op:"not",filter:e6(e)};return Z$(r,e,Mw.NOT)}else{if(t.type=="Word")return Qvt(t,e);throw new Error(`Unexpected token ${t.literal} (${t.type})`)}}o(e6,"parseExpression");Hf.parseExpression=e6;var Mw;(function(e){e[e.LOWEST=1]="LOWEST",e[e.OR=2]="OR",e[e.AND=3]="AND",e[e.NOT=4]="NOT"})(Mw||(Mw={}));var Hvt={or:Mw.OR,and:Mw.AND,not:Mw.NOT};function Z$(e,t,r){let n=t.peek().literal.toLowerCase(),i=Hvt[n];if(!i||r>=i)return e;let a=[e];for(;t.peek().literal.toLowerCase()===n;){let s=e6(t.forward()),u=t.peek().literal.toLowerCase();Hvt[u]>i&&(s=Z$(s,t,i)),a.push(s)}return Z$({op:n,filters:a},t,r)}o(Z$,"parseInxif");function Qvt(e,t){if(e.type!=="Word")throw new Error(`Unexpected token ${e.literal} expected Word`);let r=e.literal,n=t.shift(),i=n.literal.toLowerCase();if(pKr.has(i)){let a=dKr(t);return{op:i,attrPath:r,compValue:a}}else{if(fKr.has(i))return{op:i,attrPath:r};if(i==="["){let a=qpe(t),s=t.shift();if(s.literal[0]!=="]")throw new Error(`Unexpected token ${s.literal} expected ']'`);let u={op:"[]",attrPath:r,valFilter:a};if(s.literal[1]!=="."||t.peek().type!=="Word")return u;let c=t.shift();return c.literal=`${r}.${c.literal}`,{op:"and",filters:[u,Qvt(c,t)]}}else throw new Error(`Unexpected token ${r} ${n.literal} as valFilter operator`)}}o(Qvt,"readValFilter");function dKr(e){let t=e.shift();try{let r=JSON.parse(t.literal);if(r===null||typeof r=="string"||typeof r=="number"||typeof r=="boolean")return r;throw new Error(`${t.literal} is ${typeof r} (un supported value)`)}catch{throw new Error(`[${t.literal}(${t.type})] is not json`)}}o(dKr,"parseCompValue")});var Jvt=x(r6=>{"use strict";Object.defineProperty(r6,"__esModule",{value:!0});r6.Tester=void 0;var t6=class{static{o(this,"Tester")}constructor(){}test(t,r){switch(r.op){case"or":return r.filters.some(n=>this.test(t,n));case"and":return r.filters.every(n=>this.test(t,n));case"not":return!this.test(t,r.filter);case"[]":return this.attrTest(this.attrPath(r.attrPath),t,n=>this.test(n,r.valFilter));case"pr":return this.attrTest(this.attrPath(r.attrPath),t,n=>this[r.op](n));case"eq":case"ne":case"co":case"sw":case"ew":case"gt":case"lt":case"ge":case"le":return this.attrTest(this.attrPath(r.attrPath),t,n=>this[r.op](n,r.compValue))}}attrPath(t){let r=t.lastIndexOf(":");return r===-1?t.split("."):[t.substring(0,r),...t.substring(r+1).split(".")]}attrTest(t,r,n){if(t.length===0)return n(r);if(typeof r!="object"||r===null)return!1;if(Array.isArray(r))return r.some(s=>this.attrTest(t,s,n));let i=t[0].toLowerCase(),a=Object.keys(r).find(s=>s.toLowerCase()===i);return a===void 0?!1:this.attrTest(t.slice(1),r[a],n)}pr(t,r){return t!==void 0}eq(t,r){return t===r}ne(t,r){return t!==r}gt(t,r){return r!==null&&t>r}lt(t,r){return r!==null&&t<r}le(t,r){return r!==null&&t<=r}ge(t,r){return r!==null&&t>=r}sw(t,r){return r!==null&&t!==null&&t.toString().startsWith(r.toString())}ew(t,r){return r!==null&&t!==null&&t.toString().endsWith(r.toString())}co(t,r){return typeof t=="object"||r===null?t==r:(typeof t!="string"&&(t=t.toString()),t.indexOf(r.toString())!==-1)}};r6.Tester=t6;t6.UNDEF=Symbol("undefined")});var Xvt=x(Kf=>{"use strict";Object.defineProperty(Kf,"__esModule",{value:!0});Kf.log=Kf.valfilter=void 0;var mKr=o((e,t)=>{switch(t&&"attrPath"in e&&(e=Object.assign(Object.assign({},e),{attrPath:`${t}.${e.attrPath}`})),e.op){case"and":case"or":return Object.assign(Object.assign({},e),{filters:e.filters.map(r=>(0,Kf.valfilter)(r,t))});case"not":return Object.assign(Object.assign({},e),{filter:(0,Kf.valfilter)(e,t)});case"[]":return(0,Kf.valfilter)(e.valFilter,e.attrPath)}return e},"valfilter");Kf.valfilter=mKr;var hKr=o(e=>{switch(e.op){case"and":case"or":let t=e.filters.map(Kf.log),r=[];return t.forEach(n=>{n.op==e.op?n.filters.forEach(i=>r.push(i)):r.push(n)}),Object.assign(Object.assign({},e),{filters:r})}return e},"log");Kf.log=hKr});var Zvt=x(n6=>{"use strict";Object.defineProperty(n6,"__esModule",{value:!0});n6.stringify=void 0;function f1(e,t=!1){let r="";switch(e.op){case"eq":case"ne":case"co":case"sw":case"ew":case"gt":case"lt":case"ge":case"le":r=`${e.attrPath} ${e.op} ${JSON.stringify(e.compValue)}`;break;case"pr":r=`${e.attrPath} ${e.op}`;break;case"or":let n=e.filters.map(i=>f1(i)).join(` ${e.op} `);r=t?`(${n})`:n;break;case"and":r=e.filters.map(i=>f1(i,!0)).join(` ${e.op} `);break;case"not":r=`${e.op} (${f1(e.filter)})`;break;case"[]":r=`${e.attrPath}[${f1(e.valFilter)}]`;break}return r}o(f1,"stringify");n6.stringify=f1});var i6=x(fc=>{"use strict";Object.defineProperty(fc,"__esModule",{value:!0});fc.flatten=fc.parse=fc.filter=fc.Tester=fc.stringify=void 0;var $pe=Yvt(),gKr=Jvt(),ewt=Xvt(),yKr=Zvt();Object.defineProperty(fc,"stringify",{enumerable:!0,get:function(){return yKr.stringify}});fc.Tester=gKr.Tester;function bKr(e){let t=new fc.Tester;return r=>t.test(r,e)}o(bKr,"filter");fc.filter=bKr;function vKr(e){let t=new $pe.Tokens($pe.tokenizer(e)),r=$pe.parseFilter(t);if(t.peek().type!=="EOT")throw new Error(`unexpected EOT ${t.getList()}`);return r}o(vKr,"parse");fc.parse=vKr;function wKr(e){return ewt.log(ewt.valfilter(e))}o(wKr,"flatten");fc.flatten=wKr});var Xpe=x(_i=>{"use strict";Object.defineProperty(_i,"__esModule",{value:!0});_i.PATCH_OPERATION_SCHEMA=_i.InvalidScimRemoveValue=_i.RemoveValueNotArray=_i.RemoveValueNestedArrayNotSupported=_i.NoTarget=_i.InvalidScimPatchRequest=_i.NoPathInScimPatchOp=_i.InvalidScimPatchOp=_i.InvalidScimPatch=_i.ScimError=void 0;_i.patchBodyValidation=AKr;_i.scimPatch=TKr;var An=Vvt();Object.defineProperty(_i,"ScimError",{enumerable:!0,get:function(){return An.ScimError}});Object.defineProperty(_i,"InvalidScimPatch",{enumerable:!0,get:function(){return An.InvalidScimPatch}});Object.defineProperty(_i,"InvalidScimPatchOp",{enumerable:!0,get:function(){return An.InvalidScimPatchOp}});Object.defineProperty(_i,"NoPathInScimPatchOp",{enumerable:!0,get:function(){return An.NoPathInScimPatchOp}});Object.defineProperty(_i,"InvalidScimPatchRequest",{enumerable:!0,get:function(){return An.InvalidScimPatchRequest}});Object.defineProperty(_i,"NoTarget",{enumerable:!0,get:function(){return An.NoTarget}});Object.defineProperty(_i,"RemoveValueNestedArrayNotSupported",{enumerable:!0,get:function(){return An.RemoveValueNestedArrayNotSupported}});Object.defineProperty(_i,"RemoveValueNotArray",{enumerable:!0,get:function(){return An.RemoveValueNotArray}});Object.defineProperty(_i,"InvalidScimRemoveValue",{enumerable:!0,get:function(){return An.InvalidScimRemoveValue}});var Wpe=i6(),Gpe=vk(),Hpe=/(\[|\])/,EKr=/^(.+)\[(.+)\]$/,twt=/(?!\B"[^[]*)\.(?![^\]]*"\B)/g,_Kr=["remove","add","replace"],SKr="urn:ietf:params:scim:schemas:core:2.0:User",xKr="urn:ietf:params:scim:schemas:core:2.0:Group";_i.PATCH_OPERATION_SCHEMA="urn:ietf:params:scim:api:messages:2.0:PatchOp";function AKr(e){if(!e.schemas||!e.schemas.includes(_i.PATCH_OPERATION_SCHEMA))throw new An.InvalidScimPatchRequest("Missing schemas.");if(!Array.isArray(e.Operations))throw new An.InvalidScimPatchRequest("Operations should be an array.");if(!e.Operations||e.Operations.length<=0)throw new An.InvalidScimPatchRequest("Missing operations.");e.Operations.forEach(Kpe)}o(AKr,"patchBodyValidation");function TKr(e,t,r={mutateDocument:!0,treatMissingAsAdd:!0}){return r.mutateDocument||(e=JSON.parse(JSON.stringify(e))),t.reduce((n,i)=>{switch(i.op){case"remove":case"Remove":return RKr(n,i);case"add":case"Add":case"replace":case"Replace":return nwt(n,i,!!r.treatMissingAsAdd);default:throw new An.InvalidScimPatchRequest(`Operator is invalid for SCIM patch request. ${i}`)}},e)}o(TKr,"scimPatch");function Kpe(e){if(typeof e.op!="string"||!kKr(e.op))throw new An.InvalidScimPatchRequest(`Invalid op "${e.op}" in the request.`);if(e.op==="remove"&&!e.path)throw new An.NoPathInScimPatchOp;if(m1(e.op)&&!("value"in e))throw new An.InvalidScimPatchRequest(`The operation ${e.op} MUST contain a "value" member whose content specifies the value to be added`);if(e.path&&typeof e.path!="string")throw new An.InvalidScimPatchRequest("Path is supposed to be a string")}o(Kpe,"validatePatchOperation");function Qpe(e){let t=e.lastIndexOf(":");if(t<0)return e.split(twt);let r=e.substring(0,t),n=e.substring(t+1).split(twt);switch(r){case xKr:case SKr:break;default:n.unshift(r);break}return n}o(Qpe,"resolvePaths");function RKr(e,t){let r;Kpe(t);let n=Qpe(t.path);try{r=iwt(e,n,{isRemoveOp:!0})}catch(a){if(a instanceof An.InvalidRemoveOpPath)return e;throw a}let i=n[n.length-1];if(!Hpe.test(i)){for(let a of r)t.value?a[i]=CKr(a[i],t.value):delete a[i];return e}for(let a of r){let{attrName:s,valuePath:u,array:c}=Ype(i,a);a[s]=Jpe(c,u,{excludeIfMatchFilter:!0}),a[s].length===0&&delete a[s]}return e}o(RKr,"applyRemoveOperation");function nwt(e,t,r){var n;let i;if(Kpe(t),!t.path)return d1(e,t);let a=Qpe(t.path),s=a[a.length-1];try{i=iwt(e,a)}catch(u){if(u instanceof An.FilterOnEmptyArray||u instanceof An.FilterArrayTargetNotFound){let c=u.schema,l=(0,Wpe.parse)(u.valuePath);if(m1(t.op)&&"compValue"in l&&l.compValue!==void 0&&l.op==="eq"){let p={};return p[l.attrPath]=l.compValue,p[s]=d1(void 0,t,!0),c[u.attrName]=[...(n=c[u.attrName])!==null&&n!==void 0?n:[],p],e}else if(r&&zpe(t.op)&&"compValue"in l&&l.compValue!==void 0&&l.op==="eq")return nwt(e,Object.assign(Object.assign({},t),{op:"add"}),!1);throw new An.NoTarget(t.path)}throw u}if(!Hpe.test(s)){for(let u of i)u[s]=d1(u[s],t);return e}for(let u of i){let{valuePath:c,array:l}=Ype(s,u),p=Jpe(l,c);if(zpe(t.op)&&p.length===0)throw new An.NoTarget(t.path);for(let f=0;f<l.length;f++)p.includes(l[f])&&(l[f]=d1(l[f],t))}return e}o(nwt,"applyAddOrReplaceOperation");function Ype(e,t){let r=e.match(EKr);if(!r)throw new An.InvalidScimPatchOp(`This part of the path ${e} is invalid for SCIM patch request.`);let[,n,i]=r,a=t[n];if(!Array.isArray(a))throw new An.FilterOnEmptyArray("Impossible to search on a mono valued attribute.",n,i);return new Vpe(n,i,a)}o(Ype,"extractArray");function iwt(e,t,r={}){let n=[e];for(let i=0;i<t.length-1;i++){let a=t[i];Hpe.test(a)?n=n.flatMap(s=>{try{let{attrName:u,valuePath:c,array:l}=Ype(a,s),p=Jpe(l,c);if(p.length===0)throw new An.FilterArrayTargetNotFound("A matching array entry was not found using the supplied filter.",u,c,s);return p}catch(u){throw u instanceof An.FilterOnEmptyArray&&(u.schema=s),u}}):n=n.flatMap(s=>{if(!s[a]&&r.isRemoveOp)throw new An.InvalidRemoveOpPath;return s[a]||(s[a]={})})}return n}o(iwt,"navigate");function d1(e,t,r){if(Array.isArray(e)){if(Array.isArray(t.value)){if(m1(t.op)){let i=t.value.filter(a=>!rwt(e,a));return e.concat(i)}return t.value}if(zpe(t.op))return e.map(i=>d1(i,t,r));let n=e;return rwt(n,t.value)||n.push(t.value),n}return e!==null&&typeof e=="object"?IKr(e,t,r):t.value}o(d1,"addOrReplaceAttribute");function IKr(e,t,r){if(typeof t.value!="object"){if(m1(t.op)&&!r)throw new An.InvalidScimPatchOp("Invalid patch query.");return t.value}for(let[n,i]of Object.entries(t.value))OKr(e,Qpe(n),i,t.op);return e}o(IKr,"addOrReplaceObjectAttribute");function OKr(e,t,r,n){let i=t.length-1;for(let s=0;s<i;++s){let u=t[s];u in e||(e[u]={}),e=e[u]}let a=e[t[i]];if(m1(n)&&Array.isArray(a)){if(Array.isArray(r)){e[t[i]]=[...a,...r];return}e[t[i]]=[...a,r];return}e[t[i]]=r}o(OKr,"assign");function Jpe(e,t,r={}){try{let n=(0,Wpe.filter)((0,Wpe.parse)(t));return e.filter(i=>r.excludeIfMatchFilter?!n(i):n(i))}catch(n){throw new An.InvalidScimPatchOp(`${n}`)}}o(Jpe,"filterWithQuery");function CKr(e,t){if(!Array.isArray(e))throw new An.RemoveValueNotArray;return Array.isArray(t)?(t.forEach(r=>{if(Array.isArray(r))throw new An.RemoveValueNestedArrayNotSupported;e=e.filter(n=>!Gpe(r,n))}),e):e.filter(r=>!Gpe(t,r))}o(CKr,"removeWithPatchValue");function rwt(e,t){return e.some(r=>Gpe(t,r))}o(rwt,"deepIncludes");function kKr(e){return _Kr.includes(e.toLowerCase())}o(kKr,"isValidOperation");function m1(e){return e!==void 0&&e.toLowerCase()==="add"}o(m1,"isAddOperation");function zpe(e){return e!==void 0&&e.toLowerCase()==="replace"}o(zpe,"isReplaceOperation");var Vpe=class{static{o(this,"ScimSearchQuery")}constructor(t,r,n){this.attrName=t,this.valuePath=r,this.array=n}}});function owt(e,t){let r=e.request.query[t];if(r!==void 0)return+r}function DKr(e){let t=e.Operations.find(r=>(r.op==="Replace"||r.op==="replace")&&r.path==="active");return t?t.value===!1||t.value?.toLowerCase?.()==="false":!1}var o6,awt,swt,uwt,cwt,Zpe,lwt=v(()=>{"use strict";o6=te(Xpe());or();Ap();X();o(owt,"tryGetQueryAsNumber");awt=o(async e=>{let t=owt(e,"pageSize")??20,r=owt(e,"startIndex"),n;e.request.query.filter&&(n=oa.user.userFilters(e.request.query.filter));let i=await pc.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(oa.user.toScimUserResponse),startIndex:(r||0)+1,itemsPerPage:t}},"get"),swt=o(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404);let r=await pc.find(t);e.body=oa.user.toScimUserResponse(r)},"find"),uwt=o(async e=>{let t=oa.user.fromScimUser(e.request.body);try{let r=await pc.create(t);e.body=oa.user.toScimUserResponse(r)}catch(r){throw r instanceof bf&&e.throw(409,"Email already in use"),r}},"create");o(DKr,"isDeactivation");cwt=o(async e=>{let t=await pc.find(e.params.id);t||e.throw(404);let r=oa.user.toScimUserResponse(t),n=e.request.body;try{(0,o6.patchBodyValidation)(n)}catch{}if(DKr(n))return Zpe(e);let i;try{i=(0,o6.scimPatch)(r,n.Operations)}catch{}i||e.throw(500);let a=oa.user.fromScimUser(i);await pc.update(a,{allowChangingEmail:!0}),e.body=oa.user.toScimUserResponse(a)},"update"),Zpe=o(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404),await pc.remove(t),e.status=204},"remove")});function fwt(e,t){for(let r of t.split(","))delete e[r]}var pwt,a6,s6,dwt,mwt,hwt,gwt,ywt,bwt=v(()=>{"use strict";pwt=te(require("lodash/groupBy"));Ze();a6=te(Xpe());or();s6=te(i6());o(fwt,"cleanResponse");dwt=o(async e=>{let r=(await Pn.fetch()).filter(a=>a.scimInfo?.isSync).map(oa.group.toScimGroupResponse),{filter:n,excludedAttributes:i}=e.request.query;if(n){let a=(0,s6.filter)((0,s6.parse)(n));r=r.filter(a)}i&&r.forEach(a=>{fwt(a,i)}),e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:r.length,Resources:r,startIndex:1,itemsPerPage:r.length}},"get"),mwt=o(async e=>{let t=oa.group.fromScimGroup(e.request.body),r=await n1.create(t);e.body=oa.group.toScimGroupResponse(r)},"create"),hwt=o(async e=>{let{id:t}=e.params,r=await Pn.get(t),n=oa.group.toScimGroupResponse(r),{excludedAttributes:i}=e.request.query;i&&fwt(n,i),e.body=n},"find"),gwt=o(async e=>{let{id:t}=e.params,r=await Pn.get(t);await Pn.remove(t,r._rev),e.status=204},"remove"),ywt=o(async e=>{let{id:t}=e.params,r=await Pn.get(t),n=oa.group.toScimGroupResponse(r),i=e.request.body;try{(0,a6.patchBodyValidation)(i)}catch{e.throw(400)}let{true:a,false:s}=(0,pwt.default)(i.Operations,u=>u.path==="members");if(s?.length){let u=(0,a6.scimPatch)(n,s);u||e.throw(500);let c={...oa.group.fromScimGroup(u),_rev:r._rev};await Pn.save(c)}if(a?.length){let u=[],c=[];for(let{op:l,value:p}of a)switch(l){case"add":case"Add":for(let f of p)u.push(await pc.find(f.value));break;case"remove":case"Remove":for(let f of p)c.push(await pc.find(f.value));break;case"replace":case"Replace":throw new Error("Replacing members is not allowed");default:ar.unreachable(l)}u.length&&await Pn.addUsers(t,u.map(l=>l._id)),c.length&&await Pn.removeUsers(t,c.map(l=>l._id))}e.body=oa.group.toScimGroupResponse(await Pn.get(t))},"update")});var vwt,dc,wwt,Ewt=v(()=>{"use strict";vwt=te(require("@koa/router"));s1();lwt();bwt();H();dc=new vwt.default({prefix:"/api/global/scim/v2"});dc.use(Ipe);dc.use(Rpe);dc.get("/users",awt);dc.get("/users/:id",i1("id"),swt);dc.post("/users",uwt);dc.patch("/users/:id",i1("id"),cwt);dc.delete("/users/:id",i1("id"),Zpe);dc.get("/groups",dwt);dc.post("/groups",uo.requireFeature("userGroups"),mwt);dc.get("/groups/:id",uo.requireFeature("userGroups"),o1("id"),hwt);dc.delete("/groups/:id",uo.requireFeature("userGroups"),o1("id"),gwt);dc.patch("/groups/:id",uo.requireFeature("userGroups"),o1("id"),ywt);wwt=dc});async function _wt(e){let{userId:t,appId:r}=e.params,n=await ey.db.getUser(t);if(Pt.isGlobalBuilder(n)){e.body={message:"User already admin - no permissions updated."};return}await ey.addAppBuilder(n,r),e.body={message:`User "${n.email}" app builder access updated.`}}async function Swt(e){let{userId:t,appId:r}=e.params,n=await ey.db.getUser(t);if(Pt.isGlobalBuilder(n)){e.body={message:"User already admin - no permissions removed."};return}await ey.removeAppBuilder(n,r),e.body={message:`User "${n.email}" app builder access removed.`}}var xwt=v(()=>{"use strict";X();Ap();o(_wt,"addAppBuilder");o(Swt,"removeAppBuilder")});var Awt,Twt,Rwt,Iwt=v(()=>{"use strict";Awt=te(require("@koa/router"));xwt();s1();H();X();Twt=new Awt.default;Twt.post("/api/global/users/:userId/app/:appId/builder",vt.builderOrAdmin,uo.requireFeatures("appBuilders"),_wt).delete("/api/global/users/:userId/app/:appId/builder",vt.builderOrAdmin,uo.requireFeatures("appBuilders"),Swt);Rwt=Twt});var h1={};ae(h1,{appBackups:()=>Gvt,auditLogs:()=>Dvt,environmentVariables:()=>Svt,groups:()=>fvt,scim:()=>wwt,users:()=>Rwt});var Owt=v(()=>{"use strict";dvt();xvt();Pvt();zvt();Ewt();Iwt()});var efe={};ae(efe,{fromScimUser:()=>jKr,toScimUserResponse:()=>FKr,userFilters:()=>qKr});function BKr(e){if(jt.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}var Cwt,UKr,FKr,MKr,jKr,qKr,kwt=v(()=>{"use strict";H();Cwt=te(i6());X();Ze();({unreachable:UKr}=ar),FKr=o(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(a=>a).join(" "),familyName:e.lastName,givenName:e.firstName}),i},"toScimUserResponse"),MKr=o(e=>!!e?.id,"isScimUserResponse");o(BKr,"tryGetEmail");jKr=o(e=>{let t=MKr(e)?e:void 0,r=BKr(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:UKr(e.active)}let i,a;return e.name?.givenName?(i=e.name?.givenName,a=e.name?.familyName):i=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:i,lastName:a,scimInfo:{...e,isSync:!0},roles:{},status:n?"active":"inactive",createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimUser"),qKr=o(e=>{let t={equal:{}},r=(0,Cwt.parse)(e);function n(i){switch(i.op){case"eq":{let a=i.attrPath,s;switch(a){case"emails.value":s="email";break;default:s=`scimInfo.${a}`}t.equal[s]=i.compValue;break}case"and":for(let a of i.filters)n(a);break;default:console.warn("Filter not handled",{filter:i})}}return o(n,"parseFilters"),n(r),t},"userFilters")});var tfe={};ae(tfe,{fromScimGroup:()=>GKr,toScimGroupResponse:()=>$Kr});var $Kr,WKr,GKr,Dwt=v(()=>{"use strict";$Kr=o(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"),WKr=o(e=>!!e?.id,"isScimGroup"),GKr=o(e=>{let t=WKr(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 oa={};ae(oa,{group:()=>tfe,user:()=>efe});var Pwt=v(()=>{"use strict";kwt();Dwt()});function zKr(e){if(e.length>64)throw new Error("Tool name must be under 64 characters long");return e.replace(/[^a-zA-Z0-9_-]/g,"_")}function rfe(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"}var nfe=v(()=>{"use strict";H();o(zKr,"sanitiseToolName");o(rfe,"normalizeContentType")});function ife(e,t){return t.map(r=>e[r]).join(" ")}var uy,Qf,g1=v(()=>{"use strict";H();b1();Ze();y1();uy=te(require("dd-trace"));o(ife,"extractTextFromColumns");Qf=class{static{o(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 uy.default.trace("prompt",async()=>{let r=typeof t=="string"?new Ao().addUserMessage(t):t,{messages:n,tokensUsed:i}=await uy.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 uy.default.trace("chat",async()=>await this.chatCompletion(t))}async*chatStream(t){yield*this.chatCompletionStream(t)}async summarizeText(t){return uy.default.trace("summarizeText",()=>this.prompt(u6(t)))}async generateCronExpression(t){return uy.default.trace("generateCronExpression",()=>this.prompt(sfe(t)))}async operation(t,r){return uy.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:a,language:s,categories:u,prompt:c}=t;switch(n){case"SUMMARISE_TEXT":return u6(ife(r,a));case"CLEAN_DATA":return afe(r[i]);case"TRANSLATE":return ufe(r[i],s);case"CATEGORISE_TEXT":if(!u)throw Error("No categories provided for categorise text operation. Please provide categories.");return ofe(ife(r,a),u.split(","));case"SENTIMENT_ANALYSIS":return cfe(r[i]);case"PROMPT":return c;case"SEARCH_WEB":return lfe(ife(r,a));default:throw ar.unreachable(n)}}async generateJs(t,r){return await uy.default.trace("generateJs",async()=>{let{bindings:n=[],snippets:i=[]}=r||{};return await this.prompt(pfe(n,i).addUserMessage(t))})}}});function c6(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}function Nwt(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}var l6,ffe,Lwt,hl,DA=v(()=>{"use strict";l6=te(require("openai"));g1();H();ffe=require("openai/helpers/zod");nfe();Lwt=(n=>(n.GPT_5_MINI="gpt-5-mini",n.GPT_5="gpt-5",n.GPT_5_NANO="gpt-5-nano",n))(Lwt||{});o(c6,"parseResponseFormat");o(Nwt,"calculateBudibaseAICredits");hl=class extends Qf{constructor(r){super(r);this.client=this.getClient(r)}static{o(this,"OpenAI")}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new l6.default({apiKey:r.apiKey})}async uploadFile(r,n,i){let a=rfe(i);if(aN.includes(a.toLowerCase())){let c;if(Buffer.isBuffer(r))c=r;else{let p=[];for await(let f of r)p.push(new Uint8Array(f));c=Buffer.concat(p)}let l=c.toString("base64");return`data:${a};base64,${l}`}let s=await(0,l6.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:c6(r.format)};Object.values(Lwt).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(ffe.zodFunction));let i=await this.client.chat.completions.create(n),a=i?.choices?.[0]?.message;if(a?.tool_calls){r.addMessage(a);let s=[];for(let u of a.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 p=JSON.parse(u.function.arguments);s.push(l.handler(p).then(f=>({role:"tool",tool_call_id:u.id,content:f})).catch(f=>(console.error(`[OPENAI TOOL ERROR] Tool ${c} failed in OpenAI handler:`,f),{role:"tool",tool_call_id:u.id,content:`Error: ${f.message}`})))}return r.addMessages(await Promise.all(s)),this.chatCompletion(r)}else{if(a?.content)return{messages:[...r.messages,{role:a.role,content:a.content}],tokensUsed:Nwt(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:c6(r.format),stream:!0};r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(ffe.zodFunction));try{let i=await this.client.chat.completions.create(n),a=null,s="",u=null;for await(let l of i){let p=l?.choices?.[0]?.delta;if(p){if(p.content&&(s+=p.content,yield{type:"content",content:p.content}),p.tool_calls&&p.tool_calls.length>0){let f=p.tool_calls[0];f.id?(a={id:f.id,name:f.function?.name||"",arguments:f.function?.arguments||""},yield{type:"tool_call_start",toolCall:{id:a.id,name:a.name,arguments:a.arguments}}):a&&f.function?.arguments&&(a.arguments+=f.function.arguments,yield{type:"tool_call_start",toolCall:{id:a.id,name:a.name,arguments:a.arguments}})}l.usage&&(u=l.usage)}}let c=u?Nwt(u):0;if(a){r.addMessage({role:"assistant",content:"",tool_calls:[{id:a.id,type:"function",function:{name:a.name,arguments:a.arguments}}]});let l=r.findTool(a.name);if(l)try{let p=JSON.parse(a.arguments),f=await l.handler(p);yield{type:"tool_call_result",toolResult:{id:a.id,result:f}},r.addMessage({role:"tool",tool_call_id:a.id,content:f}),yield*this.chatCompletionStream(r);return}catch(p){yield{type:"tool_call_result",toolResult:{id:a.id,result:`Error: ${p.message}`,error:p.message}},r.addMessage({role:"tool",tool_call_id:a.id,content:`Error: ${p.message}`}),yield*this.chatCompletionStream(r);return}else{let p=`Tool '${a.name}' not found`;yield{type:"tool_call_result",toolResult:{id:a.id,result:p,error:p}},r.addMessage({role:"tool",tool_call_id:a.id,content:p}),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 dfe,p6,Uwt=v(()=>{"use strict";DA();X();H();uA();Vue();g1();dfe=require("dd-trace"),p6=class extends Qf{static{o(this,"BudibaseAI")}async prompt(t){let r=await super.prompt(t);return r.tokensUsed&&await M4(r.tokensUsed),r}async chat(t){let r=await super.chat(t);return r.tokensUsed&&await M4(r.tokensUsed),r}async uploadFile(t,r,n){return K.SELF_HOSTED?this.uploadFileSelfHost(t,r,n):this.uploadFileCloud(t,r,n)}async uploadFileCloud(t,r,n){return new hl({apiKey:K.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).uploadFile(t,r,n)}async uploadFileSelfHost(t,r,n){let i;if(Buffer.isBuffer(t))i=t;else{let c=[];for await(let l of t)c.push(new Uint8Array(l));i=Buffer.concat(c)}let a=i.toString("base64");if(n&&aN.includes(n.toLowerCase()))return`data:image/jpeg;base64,${a}`;if(!K.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let c=await P4();if(!c)throw new Error("No license key found");this._apiKey=c}let s=await fetch(`${K.BUDICLOUD_URL}/api/ai/upload-file`,{method:"POST",headers:{"Content-Type":"application/json",[ur.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:a,filename:r,contentType:n})});if(!s.ok)throw await Ie.fromResponse(s);return(await s.json()).fileId}async chatCompletion(t){return K.SELF_HOSTED?this.chatCompletionSelfHost(t):this.chatCompletionCloud(t)}async chatCompletionCloud(t){return await dfe.tracer.trace("chatCompletionCloud",async()=>await new hl({apiKey:K.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletion(t))}async chatCompletionSelfHost(t){return await dfe.tracer.trace("chatCompletionSelfHost",async r=>{if(!K.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(r.addTags({budicloudUrl:K.BUDICLOUD_URL}),!this._apiKey){let a=await P4();if(!a)throw new Error("No license key found");this._apiKey=a,r.addTags({licenseKey:this._apiKey})}let n={messages:t.messages,format:t.format,useTools:t.tools.length>0},i=await fetch(`${K.BUDICLOUD_URL}/api/ai/chat`,{method:"POST",headers:{"Content-Type":"application/json",[ur.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(n)});if(!i.ok)throw await Ie.fromResponse(i);return await i.json()})}async*chatCompletionStream(t){K.SELF_HOSTED?yield*this.chatCompletionStreamSelfHost(t):yield*this.chatCompletionStreamCloud(t)}async*chatCompletionStreamCloud(t){yield*new hl({apiKey:K.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletionStream(t)}async*chatCompletionStreamSelfHost(t){try{let r=await this.chatCompletionSelfHost(t);if(r.messages.length>0){let n=r.messages[r.messages.length-1];n.content&&(yield{type:"content",content:n.content})}yield{type:"done",messages:r.messages,tokensUsed:r.tokensUsed}}catch(r){yield{type:"error",content:r.message}}}}});function VKr(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}var mfe,f6,Fwt=v(()=>{"use strict";mfe=te(require("@anthropic-ai/sdk"));g1();o(VKr,"calculateBudibaseAICredits");f6=class extends Qf{constructor(r){super(r);this.client=new mfe.default({apiKey:r.apiKey})}static{o(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:a})=>{if(a==null)return{role:"user",content:""};if(typeof a=="string")return{role:"user",content:a};let s="";for(let u of a)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:VKr(n.usage)}}catch(n){throw n instanceof mfe.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 Mwt=v(()=>{"use strict";DA();Fwt()});var Bwt,d6,jwt=v(()=>{"use strict";DA();Bwt=require("openai"),d6=class extends hl{static{o(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 Bwt.AzureOpenAI({apiKey:t.apiKey,apiVersion:"2024-10-01-preview",baseURL:t.baseUrl})}}});async function KKr(){return await v1.tracer.trace("getAIConfig",async e=>{let t={type:"ai",config:{}};if(!F.isSelfHostUsingCloud()){let n=await Pi.getAIConfig();n&&(t=n)}await Zue(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||Wwt,apiKey:r.apiKey,baseUrl:r.baseUrl}})}async function QKr(){return v1.tracer.trace("getSelfHostOpenAIKeyConfig",e=>{if(!K.SELF_HOSTED){e.addTags({enabled:!1,reason:"not self host"});return}if(!K.OPENAI_API_KEY){e.addTags({enabled:!1,reason:"no OPENAI_API_KEY"});return}return e.addTags({enabled:!0}),{provider:"OpenAI",model:Wwt,apiKey:K.OPENAI_API_KEY}})}async function hfe(){return v1.tracer.trace("getLLMConfig",async()=>await KKr()||await QKr())}async function w1(e){return await v1.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:n}=e||{},i=await hfe();if(!i){t.addTags({enabled:!1,reason:"no config found"});return}r&&(i.model=r),n&&(i.maxTokens=n);let a=HKr[i.provider];if(!a){t.addTags({enabled:!1,reason:"no provider found",provider:i.provider});return}return new a(i)})}async function Gwt(){let e=await w1();if(!e)throw new Ie("No available LLM configurations",500);return e}var v1,qwt,$wt,Wwt,HKr,Ao,y1=v(()=>{"use strict";X();H();DA();Uwt();v1=require("dd-trace");Mwt();tce();qwt=require("zod"),$wt=require("openai/helpers/zod");jwt();Wwt="gpt-5-mini",HKr={OpenAI:hl,TogetherAI:hl,AzureOpenAI:d6,Custom:hl,Anthropic:f6,BudibaseAI:p6};o(KKr,"getAIConfig");o(QKr,"getSelfHostOpenAIKeyConfig");o(hfe,"getLLMConfig");o(w1,"getLLM");o(Gwt,"getLLMOrThrow");Ao=class e{constructor(){this.messages=[];this.tools=[]}static{o(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 qwt.z.ZodType?this.format=(0,$wt.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}}});function u6(e,t){let r=`Summarize this text:
|
|
587
|
+
`).length,t=o(r=>(...n)=>{Pw()||console[r](...n),n.forEach((a,s)=>{typeof a=="object"&&(n[s]=JSON.stringify(a))});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:z$(js,sandboxContext),logs};return`{{${AA} js_result-${JSON.stringify(res)}}}`}catch(e){ipe&&ipe(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===ay.code)return ay.message;if(e.code===Ip.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"}}var nbt,z$,e1,ibt,ipe,ope,n7r,i7r,o7r,V$=v(()=>{"use strict";TA();QD();W$();npe();G$();nbt=te(require("lodash/fp/cloneDeep"));YD();e1=o(e=>z$=e,"setJSRunner"),ibt=o(()=>{z$=void 0},"removeJSRunner"),ope=o(e=>ipe=e,"setOnErrorLog"),n7r=o(e=>{if(!e||typeof e!="string")return e;let t=/\[+(.+)]+/,r=e.match(t);return r&&r[1]?r[1]:e},"removeSquareBrackets"),i7r=o(e=>e==="snippets"||e==="helpers"||e.startsWith("snippets.")||e.startsWith("helpers."),"isReservedKey"),o7r=o((e,t)=>{if(i7r(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[n7r(i)]}),n)},"getContextValue");o(obt,"processJS")});function s7r(e){return e==null||typeof e!="object"?!1:e.toString()==="[object Object]"||e.length>0&&typeof e[0]=="object"}function abt(){return Object.values(Dw).concat(j$,Zle)}function ape(e){for(let t of u7r)t.register(e)}function sbt(e){ape(e),jyt(e)}var H$,a7r,u7r,K$=v(()=>{"use strict";_mt();H$=te(LD());qyt();V$();QD();W$();a7r={"<":"<",">":">"};o(s7r,"isObject");u7r=[new Nm(Dw.OBJECT,e=>new H$.default.SafeString(JSON.stringify(e))),new Nm(Dw.JS,obt,!1),new Nm(Dw.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 Nm(Dw.ALL,(e,t)=>{let{__opts:r}=t;if(s7r(e))return new H$.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 H$.default.SafeString(n.replace(/&/g,"&")),n==null||typeof n!="string"?n:n.replace(/[<>]/g,i=>a7r[i]||i)}),new Nm(Dw.LITERAL,e=>{if(e===void 0)return"";let t=typeof e,r=t==="object"?JSON.stringify(e):e;return`{{${AA} ${t}-${r}}}`})];o(abt,"HelperNames");o(ape,"registerMinimum");o(sbt,"registerAll")});var ubt,RA,cbt,lbt=v(()=>{"use strict";K$();TA();ubt=["#","else","/"],RA=class{static{o(this,"Preprocessor")}constructor(t,r){this.name=t,this.fn=r}process(t,r,n){let i=this.fn(r,n),a=t.indexOf(r);return rpe(t,a,r.length,i)}},cbt=[new RA("swap-to-dot-notation",e=>{let t=e.indexOf("["),r=0;for(;t!==-1;){zyt(e.charAt(t-1))&&(e=rpe(e,t+r,1,".[")),r=t+1;let n=e.substring(r+1).indexOf("[");t=n>0?r+1+n:-1}return e}),new RA("fix-functions",e=>{for(let t of ubt){let r=`{ ${t}`,n=`{${t}`;e=e.replace(new RegExp(r,"g"),n)}return e}),new RA("normalize-spaces",e=>e.replace(/{{(\s{2,})/g,"{{ ")),new RA("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 a=i.split(" ")[0];for(let u of ubt)if(a.includes(u))return e;let s=a.trim().toLowerCase();return n&&!t?.disabledHelpers?.includes(s)&&abt().some(u=>s===u.toLowerCase())&&(i=`(${i})`),`{{ all ${i} }}`})]});var spe,upe,pbt=v(()=>{"use strict";QD();spe=class{static{o(this,"Postprocessor")}constructor(t,r){this.name=t,this.fn=r}process(t){return this.fn(t)}},upe=[new spe("convert-literals",e=>{if(typeof e!="string"||!e.includes(AA))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 cpe(e,t,r){let n=[];for(let i of t){if(typeof e!="string")break;let a=new RegExp(JD),s=e.match(a);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}}function fbt(e,t){let r=cbt;return t.noFinalise&&(r=r.filter(n=>n.name!=="finalise")),cpe(e,r,t).result}function dbt(e){return cpe(e,upe).result}function mbt(e){return cpe(e,upe)}var hbt=v(()=>{"use strict";TA();lbt();pbt();o(cpe,"process");o(fbt,"preprocess");o(dbt,"postprocess");o(mbt,"postprocessWithLogs")});var gbt=v(()=>{"use strict";K$()});function wbt(e){try{JSON.stringify(e)}catch{throw"Unable to process inputs to JSON, cannot recurse"}}function d7r(e){return e?Object.keys(e).filter(r=>p7r.includes(r)):[]}function m7r(e,t,r){t={...f7r,...t};let n=!t?.noHelpers,i=`${e}-${JSON.stringify(t)}`;if(t.cacheTemplates&&lpe[i])return lpe[i];let a=n?d7r(r):[];if(e=fbt(e,{...t,disabledHelpers:a}),r&&n&&a.length>0)for(let c of fl(e))e=e.replace(c,Vyt(c,a,"./"));t.noEscaping&&(e=g7r(e));let u=(t.noHelpers?vbt:fpe).compile(e,{strict:!1});return lpe[i]=u,u}async function Q$(e,t,r){wbt(e);for(let n of Object.keys(e||{}))if(e[n]!=null){let i=e[n],a=i;typeof i=="string"?a=await IA(e[n],t,r):typeof i=="object"&&(a=await Q$(e[n],t,r)),e[n]=a}return e}async function IA(e,t,r){return Li(e,t,r)}function t1(e,t,r){wbt(e);for(let n of Object.keys(e||{})){let i=e[n];typeof i=="string"?e[n]=Li(e[n],t,r):typeof i=="object"&&(e[n]=t1(e[n],t,r))}return e}function h7r(e,t,r){let n=e;if(typeof e!="string")throw new Error("Cannot process non-string types.");function i(a){let s=m7r(a,r,t),u=Math.floor(Date.now()/1e3)*1e3,c=s({now:new Date(u).toISOString(),__opts:{...r,input:a},...t});return r?.logging?mbt(c):dbt(c)}o(i,"process");try{if(r&&r.onlyFound){let a=[],s=fl(e);for(let u of s){let c=i(u);typeof c=="object"&&"result"in c?(a=a.concat(c.logs||[]),e=e.replace(u,c.result)):e=e.replace(u,c)}return r?.logging?{result:e,logs:a}:e}else return i(e)}catch(a){let{noThrow:s=!0}=r||{};if(s)return n;throw a}}function Li(e,t,r){return h7r(e,t,{...r,logging:!1})}function g7r(e){let t=Gyt(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}function Y$(e){return r1(e)!=null}function r1(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:q$(r[1])}function Ebt(e,t){let r=new RegExp(JD),n=e.match(r);if(n==null)return!1;for(let i of n){let a=i;Y$(i)&&(a=r1(i));let s=!0;for(let u of t)a.includes(u)||(s=!1);if(s)return!0}return!1}function fl(e){if(!e||typeof e!="string")return[];let t=new RegExp(tpe),r=e.match(t);return r??[]}function y7r(){let e=Pw()?bbt.default:ybt.default;e1((t,r)=>{e.createContext(r);let n=$$(t),i=e.runInNewContext(n,r);if(i.error)throw new Ip(i.error);return i.result})}function b7r(){XD()?ibt():y7r()}var ybt,bbt,ppe,fpe,p7r,vbt,f7r,lpe,So=v(()=>{"use strict";ybt=te(kft()),bbt=te(require("vm")),ppe=te(LD());K$();hbt();TA();gbt();V$();G$();YD();YD();W$();TA();V$();npe();G$();fpe=(0,ppe.create)();sbt(fpe);p7r=Object.keys(fpe.helpers),vbt=(0,ppe.create)();ape(vbt);f7r={noHelpers:!1,cacheTemplates:!1,noEscaping:!1,escapeNewlines:!1,noFinalise:!1};o(wbt,"testObject");o(d7r,"findOverlappingHelpers");lpe={};o(m7r,"createTemplate");o(Q$,"processObject");o(IA,"processString");o(t1,"processObjectSync");o(h7r,"processStringSyncInternal");o(Li,"processStringSync");o(g7r,"disableEscaping");o(Y$,"isJSBinding");o(r1,"decodeJSBinding");o(Ebt,"doesContainStrings");o(fl,"findHBSBlocks");o(y7r,"browserJSSetup");o(b7r,"defaultJSSetup");b7r()});function dpe(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||v7r,e.endDate=e.endDate||w7r),e}async function _bt(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(n=>J.getProdWorkspaceID(n)));let t={};function r(n,i){i?.length&&(t.oneOf={...t.oneOf,[n]:i})}return o(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=dpe(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}function mpe(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}function hpe(e){let t=fl(e);for(let r of t){let n=` "${r}"`;e=e.replace(e.includes(n)?n:` ${r}`,""),e=Li(e,{})}return e}function Sbt(e,t){let r=bE[e];if(!r)throw new Error("No friendly name found.");let n=Li(r,t);return n.includes('""')&&(n=hpe(r)),n}var v7r,w7r,xbt=v(()=>{"use strict";X();So();H();v7r=ur.MIN_VALID_DATE.toISOString(),w7r=ur.MAX_VALID_DATE.toISOString();o(dpe,"fillDates");o(_bt,"getSearchFilters");o(mpe,"deleted");o(hpe,"removeTemplateStrings");o(Sbt,"getEventFriendlyName")});async function E7r(e,t,r){if(!await U4()||!jt.isAudited(e))return;let n=Sbt(e,t),i=new Date;r?.timestamp&&(i=new Date(r.timestamp));let a={timestamp:i.toISOString(),event:e,name:n,userId:r?.userId||Jve,metadata:{...t,...r?.hostInfo}},s={};try{if(r?.appId){a.appId=J.getProdWorkspaceID(r.appId);let u=await Ct.workspace.getWorkspaceMetadata(r.appId);"name"in u&&(s.appName=u.name)}if(r?.userId){let u=await Pt.getById(r?.userId);s.email=u.email}}catch(u){Dt.logAlert("Failed to retrieve fallback information for audit log",u)}return a.fallback=s,await Tft(a)}async function _7r(e){let t=e.map(u=>u.userId),n=e.filter(u=>u.appId).map(u=>J.getDevWorkspaceID(u.appId)),i=await Pt.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),a=await J.getWorkspacesByIDs([...new Set(n)]),s=[];for(let u of e){let c=i.find(f=>f?._id===u.userId),l=a.find(f=>J.isSameWorkspaceID(f?.appId,u.appId)),p={event:u.event,timestamp:u.timestamp,name:u.name,metadata:u.metadata,user:c||mpe(u.userId,"user",u.fallback)};u.appId&&(p.app=l||mpe(u.appId,"app",u.fallback)),s.push(p)}return s}async function S7r(e){if(!await U4())throw new Error("Audit logs not available - license required.");let t=await _bt(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await Ece(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await _7r(r.rows)}}function x7r(e){return e=dpe(e),Rft(e)}function A7r(){let e=Object.entries(bE).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=hpe(r[1]);return t}var Abt=v(()=>{"use strict";X();H();Ift();al();xbt();o(E7r,"write");o(_7r,"enrich");o(S7r,"fetch");o(x7r,"download");o(A7r,"definitions")});var Nw={};ae(Nw,{definitions:()=>A7r,download:()=>x7r,fetch:()=>S7r,write:()=>E7r});var Tbt=v(()=>{"use strict";Abt()});var gpe={};ae(gpe,{roleCheck:()=>R7r});function T7r(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}async function R7r(e,t){return await Rm()||T7r(e,t),e}var Rbt=v(()=>{"use strict";al();o(T7r,"removeRoles");o(R7r,"roleCheck")});var ype={};ae(ype,{assign:()=>I7r,unAssign:()=>O7r});async function I7r(e,t){if(!await Rm())throw new Error("Unable to assign roles - license required.");let r=await sl.bulkGet(e);for(let n of r){if(t.role&&t.role.roleId){let i=J.getProdWorkspaceID(t.role.appId);n.roles[i]=t.role.roleId}if(t.appBuilder){let i=J.getProdWorkspaceID(t.appBuilder.appId),a=n.builder?.apps||[];n.builder={apps:a.concat([i])}}t.builder&&(n.builder={global:!0}),t.admin&&(n.admin={global:!0}),n.roles}await sl.bulkUpdate(r)}async function O7r(e,t){if(!await Rm())throw new Error("Unable to un-assign roles - license required.");let r=await sl.bulkGet(e);for(let n of r){if(t.role){let i=J.getProdWorkspaceID(t.role?.appId);n.roles[i]===t.role.roleId&&delete n.roles[i]}if(t.appBuilder&&n.builder?.apps){let i=J.getProdWorkspaceID(t.appBuilder.appId);n.builder.apps=n.builder.apps.filter(a=>a!==i)}t.builder&&n.builder&&delete n.builder,t.admin&&n.admin&&delete n.admin}}var Ibt=v(()=>{"use strict";X();al();ED();o(I7r,"assign");o(O7r,"unAssign")});var bpe={};ae(bpe,{buildExportFn:()=>k7r,buildImportFn:()=>C7r});function C7r(e){return async(t,r)=>{await Rm()||t.throw(403,"Endpoint unavailable, license required."),t.request.files?.appExport||t.throw(400,"Must provide app export file for import."),await F.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}function k7r(e){return async(t,r)=>{await Rm()||t.throw(403,"Endpoint unavailable, license required.");let{encryptPassword:n,excludeRows:i}=t.request.body;await F.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:n,excludeRows:i},t.query.appId=t.params.appId,await e(t),await r()})}}var Obt=v(()=>{"use strict";X();al();o(C7r,"buildImportFn");o(k7r,"buildExportFn")});var vpe={};ae(vpe,{applications:()=>bpe,roles:()=>ype,users:()=>gpe});var Cbt=v(()=>{"use strict";Rbt();Ibt();Obt()});function Dbt(){kbt=new Fa.BudibaseQueue(Fa.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}function Lw(){return kbt}var kbt,J$=v(()=>{"use strict";X();o(Dbt,"init");o(Lw,"getBackupQueue")});async function wpe(e,t={}){return ol.storeAppBackupMetadata(e,t)}function Lbt(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}}}async function P7r(e,t,r,n){let i=await X$(e);return await ol.storeAppBackupMetadata({...i,...Lbt(t),contents:r,status:t,type:"backup"},{filename:n,docId:e})}async function N7r(e,t,r){let n=await X$(e);return await ol.storeAppBackupMetadata({...n,...Lbt(r),status:r,type:"restore",trigger:"manual"},{docId:e,docRev:t})}async function X$(e){return ol.getAppBackupMetadata(e)}async function L7r(e,t){return ol.updateAppBackupMetadata(e,t)}async function Ubt(e){let t=await ol.getAppBackupMetadata(e);return t.filename&&await qe.deleteFile(qe.ObjectStoreBuckets.BACKUPS,t.filename),ol.deleteAppBackupMetadata(e)}async function U7r(e){let t=[];for(let r of e)try{await Ubt(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}async function F7r(e,t){return ol.fetchAppBackups(e,t)}async function Fbt(e){let t=await ol.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let r=await qe.getReadStream(qe.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}async function M7r(e){let{stream:t}=await Fbt(e),r=(0,Nbt.join)(qe.budibaseTempDir(),jt.newid()),n=Pbt.default.createWriteStream(r);return new Promise((i,a)=>{t.on("error",a),n.on("error",a),t.pipe(n).on("close",()=>i(r))})}async function B7r(e,t,r={}){let n;try{n=await wpe({appId:e,trigger:t,timestamp:new Date().toISOString(),status:"pending",type:"backup",...r})}catch(i){if(i.status===409)return;throw i}return await Lw().add({docId:n.id,docRev:n.rev,appId:e,export:{trigger:t,...r}}),await Oe.backup.appBackupTriggered(e,n.id,"backup",t,r?.name),n.id}async function j7r(e,t,r,n){let i=await X$(t),a;try{a=await wpe({appId:e,timestamp:new Date().toISOString(),status:"pending",type:"restore",createdBy:n})}catch(s){if(s?.status===409)return;throw s}return await Lw().add({appId:e,docId:a.id,docRev:a.rev,import:{nameForBackup:r,backupId:t,createdBy:n}}),{restoreId:a.id,metadata:i}}async function q7r(e,t,r){let n=J.getProdWorkspaceID(e);await F.doInWorkspaceContext(n,async()=>{let i=F.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 Ct.workspace.invalidateWorkspaceMetadata(s.appId,s))})}var Pbt,Nbt,$7r,dl,Epe=v(()=>{"use strict";X();H();Pbt=te(require("fs")),Nbt=require("path");Tm();al();J$();o(wpe,"storeAppBackupMetadata");o(Lbt,"getTimestamps");o(P7r,"updateBackupStatus");o(N7r,"updateRestoreStatus");o(X$,"getAppBackup");o(L7r,"updateAppBackup");o(Ubt,"deleteAppBackup");o(U7r,"deleteAppBackups");o(F7r,"fetchAppBackups");o(Fbt,"getBackupDownloadStream");o(M7r,"downloadAppBackup");o(B7r,"triggerAppBackup");o(j7r,"triggerAppRestore");o(q7r,"trackBackupError");$7r={isEnabled:Que,triggerAppRestore:zs(j7r),triggerAppBackup:zs(B7r),getBackupDownloadStream:zs(Fbt),downloadAppBackup:zs(M7r),fetchAppBackups:zs(F7r),storeAppBackupMetadata:zs(wpe),updateBackupStatus:zs(P7r),updateRestoreStatus:zs(N7r),getAppBackup:zs(X$),updateAppBackup:zs(L7r),deleteAppBackup:zs(Ubt),deleteAppBackups:zs(U7r),trackBackupError:zs(q7r)},dl=$7r});var Spe={};ae(Spe,{init:()=>_pe});async function _pe(e){Lw().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),z7r(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),G7r(t,e)}catch(n){Dt.logAlert(`Failed to perform backup for app ID: ${r.appId}`,n)}})}async function W7r(e){await J.getDB(e,{skip_setup:!0}).destroy()}async function Mbt(e,t,r,n){let i=J.getDevWorkspaceID(r),a=J.getProdWorkspaceID(r),s=new Date().toISOString(),u=o(async(c,l)=>{n?.doc?await dl.updateBackupStatus(n.doc.id,c,l?.contents,l?.filename):await dl.storeAppBackupMetadata({appId:a,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),p=`${a}/backup-${s}.tar.gz`,f=qe.ObjectStoreBuckets.BACKUPS,d=OA.default.createReadStream(c);await qe.streamUpload({bucket:f,filename:p,stream:d,extra:{type:"application/gzip",metadata:{name:n?.name,trigger:e,timestamp:s,appId:a}}}),await u("complete",{filename:p,contents:l}),OA.default.existsSync(c)&&OA.default.rmSync(c)}catch(c){Dt.logAlert("App backup error",c),await u("failed");let l=n?.doc?.id||`backup-${s}`,p=c instanceof Error?c.message:String(c);await dl.trackBackupError(a,l,`Backup export failed: ${p}`)}}async function G7r(e,t){let r=e.data,n=r.appId,i=r.import.backupId,a=r.import.nameForBackup,s=r.import.createdBy,u=ot.getTenantIDFromWorkspaceID(n);return ot.doInTenant(u,async()=>{let c=J.getDevWorkspaceID(n),l=`${c}_temp_${Date.now()}`,{rev:p}=await dl.updateRestoreStatus(r.docId,r.docRev,"started");await Mbt("restoring",u,n,{processing:t,createdBy:s,name:a});let f=await dl.downloadAppBackup(i),d="complete";try{await t.importAppFn(l,J.getDB(l),{file:{type:"application/gzip",path:f},key:f}),await W7r(c),await new J.Replication({source:l,target:c}).replicate()}catch(m){Dt.logAlert("App restore error",m),d="failed";let h=m instanceof Error?m.message:String(m);await dl.trackBackupError(n,i,`Backup restore failed: ${h}`)}finally{try{await J.getDB(l,{skip_setup:!0}).destroy()}catch{}}await dl.updateRestoreStatus(r.docId,p,d),OA.default.existsSync(f)&&OA.default.rmSync(f,{force:!0})})}async function z7r(e,t){let r=e.data,n=r.appId,i=r.export.trigger,a=r.export.name,s=ot.getTenantIDFromWorkspaceID(n);await ot.doInTenant(s,async()=>{try{let{rev:u}=await dl.updateBackupStatus(r.docId,"started");return Mbt(i,s,n,{processing:t,doc:{id:r.docId,rev:u},name:a})}catch(u){Dt.logAlert("App backup error",u);let c=u instanceof Error?u.message:String(u);await dl.trackBackupError(n,r.docId,`Backup export failed: ${c}`)}})}var OA,Bbt=v(()=>{"use strict";X();H();OA=te(require("fs"));Epe();J$();o(_pe,"init");o(W7r,"removeExistingApp");o(Mbt,"runBackup");o(G7r,"importProcessor");o(z7r,"exportProcessor")});var V7r,Qa,xpe=v(()=>{"use strict";Epe();Bbt();J$();V7r=o(async e=>{Dbt(),await _pe(e.processing)},"init"),Qa={...dl,processing:Spe,init:V7r,getBackupQueue:Lw}});var Ape,jbt=v(()=>{"use strict";xpe();Ape=o(async e=>{e.backups&&await Qa.init(e.backups)},"init")});var pc={};ae(pc,{create:()=>Q7r,find:()=>K7r,get:()=>H7r,remove:()=>J7r,update:()=>Y7r});async function H7r(e){let t=ot.getGlobalDB(),r=new J.QueryBuilder(t.name,"user");r.setIndexBuilder(J.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[i,a]of Object.entries(e.filters?.equal??{}))r.addEqual(i,a);r.setSort("_id"),r.setSkip(e.skip);let n=await r.run();return{users:n.rows,total:n.totalRows}}async function K7r(e){return await Pt.getById(e)}async function Q7r(e){let t=await sl.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new Ie("User is already synched",409);e={...t,scimInfo:(0,qbt.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await sl.save(e,{requirePassword:!1})}async function Y7r(e,t){return await sl.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}async function J7r(e){return await sl.destroy(e)}var qbt,$bt=v(()=>{"use strict";qbt=te(require("lodash/fp/merge"));X();ED();H();o(H7r,"get");o(K7r,"find");o(Q7r,"create");o(Y7r,"update");o(J7r,"remove")});var n1={};ae(n1,{create:()=>X7r});async function X7r(e){let t=await pue(e.name),r;if(!t)r=(await Pn.save(e)).id;else{if(t.scimInfo?.isSync)throw new Ie("Group is already synched",409);r=t._id,t.users&&(await Pn.removeUsers(r,t.users.map(i=>i._id)),delete t.users),t.scimInfo=(0,Wbt.default)(t.scimInfo,e.scimInfo),await Pn.save(t)}return await Pn.get(r)}var Wbt,Gbt=v(()=>{"use strict";Wbt=te(require("lodash/fp/merge"));v4();Ap();X();o(X7r,"create")});var CA={};ae(CA,{logRequest:()=>Z7r,logResponse:()=>eKr});async function Z7r(e){Dt.logWarn("SCIM request log",e)}async function eKr(e){Dt.logWarn("SCIM response error",e)}var zbt=v(()=>{"use strict";X();o(Z7r,"logRequest");o(eKr,"logResponse")});var Tpe=v(()=>{"use strict";$bt();Gbt();zbt()});var xo={};ae(xo,{ai:()=>ece,auditLogs:()=>Nw,automations:()=>ty,backups:()=>Qa,branding:()=>bD,environmentVariables:()=>Tp,features:()=>ao,groups:()=>Pn,init:()=>Ape,licensing:()=>oc,logger:()=>CA,plugins:()=>wce,publicApi:()=>vpe,quotas:()=>an,scimGroups:()=>n1,scimUsers:()=>pc,users:()=>ey,utils:()=>hD});var Ap=v(()=>{"use strict";Upt();tce();tA();uA();ED();dft();al();q4();bft();Sft();Tbt();Cbt();xpe();Lue();jbt();Tpe()});var tKr,Vbt,Hbt=v(()=>{"use strict";hue();X();Ap();H();tKr=o((e={checkUsersLimit:!0})=>async(t,r)=>{if((e.licensingCheck?e.licensingCheck:()=>!!t.user)(t)){if(K.SELF_HOSTED&&K.DEFAULT_LICENSE)return t.user.license=mue,r();t.user.license=await oc.cache.getCachedLicense(t,{populateLicense:e.populateLicense,populateFreeLicense:e.populateFreeLicense}),e.checkUsersLimit&&(jt.isServingApp(t)||jt.isServingBuilder(t)||jt.isServingBuilderPreview(t)||jt.isPublicApiRequest(t))&&await an.usageLimitIsExceeded({name:"users",type:"static",usageChange:0})}return r()},"licensing"),Vbt=tKr});var uo={};ae(uo,{requireFeature:()=>rKr,requireFeatures:()=>nKr});var rKr,nKr,Kbt=v(()=>{"use strict";al();rKr=o(e=>async(t,r)=>{await L4(e),await r()},"requireFeature"),nKr=o((...e)=>async(t,r)=>{await Kue(e),await r()},"requireFeatures")});var Rpe,Qbt=v(()=>{"use strict";X();Tpe();Rpe=o(async(e,t)=>(K.DISABLE_SCIM_CALLS||await CA.logRequest({...e.request.toJSON(),body:e.request.body}),await F.doInScimContext(async()=>{let r=await t();return await CA.logResponse({...e.response.toJSON(),body:e.response.body}),r})),"doInScimContext")});var Ipe,Ybt=v(()=>{"use strict";al();Ipe=o(async(e,t)=>{await Xue(),await t()},"requireSCIM")});function Ope(e,t,r){return async(n,i)=>{let a=n.params[t];return typeof a!="string"&&n.throw(404),!!(await e(a)).scimInfo?.isSync!==r&&n.throw(404),i()}}var i1,o1,a1,Jbt=v(()=>{"use strict";X();Tm();i1=o(e=>Ope(Pt.getById,e,!0),"scimUserOnly"),o1=o(e=>Ope(Ni.get,e,!0),"scimGroupOnly"),a1=o(e=>Ope(Ni.get,e,!1),"internalGroupOnly");o(Ope,"scimSyncChecks")});async function kpe(e,t){await Cpe.tracer.trace("licenseAuth",async r=>{let n=e.request.headers[ur.Header.LICENSE_KEY];Array.isArray(n)&&(n=n[0]),r.addTags({licenseKey:n}),n||e.throw(403,"License key not provided");let i=await $ue(n);i||(r.addTags({licenseFound:!1}),e.throw(403,"License not found or invalid")),i.tenantId||e.throw(403,"License does not have a tenant ID"),Cpe.tracer.setUser({id:"anonymous",tenantId:i.tenantId}),await F.doInSelfHostTenantUsingCloud(i.tenantId,async()=>{await F.doInLicenseContext(i,async()=>{await t()})})})}var Cpe,Xbt=v(()=>{"use strict";X();tA();Cpe=require("dd-trace");o(kpe,"default")});var kA={};ae(kA,{doInScimContext:()=>Rpe,feature:()=>uo,internalGroupOnly:()=>a1,licenseAuth:()=>kpe,licensing:()=>Vbt,requireSCIM:()=>Ipe,scimGroupOnly:()=>o1,scimUserOnly:()=>i1});var s1=v(()=>{"use strict";Hbt();Kbt();Qbt();Ybt();Jbt();Xbt()});async function Zbt(e){let t=e.request.body;if(t.name=t.name.trim(),delete t.roles,t._id){let n=await Zg(t._id);t.roles=n.roles,t.scimInfo=n.scimInfo}let r=await cA(t);e.body={_id:r.id,_rev:r.rev}}async function evt(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,a;r&&(i=await j4(t,r)),n&&(a=await cce(t,n)),e.body={added:i,removed:a}}async function tvt(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 lce(t,{appsToAdd:r,appsToRemove:n})}async function rvt(e){e.body={data:await wD()}}async function nvt(e){let{groupId:t,rev:r}=e.params;try{await uce(t,r),e.body={message:"Group deleted successfully"}}catch(n){e.throw(n.status,n)}}async function ivt(e){try{e.body=await Zg(e.params.groupId)}catch(t){e.throw(t.status,t)}}async function ovt(e){let{pageSize:t=10,bookmark:r,emailSearch:n}=e.request.query,i=e.params.groupId,a={limit:t+1},s=await b4(i,{...a,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}}async function avt(e){let{groupId:t,appId:r}=e.params;await pce(t,r),e.body={message:"Group app builder access updated."}}async function svt(e){let{groupId:t,appId:r}=e.params;await fce(t,r),e.body={message:"group app builder access removed."}}async function uvt(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 Hx.jsonFromCsvString(r,{allowSingleColumn:!0});(!n||n.length===0)&&e.throw(400,"CSV file is invalid");let a=Object.keys(n[0]).find(f=>/^(email|e-mail|email address|mail|e_mail)$/i.test(f.trim()));a||e.throw(400,"CSV file must contain an email column");let s=Array.from(new Set(n.map(f=>f[a]).filter(f=>f&&typeof f=="string"&&f.trim().length>0).map(f=>f.trim())));s.length===0&&e.throw(400,"No valid email addresses found in CSV");try{await Zg(t)}catch(f){if(f.status===404)e.throw(404,"Group not found");else throw f}let u=[],c=[],l=[],p=await Promise.all(s.map(f=>sl.getUserByEmail(f)));for(let f of s){let d=p.find(m=>m?.email===f);d?(u.push({_id:d._id,email:d.email}),l.push(d._id)):c.push({email:f,reason:"User not found"})}l.length>0&&await j4(t,l),e.body={added:u,skipped:c}}var cvt=v(()=>{"use strict";q4();v4();ED();X();o(Zbt,"save");o(evt,"updateGroupUsers");o(tvt,"updateGroupApps");o(rvt,"fetch");o(nvt,"destroy");o(ivt,"find");o(ovt,"searchUsers");o(avt,"addAppBuilder");o(svt,"removeAppBuilder");o(uvt,"bulkAddUsersFromCsv")});function oKr(){return vt.joiValidator.body(Hs.default.object({_id:Hs.default.string().optional(),_rev:Hs.default.string().optional(),color:Hs.default.string().required(),icon:Hs.default.string().required(),name:Hs.default.string().trim().required().max(50),role:Hs.default.string().optional(),users:Hs.default.array().optional(),apps:Hs.default.array().optional(),roles:Hs.default.object().optional(),createdAt:Hs.default.string().optional(),updatedAt:Hs.default.string().optional()}).required())}var lvt,Hs,pvt,fvt,dvt=v(()=>{"use strict";cvt();lvt=te(require("@koa/router")),Hs=te(require("joi"));s1();H();X();pvt=new lvt.default;o(oKr,"buildGroupSaveValidation");pvt.post("/api/global/groups",vt.adminOnly,uo.requireFeature("userGroups"),oKr(),Zbt).get("/api/global/groups",uo.requireFeature("userGroups"),rvt).delete("/api/global/groups/:groupId/:rev",uo.requireFeature("userGroups"),vt.adminOnly,a1("groupId"),nvt).get("/api/global/groups/:groupId",uo.requireFeature("userGroups"),vt.builderOrAdmin,ivt).get("/api/global/groups/:groupId/users",uo.requireFeature("userGroups"),vt.builderOrAdmin,ovt).post("/api/global/groups/:groupId/users",vt.adminOnly,uo.requireFeature("userGroups"),a1("groupId"),evt).post("/api/global/groups/:groupId/users/bulk",vt.adminOnly,uo.requireFeature("userGroups"),a1("groupId"),vt.joiValidator.body(Hs.default.object({csvContent:Hs.default.string().required()}).required()),uvt).post("/api/global/groups/:groupId/apps",vt.builderOrAdmin,uo.requireFeature("userGroups"),tvt).post("/api/global/groups/:groupId/app/:appId/builder",vt.builderOrAdmin,uo.requireFeatures("userGroups","appBuilders"),avt).delete("/api/global/groups/:groupId/app/:appId/builder",vt.builderOrAdmin,uo.requireFeatures("userGroups","appBuilders"),svt);fvt=pvt});async function mvt(e){e.body={encryptionKeyAvailable:Tp.isEncryptionKeyAvailable()}}async function hvt(e){e.body={variables:await Tp.fetch()}}async function gvt(e){let{name:t,production:r,development:n}=e.request.body;await Tp.update(t,{production:r,development:n});let i=["production"];r!==n&&i.push("development"),await Oe.environmentVariable.created(t,i),e.body={message:`Environment variable "${t}" created.`}}async function yvt(e){let{production:t,development:r}=e.request.body,n=e.params.varName;await Tp.update(n,{production:t,development:r}),e.body={message:`Environment variable "${n}" updated.`}}async function bvt(e){let t=e.params.varName;await Tp.remove(t),await Oe.environmentVariable.deleted(t),e.body={message:`Environment variable "${t}" deleted.`}}var vvt=v(()=>{"use strict";X();H();Ap();o(mvt,"status");o(hvt,"fetch");o(gvt,"create");o(yvt,"update");o(bvt,"destroy")});function wvt(){return vt.joiValidator.body(u1.default.object({name:u1.default.string().optional(),production:u1.default.string().required(),development:u1.default.string().required()}))}var Evt,u1,_vt,Svt,xvt=v(()=>{"use strict";vvt();X();Evt=te(require("@koa/router")),u1=te(require("joi")),_vt=new Evt.default;o(wvt,"buildEnvVarUpdateValidator");_vt.get("/api/env/variables/status",vt.builderOrAdmin,mvt).get("/api/env/variables",vt.builderOrAdmin,hvt).post("/api/env/variables",vt.builderOrAdmin,wvt(),gvt).patch("/api/env/variables/:varName",vt.builderOrAdmin,wvt(),yvt).delete("/api/env/variables/:varName",vt.builderOrAdmin,bvt);Svt=_vt});async function Avt(e){let t=e.request.body,r=await Nw.fetch(t);await Oe.auditLog.filtered(t),e.body=r}async function Tvt(e){let t=e.request.body,{stream:r}=Nw.download(t);await Oe.auditLog.downloaded(t),e.attachment(`audit-logs-${Date.now()}.log`),e.body=r}async function Rvt(e){e.body={events:Nw.definitions()}}var Ivt=v(()=>{"use strict";Ap();X();o(Avt,"search");o(Tvt,"download");o(Rvt,"definitions")});function Ovt(){return vt.joiValidator.body(ml.default.object({userIds:ml.default.array().items(ml.default.string()).optional(),appIds:ml.default.array().items(ml.default.string()).optional(),events:ml.default.array().items(ml.default.string().valid(...Object.values(zr))).optional(),startDate:ml.default.string().optional().allow(""),endDate:ml.default.string().optional().allow(""),fullSearch:ml.default.string().optional().allow(""),bookmark:ml.default.number()}))}var Cvt,ml,kvt,Dvt,Pvt=v(()=>{"use strict";Ivt();H();X();Cvt=te(require("@koa/router")),ml=te(require("joi"));o(Ovt,"buildAuditLogSearchValidator");kvt=new Cvt.default;kvt.post("/api/global/auditlogs/search",vt.adminOnly,Ovt(),Avt).get("/api/global/auditlogs/download",vt.adminOnly,Qn.querystringToBody,Ovt(),Tvt).get("/api/global/auditlogs/definitions",vt.adminOnly,Rvt);Dvt=kvt});async function Uw(e,t){t||e.throw(400,"App ID missing"),await hD.workspaceExists(t)||e.throw(400,`Provided app ID: ${t} - is invalid.`)}async function Nvt(e){let t=e.params.appId;await Uw(e,t);let{body:r}=e.request,n=e.user?._id,i=await Qa.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."}}async function Lvt(e){let t=e.params.appId;await Uw(e,t);let r=e.params.backupId,n=e.request.body.name,i=await Qa.triggerAppRestore(t,r,n,e.user?._id);i||e.throw(500,"Unable to start restore."),await Oe.backup.appBackupRestored(i.metadata),e.body={restoreId:i?.restoreId,message:"Restore triggered - process starting."}}async function Uvt(e){let t=e.params.appId;await Uw(e,t);let r=e.params.backupId;await Qa.deleteAppBackup(r),e.body={message:"Backup deleted successfully."}}async function Fvt(e){let t=F.getWorkspaceId();await Uw(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 Qa.deleteAppBackups(r),i=n.filter(s=>s.success).length,a=n.length-i;e.body={message:`${i} backups deleted successfully${a>0?`, ${a} failed`:""}.`,results:n,successCount:i,failureCount:a}}async function Mvt(e){let t=e.params.appId;await Uw(e,t);let r=e.request.body;r?.trigger&&(r.trigger=r.trigger.toLowerCase(),Object.values(oh).includes(r.trigger)||e.throw(400,"Provided trigger is not a valid option.")),e.body=await Qa.fetchAppBackups(t,{paginate:!0,...r})}async function Bvt(e){let t=e.params.appId;await Uw(e,t);let r=e.params.backupId,n=e.request.body;e.body=await Qa.updateAppBackup(r,n.name)}async function jvt(e){let t=e.params.appId;await Uw(e,t);let r=e.params.backupId,{metadata:n,stream:i}=await Qa.getBackupDownloadStream(r);e.attachment(`backup-${n.timestamp}.tar.gz`),e.body=i}var qvt=v(()=>{"use strict";X();H();Ap();o(Uw,"checkAppID");o(Nvt,"manualBackup");o(Lvt,"importBackup");o(Uvt,"deleteBackup");o(Fvt,"deleteBackups");o(Mvt,"fetchBackups");o(Bvt,"updateBackup");o(jvt,"downloadBackup")});function cKr(){return vt.joiValidator.body(Fw.default.object({trigger:Fw.default.string().valid(...Object.values(oh)),type:Fw.default.string().valid(...Object.values(VT)),startDate:Fw.default.date(),endDate:Fw.default.date(),page:Fw.default.string()}))}var $vt,Fw,Wvt,Gvt,zvt=v(()=>{"use strict";X();H();$vt=te(require("@koa/router")),Fw=te(require("joi"));qvt();Wvt=new $vt.default;o(cKr,"validateBackupSearch");Wvt.post("/api/apps/:appId/backups",vt.builderOrAdmin,Nvt).post("/api/apps/:appId/backups/search",vt.builderOrAdmin,cKr(),Mvt).get("/api/apps/:appId/backups/:backupId/file",vt.builderOrAdmin,jvt).patch("/api/apps/:appId/backups/:backupId",vt.builderOrAdmin,Bvt).delete("/api/apps/:appId/backups/:backupId",vt.builderOrAdmin,Uvt).delete("/api/apps/:appId/backups",vt.builderOrAdmin,Fvt).post("/api/apps/:appId/backups/:backupId/import",vt.builderOrAdmin,Lvt);Gvt=Wvt});var Vvt=x(oi=>{"use strict";Object.defineProperty(oi,"__esModule",{value:!0});oi.InvalidRemoveOpPath=oi.NoTarget=oi.InvalidScimPatchRequest=oi.NoPathInScimPatchOp=oi.FilterArrayTargetNotFound=oi.FilterOnEmptyArray=oi.InvalidScimPatchOp=oi.RemoveValueNotArray=oi.RemoveValueNestedArrayNotSupported=oi.InvalidScimRemoveValue=oi.InvalidScimPatch=oi.ScimError=void 0;var c1=class extends Error{static{o(this,"ScimError")}constructor(t){super(),this.scimCode=t}};oi.ScimError=c1;var sy=class extends c1{static{o(this,"InvalidScimPatch")}constructor(t,r="invalidSyntax"){super(r),this.message=`Invalid SCIM Patch: ${t}`}};oi.InvalidScimPatch=sy;var l1=class extends c1{static{o(this,"InvalidScimRemoveValue")}constructor(t,r="invalidSyntax"){super(r),this.message=`Invalid SCIM Remove Operation: ${t}`}};oi.InvalidScimRemoveValue=l1;var Dpe=class extends l1{static{o(this,"RemoveValueNestedArrayNotSupported")}constructor(){super("Invalid patch value, remove does not support arrays inside arrays.")}};oi.RemoveValueNestedArrayNotSupported=Dpe;var Ppe=class extends l1{static{o(this,"RemoveValueNotArray")}constructor(){super("Remove with patch value is supported only for array properties.")}};oi.RemoveValueNotArray=Ppe;var p1=class extends sy{static{o(this,"InvalidScimPatchOp")}constructor(t){super(`${t}`,"invalidSyntax")}};oi.InvalidScimPatchOp=p1;var Npe=class extends p1{static{o(this,"FilterOnEmptyArray")}constructor(t,r,n){super(`${t}`),this.attrName=r,this.valuePath=n}};oi.FilterOnEmptyArray=Npe;var Lpe=class extends p1{static{o(this,"FilterArrayTargetNotFound")}constructor(t,r,n,i){super(`${t}`),this.attrName=r,this.valuePath=n,this.schema=i}};oi.FilterArrayTargetNotFound=Lpe;var Upe=class extends sy{static{o(this,"NoPathInScimPatchOp")}constructor(){super('Missing path in "remove" patch operation',"noTarget")}};oi.NoPathInScimPatchOp=Upe;var Fpe=class extends sy{static{o(this,"InvalidScimPatchRequest")}constructor(t){super(`The SCIM patch request is invalid: ${t}`)}};oi.InvalidScimPatchRequest=Fpe;var Mpe=class extends sy{static{o(this,"NoTarget")}constructor(t){super(`Target location is a multi-valued attribute for which a value selection filter (${t}) has been supplied and no record match was made.`,"noTarget")}};oi.NoTarget=Mpe;var Bpe=class extends sy{static{o(this,"InvalidRemoveOpPath")}constructor(){super("Path specified in 'remove' operation doesn't exist")}};oi.InvalidRemoveOpPath=Bpe});var Yvt=x(Hf=>{"use strict";Object.defineProperty(Hf,"__esModule",{value:!0});Hf.parseExpression=Hf.parseFilter=Hf.Tokens=Hf.tokenizer=void 0;var Kvt={type:"EOT",literal:""};function lKr(e){let t=[],r=e,n=/^(?:(\s+)|(-?\d+(?:\.\d+)?(?:[eE][-+]?\d+)?(?![-\w._:\/\)\s]))|("(?:[^"\\]|\\.|\n)*")|([[()]|]\.?)|(\w[-\w._:\/%]*))/,i;for(;i=n.exec(r);){if(!(i[1]||i[0].length===0))if(i[2])t.push({literal:i[2],type:"Number"});else if(i[3]){let a=i[3].replace(/\\(?!")/g,"\\\\");t.push({literal:a,type:"Quoted"})}else i[4]?t.push({literal:i[4],type:"Bracket"}):i[5]&&t.push({literal:i[5],type:"Word"});r=r.substring(i.index+i[0].length)}if(r.length!==0)throw new Error(`unexpected token ${r}`);return t.push(Kvt),t}o(lKr,"tokenizer");Hf.tokenizer=lKr;var jpe=class{static{o(this,"Tokens")}getList(){return this.list.map((t,r)=>r==this.i?`[${t.literal}]`:t.literal)}peek(){return this.current||Kvt}constructor(t){this.list=t,this.i=0,this.current=this.list[this.i]}forward(){return this.current=this.list[++this.i],this}shift(){let t=this.peek();return this.forward(),t}};Hf.Tokens=jpe;var pKr=new Set(["eq","ne","co","sw","ew","gt","lt","ge","le"]),fKr=new Set(["pr"]);function qpe(e){return Z$(e6(e),e,Mw.LOWEST)}o(qpe,"parseFilter");Hf.parseFilter=qpe;function e6(e){let t=e.shift();if(t.literal=="("){let r=qpe(e),n=e.shift();if(n.literal!==")")throw new Error(`Unexpected token [${n.literal}(${n.type})] expected ')'`);return r}else if(t.literal.toLowerCase()=="not"){let r={op:"not",filter:e6(e)};return Z$(r,e,Mw.NOT)}else{if(t.type=="Word")return Qvt(t,e);throw new Error(`Unexpected token ${t.literal} (${t.type})`)}}o(e6,"parseExpression");Hf.parseExpression=e6;var Mw;(function(e){e[e.LOWEST=1]="LOWEST",e[e.OR=2]="OR",e[e.AND=3]="AND",e[e.NOT=4]="NOT"})(Mw||(Mw={}));var Hvt={or:Mw.OR,and:Mw.AND,not:Mw.NOT};function Z$(e,t,r){let n=t.peek().literal.toLowerCase(),i=Hvt[n];if(!i||r>=i)return e;let a=[e];for(;t.peek().literal.toLowerCase()===n;){let s=e6(t.forward()),u=t.peek().literal.toLowerCase();Hvt[u]>i&&(s=Z$(s,t,i)),a.push(s)}return Z$({op:n,filters:a},t,r)}o(Z$,"parseInxif");function Qvt(e,t){if(e.type!=="Word")throw new Error(`Unexpected token ${e.literal} expected Word`);let r=e.literal,n=t.shift(),i=n.literal.toLowerCase();if(pKr.has(i)){let a=dKr(t);return{op:i,attrPath:r,compValue:a}}else{if(fKr.has(i))return{op:i,attrPath:r};if(i==="["){let a=qpe(t),s=t.shift();if(s.literal[0]!=="]")throw new Error(`Unexpected token ${s.literal} expected ']'`);let u={op:"[]",attrPath:r,valFilter:a};if(s.literal[1]!=="."||t.peek().type!=="Word")return u;let c=t.shift();return c.literal=`${r}.${c.literal}`,{op:"and",filters:[u,Qvt(c,t)]}}else throw new Error(`Unexpected token ${r} ${n.literal} as valFilter operator`)}}o(Qvt,"readValFilter");function dKr(e){let t=e.shift();try{let r=JSON.parse(t.literal);if(r===null||typeof r=="string"||typeof r=="number"||typeof r=="boolean")return r;throw new Error(`${t.literal} is ${typeof r} (un supported value)`)}catch{throw new Error(`[${t.literal}(${t.type})] is not json`)}}o(dKr,"parseCompValue")});var Jvt=x(r6=>{"use strict";Object.defineProperty(r6,"__esModule",{value:!0});r6.Tester=void 0;var t6=class{static{o(this,"Tester")}constructor(){}test(t,r){switch(r.op){case"or":return r.filters.some(n=>this.test(t,n));case"and":return r.filters.every(n=>this.test(t,n));case"not":return!this.test(t,r.filter);case"[]":return this.attrTest(this.attrPath(r.attrPath),t,n=>this.test(n,r.valFilter));case"pr":return this.attrTest(this.attrPath(r.attrPath),t,n=>this[r.op](n));case"eq":case"ne":case"co":case"sw":case"ew":case"gt":case"lt":case"ge":case"le":return this.attrTest(this.attrPath(r.attrPath),t,n=>this[r.op](n,r.compValue))}}attrPath(t){let r=t.lastIndexOf(":");return r===-1?t.split("."):[t.substring(0,r),...t.substring(r+1).split(".")]}attrTest(t,r,n){if(t.length===0)return n(r);if(typeof r!="object"||r===null)return!1;if(Array.isArray(r))return r.some(s=>this.attrTest(t,s,n));let i=t[0].toLowerCase(),a=Object.keys(r).find(s=>s.toLowerCase()===i);return a===void 0?!1:this.attrTest(t.slice(1),r[a],n)}pr(t,r){return t!==void 0}eq(t,r){return t===r}ne(t,r){return t!==r}gt(t,r){return r!==null&&t>r}lt(t,r){return r!==null&&t<r}le(t,r){return r!==null&&t<=r}ge(t,r){return r!==null&&t>=r}sw(t,r){return r!==null&&t!==null&&t.toString().startsWith(r.toString())}ew(t,r){return r!==null&&t!==null&&t.toString().endsWith(r.toString())}co(t,r){return typeof t=="object"||r===null?t==r:(typeof t!="string"&&(t=t.toString()),t.indexOf(r.toString())!==-1)}};r6.Tester=t6;t6.UNDEF=Symbol("undefined")});var Xvt=x(Kf=>{"use strict";Object.defineProperty(Kf,"__esModule",{value:!0});Kf.log=Kf.valfilter=void 0;var mKr=o((e,t)=>{switch(t&&"attrPath"in e&&(e=Object.assign(Object.assign({},e),{attrPath:`${t}.${e.attrPath}`})),e.op){case"and":case"or":return Object.assign(Object.assign({},e),{filters:e.filters.map(r=>(0,Kf.valfilter)(r,t))});case"not":return Object.assign(Object.assign({},e),{filter:(0,Kf.valfilter)(e,t)});case"[]":return(0,Kf.valfilter)(e.valFilter,e.attrPath)}return e},"valfilter");Kf.valfilter=mKr;var hKr=o(e=>{switch(e.op){case"and":case"or":let t=e.filters.map(Kf.log),r=[];return t.forEach(n=>{n.op==e.op?n.filters.forEach(i=>r.push(i)):r.push(n)}),Object.assign(Object.assign({},e),{filters:r})}return e},"log");Kf.log=hKr});var Zvt=x(n6=>{"use strict";Object.defineProperty(n6,"__esModule",{value:!0});n6.stringify=void 0;function f1(e,t=!1){let r="";switch(e.op){case"eq":case"ne":case"co":case"sw":case"ew":case"gt":case"lt":case"ge":case"le":r=`${e.attrPath} ${e.op} ${JSON.stringify(e.compValue)}`;break;case"pr":r=`${e.attrPath} ${e.op}`;break;case"or":let n=e.filters.map(i=>f1(i)).join(` ${e.op} `);r=t?`(${n})`:n;break;case"and":r=e.filters.map(i=>f1(i,!0)).join(` ${e.op} `);break;case"not":r=`${e.op} (${f1(e.filter)})`;break;case"[]":r=`${e.attrPath}[${f1(e.valFilter)}]`;break}return r}o(f1,"stringify");n6.stringify=f1});var i6=x(fc=>{"use strict";Object.defineProperty(fc,"__esModule",{value:!0});fc.flatten=fc.parse=fc.filter=fc.Tester=fc.stringify=void 0;var $pe=Yvt(),gKr=Jvt(),ewt=Xvt(),yKr=Zvt();Object.defineProperty(fc,"stringify",{enumerable:!0,get:function(){return yKr.stringify}});fc.Tester=gKr.Tester;function bKr(e){let t=new fc.Tester;return r=>t.test(r,e)}o(bKr,"filter");fc.filter=bKr;function vKr(e){let t=new $pe.Tokens($pe.tokenizer(e)),r=$pe.parseFilter(t);if(t.peek().type!=="EOT")throw new Error(`unexpected EOT ${t.getList()}`);return r}o(vKr,"parse");fc.parse=vKr;function wKr(e){return ewt.log(ewt.valfilter(e))}o(wKr,"flatten");fc.flatten=wKr});var Xpe=x(_i=>{"use strict";Object.defineProperty(_i,"__esModule",{value:!0});_i.PATCH_OPERATION_SCHEMA=_i.InvalidScimRemoveValue=_i.RemoveValueNotArray=_i.RemoveValueNestedArrayNotSupported=_i.NoTarget=_i.InvalidScimPatchRequest=_i.NoPathInScimPatchOp=_i.InvalidScimPatchOp=_i.InvalidScimPatch=_i.ScimError=void 0;_i.patchBodyValidation=AKr;_i.scimPatch=TKr;var An=Vvt();Object.defineProperty(_i,"ScimError",{enumerable:!0,get:function(){return An.ScimError}});Object.defineProperty(_i,"InvalidScimPatch",{enumerable:!0,get:function(){return An.InvalidScimPatch}});Object.defineProperty(_i,"InvalidScimPatchOp",{enumerable:!0,get:function(){return An.InvalidScimPatchOp}});Object.defineProperty(_i,"NoPathInScimPatchOp",{enumerable:!0,get:function(){return An.NoPathInScimPatchOp}});Object.defineProperty(_i,"InvalidScimPatchRequest",{enumerable:!0,get:function(){return An.InvalidScimPatchRequest}});Object.defineProperty(_i,"NoTarget",{enumerable:!0,get:function(){return An.NoTarget}});Object.defineProperty(_i,"RemoveValueNestedArrayNotSupported",{enumerable:!0,get:function(){return An.RemoveValueNestedArrayNotSupported}});Object.defineProperty(_i,"RemoveValueNotArray",{enumerable:!0,get:function(){return An.RemoveValueNotArray}});Object.defineProperty(_i,"InvalidScimRemoveValue",{enumerable:!0,get:function(){return An.InvalidScimRemoveValue}});var Wpe=i6(),Gpe=vk(),Hpe=/(\[|\])/,EKr=/^(.+)\[(.+)\]$/,twt=/(?!\B"[^[]*)\.(?![^\]]*"\B)/g,_Kr=["remove","add","replace"],SKr="urn:ietf:params:scim:schemas:core:2.0:User",xKr="urn:ietf:params:scim:schemas:core:2.0:Group";_i.PATCH_OPERATION_SCHEMA="urn:ietf:params:scim:api:messages:2.0:PatchOp";function AKr(e){if(!e.schemas||!e.schemas.includes(_i.PATCH_OPERATION_SCHEMA))throw new An.InvalidScimPatchRequest("Missing schemas.");if(!Array.isArray(e.Operations))throw new An.InvalidScimPatchRequest("Operations should be an array.");if(!e.Operations||e.Operations.length<=0)throw new An.InvalidScimPatchRequest("Missing operations.");e.Operations.forEach(Kpe)}o(AKr,"patchBodyValidation");function TKr(e,t,r={mutateDocument:!0,treatMissingAsAdd:!0}){return r.mutateDocument||(e=JSON.parse(JSON.stringify(e))),t.reduce((n,i)=>{switch(i.op){case"remove":case"Remove":return RKr(n,i);case"add":case"Add":case"replace":case"Replace":return nwt(n,i,!!r.treatMissingAsAdd);default:throw new An.InvalidScimPatchRequest(`Operator is invalid for SCIM patch request. ${i}`)}},e)}o(TKr,"scimPatch");function Kpe(e){if(typeof e.op!="string"||!kKr(e.op))throw new An.InvalidScimPatchRequest(`Invalid op "${e.op}" in the request.`);if(e.op==="remove"&&!e.path)throw new An.NoPathInScimPatchOp;if(m1(e.op)&&!("value"in e))throw new An.InvalidScimPatchRequest(`The operation ${e.op} MUST contain a "value" member whose content specifies the value to be added`);if(e.path&&typeof e.path!="string")throw new An.InvalidScimPatchRequest("Path is supposed to be a string")}o(Kpe,"validatePatchOperation");function Qpe(e){let t=e.lastIndexOf(":");if(t<0)return e.split(twt);let r=e.substring(0,t),n=e.substring(t+1).split(twt);switch(r){case xKr:case SKr:break;default:n.unshift(r);break}return n}o(Qpe,"resolvePaths");function RKr(e,t){let r;Kpe(t);let n=Qpe(t.path);try{r=iwt(e,n,{isRemoveOp:!0})}catch(a){if(a instanceof An.InvalidRemoveOpPath)return e;throw a}let i=n[n.length-1];if(!Hpe.test(i)){for(let a of r)t.value?a[i]=CKr(a[i],t.value):delete a[i];return e}for(let a of r){let{attrName:s,valuePath:u,array:c}=Ype(i,a);a[s]=Jpe(c,u,{excludeIfMatchFilter:!0}),a[s].length===0&&delete a[s]}return e}o(RKr,"applyRemoveOperation");function nwt(e,t,r){var n;let i;if(Kpe(t),!t.path)return d1(e,t);let a=Qpe(t.path),s=a[a.length-1];try{i=iwt(e,a)}catch(u){if(u instanceof An.FilterOnEmptyArray||u instanceof An.FilterArrayTargetNotFound){let c=u.schema,l=(0,Wpe.parse)(u.valuePath);if(m1(t.op)&&"compValue"in l&&l.compValue!==void 0&&l.op==="eq"){let p={};return p[l.attrPath]=l.compValue,p[s]=d1(void 0,t,!0),c[u.attrName]=[...(n=c[u.attrName])!==null&&n!==void 0?n:[],p],e}else if(r&&zpe(t.op)&&"compValue"in l&&l.compValue!==void 0&&l.op==="eq")return nwt(e,Object.assign(Object.assign({},t),{op:"add"}),!1);throw new An.NoTarget(t.path)}throw u}if(!Hpe.test(s)){for(let u of i)u[s]=d1(u[s],t);return e}for(let u of i){let{valuePath:c,array:l}=Ype(s,u),p=Jpe(l,c);if(zpe(t.op)&&p.length===0)throw new An.NoTarget(t.path);for(let f=0;f<l.length;f++)p.includes(l[f])&&(l[f]=d1(l[f],t))}return e}o(nwt,"applyAddOrReplaceOperation");function Ype(e,t){let r=e.match(EKr);if(!r)throw new An.InvalidScimPatchOp(`This part of the path ${e} is invalid for SCIM patch request.`);let[,n,i]=r,a=t[n];if(!Array.isArray(a))throw new An.FilterOnEmptyArray("Impossible to search on a mono valued attribute.",n,i);return new Vpe(n,i,a)}o(Ype,"extractArray");function iwt(e,t,r={}){let n=[e];for(let i=0;i<t.length-1;i++){let a=t[i];Hpe.test(a)?n=n.flatMap(s=>{try{let{attrName:u,valuePath:c,array:l}=Ype(a,s),p=Jpe(l,c);if(p.length===0)throw new An.FilterArrayTargetNotFound("A matching array entry was not found using the supplied filter.",u,c,s);return p}catch(u){throw u instanceof An.FilterOnEmptyArray&&(u.schema=s),u}}):n=n.flatMap(s=>{if(!s[a]&&r.isRemoveOp)throw new An.InvalidRemoveOpPath;return s[a]||(s[a]={})})}return n}o(iwt,"navigate");function d1(e,t,r){if(Array.isArray(e)){if(Array.isArray(t.value)){if(m1(t.op)){let i=t.value.filter(a=>!rwt(e,a));return e.concat(i)}return t.value}if(zpe(t.op))return e.map(i=>d1(i,t,r));let n=e;return rwt(n,t.value)||n.push(t.value),n}return e!==null&&typeof e=="object"?IKr(e,t,r):t.value}o(d1,"addOrReplaceAttribute");function IKr(e,t,r){if(typeof t.value!="object"){if(m1(t.op)&&!r)throw new An.InvalidScimPatchOp("Invalid patch query.");return t.value}for(let[n,i]of Object.entries(t.value))OKr(e,Qpe(n),i,t.op);return e}o(IKr,"addOrReplaceObjectAttribute");function OKr(e,t,r,n){let i=t.length-1;for(let s=0;s<i;++s){let u=t[s];u in e||(e[u]={}),e=e[u]}let a=e[t[i]];if(m1(n)&&Array.isArray(a)){if(Array.isArray(r)){e[t[i]]=[...a,...r];return}e[t[i]]=[...a,r];return}e[t[i]]=r}o(OKr,"assign");function Jpe(e,t,r={}){try{let n=(0,Wpe.filter)((0,Wpe.parse)(t));return e.filter(i=>r.excludeIfMatchFilter?!n(i):n(i))}catch(n){throw new An.InvalidScimPatchOp(`${n}`)}}o(Jpe,"filterWithQuery");function CKr(e,t){if(!Array.isArray(e))throw new An.RemoveValueNotArray;return Array.isArray(t)?(t.forEach(r=>{if(Array.isArray(r))throw new An.RemoveValueNestedArrayNotSupported;e=e.filter(n=>!Gpe(r,n))}),e):e.filter(r=>!Gpe(t,r))}o(CKr,"removeWithPatchValue");function rwt(e,t){return e.some(r=>Gpe(t,r))}o(rwt,"deepIncludes");function kKr(e){return _Kr.includes(e.toLowerCase())}o(kKr,"isValidOperation");function m1(e){return e!==void 0&&e.toLowerCase()==="add"}o(m1,"isAddOperation");function zpe(e){return e!==void 0&&e.toLowerCase()==="replace"}o(zpe,"isReplaceOperation");var Vpe=class{static{o(this,"ScimSearchQuery")}constructor(t,r,n){this.attrName=t,this.valuePath=r,this.array=n}}});function owt(e,t){let r=e.request.query[t];if(r!==void 0)return+r}function DKr(e){let t=e.Operations.find(r=>(r.op==="Replace"||r.op==="replace")&&r.path==="active");return t?t.value===!1||t.value?.toLowerCase?.()==="false":!1}var o6,awt,swt,uwt,cwt,Zpe,lwt=v(()=>{"use strict";o6=te(Xpe());or();Ap();X();o(owt,"tryGetQueryAsNumber");awt=o(async e=>{let t=owt(e,"pageSize")??20,r=owt(e,"startIndex"),n;e.request.query.filter&&(n=oa.user.userFilters(e.request.query.filter));let i=await pc.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(oa.user.toScimUserResponse),startIndex:(r||0)+1,itemsPerPage:t}},"get"),swt=o(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404);let r=await pc.find(t);e.body=oa.user.toScimUserResponse(r)},"find"),uwt=o(async e=>{let t=oa.user.fromScimUser(e.request.body);try{let r=await pc.create(t);e.body=oa.user.toScimUserResponse(r)}catch(r){throw r instanceof bf&&e.throw(409,"Email already in use"),r}},"create");o(DKr,"isDeactivation");cwt=o(async e=>{let t=await pc.find(e.params.id);t||e.throw(404);let r=oa.user.toScimUserResponse(t),n=e.request.body;try{(0,o6.patchBodyValidation)(n)}catch{}if(DKr(n))return Zpe(e);let i;try{i=(0,o6.scimPatch)(r,n.Operations)}catch{}i||e.throw(500);let a=oa.user.fromScimUser(i);await pc.update(a,{allowChangingEmail:!0}),e.body=oa.user.toScimUserResponse(a)},"update"),Zpe=o(async e=>{let{id:t}=e.params;typeof t!="string"&&e.throw(404),await pc.remove(t),e.status=204},"remove")});function fwt(e,t){for(let r of t.split(","))delete e[r]}var pwt,a6,s6,dwt,mwt,hwt,gwt,ywt,bwt=v(()=>{"use strict";pwt=te(require("lodash/groupBy"));Ze();a6=te(Xpe());or();s6=te(i6());o(fwt,"cleanResponse");dwt=o(async e=>{let r=(await Pn.fetch()).filter(a=>a.scimInfo?.isSync).map(oa.group.toScimGroupResponse),{filter:n,excludedAttributes:i}=e.request.query;if(n){let a=(0,s6.filter)((0,s6.parse)(n));r=r.filter(a)}i&&r.forEach(a=>{fwt(a,i)}),e.body={schemas:["urn:ietf:params:scim:api:messages:2.0:ListResponse"],totalResults:r.length,Resources:r,startIndex:1,itemsPerPage:r.length}},"get"),mwt=o(async e=>{let t=oa.group.fromScimGroup(e.request.body),r=await n1.create(t);e.body=oa.group.toScimGroupResponse(r)},"create"),hwt=o(async e=>{let{id:t}=e.params,r=await Pn.get(t),n=oa.group.toScimGroupResponse(r),{excludedAttributes:i}=e.request.query;i&&fwt(n,i),e.body=n},"find"),gwt=o(async e=>{let{id:t}=e.params,r=await Pn.get(t);await Pn.remove(t,r._rev),e.status=204},"remove"),ywt=o(async e=>{let{id:t}=e.params,r=await Pn.get(t),n=oa.group.toScimGroupResponse(r),i=e.request.body;try{(0,a6.patchBodyValidation)(i)}catch{e.throw(400)}let{true:a,false:s}=(0,pwt.default)(i.Operations,u=>u.path==="members");if(s?.length){let u=(0,a6.scimPatch)(n,s);u||e.throw(500);let c={...oa.group.fromScimGroup(u),_rev:r._rev};await Pn.save(c)}if(a?.length){let u=[],c=[];for(let{op:l,value:p}of a)switch(l){case"add":case"Add":for(let f of p)u.push(await pc.find(f.value));break;case"remove":case"Remove":for(let f of p)c.push(await pc.find(f.value));break;case"replace":case"Replace":throw new Error("Replacing members is not allowed");default:ar.unreachable(l)}u.length&&await Pn.addUsers(t,u.map(l=>l._id)),c.length&&await Pn.removeUsers(t,c.map(l=>l._id))}e.body=oa.group.toScimGroupResponse(await Pn.get(t))},"update")});var vwt,dc,wwt,Ewt=v(()=>{"use strict";vwt=te(require("@koa/router"));s1();lwt();bwt();H();dc=new vwt.default({prefix:"/api/global/scim/v2"});dc.use(Ipe);dc.use(Rpe);dc.get("/users",awt);dc.get("/users/:id",i1("id"),swt);dc.post("/users",uwt);dc.patch("/users/:id",i1("id"),cwt);dc.delete("/users/:id",i1("id"),Zpe);dc.get("/groups",dwt);dc.post("/groups",uo.requireFeature("userGroups"),mwt);dc.get("/groups/:id",uo.requireFeature("userGroups"),o1("id"),hwt);dc.delete("/groups/:id",uo.requireFeature("userGroups"),o1("id"),gwt);dc.patch("/groups/:id",uo.requireFeature("userGroups"),o1("id"),ywt);wwt=dc});async function _wt(e){let{userId:t,appId:r}=e.params,n=await ey.db.getUser(t);if(Pt.isGlobalBuilder(n)){e.body={message:"User already admin - no permissions updated."};return}await ey.addAppBuilder(n,r),e.body={message:`User "${n.email}" app builder access updated.`}}async function Swt(e){let{userId:t,appId:r}=e.params,n=await ey.db.getUser(t);if(Pt.isGlobalBuilder(n)){e.body={message:"User already admin - no permissions removed."};return}await ey.removeAppBuilder(n,r),e.body={message:`User "${n.email}" app builder access removed.`}}var xwt=v(()=>{"use strict";X();Ap();o(_wt,"addAppBuilder");o(Swt,"removeAppBuilder")});var Awt,Twt,Rwt,Iwt=v(()=>{"use strict";Awt=te(require("@koa/router"));xwt();s1();H();X();Twt=new Awt.default;Twt.post("/api/global/users/:userId/app/:appId/builder",vt.builderOrAdmin,uo.requireFeatures("appBuilders"),_wt).delete("/api/global/users/:userId/app/:appId/builder",vt.builderOrAdmin,uo.requireFeatures("appBuilders"),Swt);Rwt=Twt});var h1={};ae(h1,{appBackups:()=>Gvt,auditLogs:()=>Dvt,environmentVariables:()=>Svt,groups:()=>fvt,scim:()=>wwt,users:()=>Rwt});var Owt=v(()=>{"use strict";dvt();xvt();Pvt();zvt();Ewt();Iwt()});var efe={};ae(efe,{fromScimUser:()=>jKr,toScimUserResponse:()=>FKr,userFilters:()=>qKr});function BKr(e){if(jt.validEmail(e.userName))return e.userName;if(e.emails)return e.emails.find(t=>t.primary)?.value||e.emails[0]?.value}var Cwt,UKr,FKr,MKr,jKr,qKr,kwt=v(()=>{"use strict";H();Cwt=te(i6());X();Ze();({unreachable:UKr}=ar),FKr=o(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(a=>a).join(" "),familyName:e.lastName,givenName:e.firstName}),i},"toScimUserResponse"),MKr=o(e=>!!e?.id,"isScimUserResponse");o(BKr,"tryGetEmail");jKr=o(e=>{let t=MKr(e)?e:void 0,r=BKr(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:UKr(e.active)}let i,a;return e.name?.givenName?(i=e.name?.givenName,a=e.name?.familyName):i=e.displayName,{tenantId:"",_id:t?.id,userId:t?.id,email:r,firstName:i,lastName:a,scimInfo:{...e,isSync:!0},roles:{},status:n?"active":"inactive",createdAt:t?.meta.created.getTime(),updatedAt:t?.meta.lastModified.toISOString()}},"fromScimUser"),qKr=o(e=>{let t={equal:{}},r=(0,Cwt.parse)(e);function n(i){switch(i.op){case"eq":{let a=i.attrPath,s;switch(a){case"emails.value":s="email";break;default:s=`scimInfo.${a}`}t.equal[s]=i.compValue;break}case"and":for(let a of i.filters)n(a);break;default:console.warn("Filter not handled",{filter:i})}}return o(n,"parseFilters"),n(r),t},"userFilters")});var tfe={};ae(tfe,{fromScimGroup:()=>GKr,toScimGroupResponse:()=>$Kr});var $Kr,WKr,GKr,Dwt=v(()=>{"use strict";$Kr=o(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"),WKr=o(e=>!!e?.id,"isScimGroup"),GKr=o(e=>{let t=WKr(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 oa={};ae(oa,{group:()=>tfe,user:()=>efe});var Pwt=v(()=>{"use strict";kwt();Dwt()});function zKr(e){if(e.length>64)throw new Error("Tool name must be under 64 characters long");return e.replace(/[^a-zA-Z0-9_-]/g,"_")}function rfe(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"}var nfe=v(()=>{"use strict";H();o(zKr,"sanitiseToolName");o(rfe,"normalizeContentType")});function ife(e,t){return t.map(r=>e[r]).join(" ")}var uy,Qf,g1=v(()=>{"use strict";H();b1();Ze();y1();uy=te(require("dd-trace"));o(ife,"extractTextFromColumns");Qf=class{static{o(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 uy.default.trace("prompt",async()=>{let r=typeof t=="string"?new Ao().addUserMessage(t):t,{messages:n,tokensUsed:i}=await uy.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 uy.default.trace("chat",async()=>await this.chatCompletion(t))}async*chatStream(t){yield*this.chatCompletionStream(t)}async summarizeText(t){return uy.default.trace("summarizeText",()=>this.prompt(u6(t)))}async generateCronExpression(t){return uy.default.trace("generateCronExpression",()=>this.prompt(sfe(t)))}async operation(t,r){return uy.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:a,language:s,categories:u,prompt:c}=t;switch(n){case"SUMMARISE_TEXT":return u6(ife(r,a));case"CLEAN_DATA":return afe(r[i]);case"TRANSLATE":return ufe(r[i],s);case"CATEGORISE_TEXT":if(!u)throw Error("No categories provided for categorise text operation. Please provide categories.");return ofe(ife(r,a),u.split(","));case"SENTIMENT_ANALYSIS":return cfe(r[i]);case"PROMPT":return c;case"SEARCH_WEB":return lfe(ife(r,a));default:throw ar.unreachable(n)}}async generateJs(t,r){return await uy.default.trace("generateJs",async()=>{let{bindings:n=[],snippets:i=[]}=r||{};return await this.prompt(pfe(n,i).addUserMessage(t))})}}});function c6(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}function Nwt(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}var l6,ffe,Lwt,hl,DA=v(()=>{"use strict";l6=te(require("openai"));g1();H();ffe=require("openai/helpers/zod");nfe();Lwt=(n=>(n.GPT_5_MINI="gpt-5-mini",n.GPT_5="gpt-5",n.GPT_5_NANO="gpt-5-nano",n))(Lwt||{});o(c6,"parseResponseFormat");o(Nwt,"calculateBudibaseAICredits");hl=class extends Qf{constructor(r){super(r);this.client=this.getClient(r)}static{o(this,"OpenAI")}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new l6.default({apiKey:r.apiKey})}async uploadFile(r,n,i){let a=rfe(i);if(aN.includes(a.toLowerCase())){let c;if(Buffer.isBuffer(r))c=r;else{let p=[];for await(let f of r)p.push(new Uint8Array(f));c=Buffer.concat(p)}let l=c.toString("base64");return`data:${a};base64,${l}`}let s=await(0,l6.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:c6(r.format)};Object.values(Lwt).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(ffe.zodFunction));let i=await this.client.chat.completions.create(n),a=i?.choices?.[0]?.message;if(a?.tool_calls){r.addMessage(a);let s=[];for(let u of a.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 p=JSON.parse(u.function.arguments);s.push(l.handler(p).then(f=>({role:"tool",tool_call_id:u.id,content:f})).catch(f=>(console.error(`[OPENAI TOOL ERROR] Tool ${c} failed in OpenAI handler:`,f),{role:"tool",tool_call_id:u.id,content:`Error: ${f.message}`})))}return r.addMessages(await Promise.all(s)),this.chatCompletion(r)}else{if(a?.content)return{messages:[...r.messages,{role:a.role,content:a.content}],tokensUsed:Nwt(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:c6(r.format),stream:!0};r.tools&&r.tools.length>0&&(n.tool_choice="auto",n.tools=r.tools.map(ffe.zodFunction));try{let i=await this.client.chat.completions.create(n),a=null,s="",u=null;for await(let l of i){let p=l?.choices?.[0]?.delta;if(p){if(p.content&&(s+=p.content,yield{type:"content",content:p.content}),p.tool_calls&&p.tool_calls.length>0){let f=p.tool_calls[0];f.id?(a={id:f.id,name:f.function?.name||"",arguments:f.function?.arguments||""},yield{type:"tool_call_start",toolCall:{id:a.id,name:a.name,arguments:a.arguments}}):a&&f.function?.arguments&&(a.arguments+=f.function.arguments,yield{type:"tool_call_start",toolCall:{id:a.id,name:a.name,arguments:a.arguments}})}l.usage&&(u=l.usage)}}let c=u?Nwt(u):0;if(a){r.addMessage({role:"assistant",content:"",tool_calls:[{id:a.id,type:"function",function:{name:a.name,arguments:a.arguments}}]});let l=r.findTool(a.name);if(l)try{let p=JSON.parse(a.arguments),f=await l.handler(p);yield{type:"tool_call_result",toolResult:{id:a.id,result:f}},r.addMessage({role:"tool",tool_call_id:a.id,content:f}),yield*this.chatCompletionStream(r);return}catch(p){yield{type:"tool_call_result",toolResult:{id:a.id,result:`Error: ${p.message}`,error:p.message}},r.addMessage({role:"tool",tool_call_id:a.id,content:`Error: ${p.message}`}),yield*this.chatCompletionStream(r);return}else{let p=`Tool '${a.name}' not found`;yield{type:"tool_call_result",toolResult:{id:a.id,result:p,error:p}},r.addMessage({role:"tool",tool_call_id:a.id,content:p}),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 dfe,p6,Uwt=v(()=>{"use strict";DA();X();H();uA();Vue();g1();dfe=require("dd-trace"),p6=class extends Qf{static{o(this,"BudibaseAI")}async prompt(t){let r=await super.prompt(t);return r.tokensUsed&&await M4(r.tokensUsed),r}async chat(t){let r=await super.chat(t);return r.tokensUsed&&await M4(r.tokensUsed),r}async uploadFile(t,r,n){return K.SELF_HOSTED?this.uploadFileSelfHost(t,r,n):this.uploadFileCloud(t,r,n)}async uploadFileCloud(t,r,n){return new hl({apiKey:K.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).uploadFile(t,r,n)}async uploadFileSelfHost(t,r,n){let i;if(Buffer.isBuffer(t))i=t;else{let p=[];for await(let f of t)p.push(new Uint8Array(f));i=Buffer.concat(p)}let a=i.toString("base64");if(n&&aN.includes(n.toLowerCase()))return`data:image/jpeg;base64,${a}`;if(!K.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let p=await P4();if(!p)throw new Error("No license key found");this._apiKey=p}let s=`${K.BUDICLOUD_URL}/api/ai/upload-file`,u={method:"POST",headers:{"Content-Type":"application/json",[ur.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:a,filename:r,contentType:n})};console.debug("[BudibaseAI] uploadFileSelfHost - Making network call",{url:s,method:u.method,headers:u.headers,bodyKeys:["data","filename","contentType"],filename:r,contentType:n});let c=await fetch(s,u);if(console.debug("[BudibaseAI] uploadFileSelfHost - Network response",{url:s,status:c.status,statusText:c.statusText,ok:c.ok}),!c.ok)throw await Ie.fromResponse(c);return(await c.json()).fileId}async chatCompletion(t){return K.SELF_HOSTED?this.chatCompletionSelfHost(t):this.chatCompletionCloud(t)}async chatCompletionCloud(t){return await dfe.tracer.trace("chatCompletionCloud",async()=>await new hl({apiKey:K.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletion(t))}async chatCompletionSelfHost(t){return await dfe.tracer.trace("chatCompletionSelfHost",async r=>{if(!K.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(r.addTags({budicloudUrl:K.BUDICLOUD_URL}),!this._apiKey){let c=await P4();if(!c)throw new Error("No license key found");this._apiKey=c,r.addTags({licenseKey:this._apiKey})}let n={messages:t.messages,format:t.format,useTools:t.tools.length>0},i=`${K.BUDICLOUD_URL}/api/ai/chat`,a={method:"POST",headers:{"Content-Type":"application/json",[ur.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(n)};console.debug("[BudibaseAI] chatCompletionSelfHost - Making network call",{url:i,method:a.method,headers:a.headers,bodyKeys:Object.keys(n),messagesCount:t.messages.length,useTools:n.useTools,format:n.format});let s=await fetch(i,a);if(console.debug("[BudibaseAI] chatCompletionSelfHost - Network response",{url:i,status:s.status,statusText:s.statusText,ok:s.ok}),!s.ok)throw await Ie.fromResponse(s);let u=await s.json();return console.debug("[BudibaseAI] chatCompletionSelfHost - Response data",{url:i,tokensUsed:u.tokensUsed,messagesCount:u.messages?.length}),u})}async*chatCompletionStream(t){K.SELF_HOSTED?yield*this.chatCompletionStreamSelfHost(t):yield*this.chatCompletionStreamCloud(t)}async*chatCompletionStreamCloud(t){yield*new hl({apiKey:K.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletionStream(t)}async*chatCompletionStreamSelfHost(t){console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Starting streaming (fallback to non-streaming)",{messagesCount:t.messages.length,toolsCount:t.tools.length});try{let r=await this.chatCompletionSelfHost(t);if(console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Yielding response chunks",{responseMessagesCount:r.messages.length,tokensUsed:r.tokensUsed}),r.messages.length>0){let n=r.messages[r.messages.length-1];n.content&&(yield{type:"content",content:n.content})}yield{type:"done",messages:r.messages,tokensUsed:r.tokensUsed}}catch(r){console.debug("[BudibaseAI] chatCompletionStreamSelfHost - Error occurred",{error:r.message}),yield{type:"error",content:r.message}}}}});function VKr(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}var mfe,f6,Fwt=v(()=>{"use strict";mfe=te(require("@anthropic-ai/sdk"));g1();o(VKr,"calculateBudibaseAICredits");f6=class extends Qf{constructor(r){super(r);this.client=new mfe.default({apiKey:r.apiKey})}static{o(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:a})=>{if(a==null)return{role:"user",content:""};if(typeof a=="string")return{role:"user",content:a};let s="";for(let u of a)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:VKr(n.usage)}}catch(n){throw n instanceof mfe.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 Mwt=v(()=>{"use strict";DA();Fwt()});var Bwt,d6,jwt=v(()=>{"use strict";DA();Bwt=require("openai"),d6=class extends hl{static{o(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 Bwt.AzureOpenAI({apiKey:t.apiKey,apiVersion:"2024-10-01-preview",baseURL:t.baseUrl})}}});async function KKr(){return await v1.tracer.trace("getAIConfig",async e=>{let t={type:"ai",config:{}};if(!F.isSelfHostUsingCloud()){let n=await Pi.getAIConfig();n&&(t=n)}await Zue(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||Wwt,apiKey:r.apiKey,baseUrl:r.baseUrl}})}async function QKr(){return v1.tracer.trace("getSelfHostOpenAIKeyConfig",e=>{if(!K.SELF_HOSTED){e.addTags({enabled:!1,reason:"not self host"});return}if(!K.OPENAI_API_KEY){e.addTags({enabled:!1,reason:"no OPENAI_API_KEY"});return}return e.addTags({enabled:!0}),{provider:"OpenAI",model:Wwt,apiKey:K.OPENAI_API_KEY}})}async function hfe(){return v1.tracer.trace("getLLMConfig",async()=>await KKr()||await QKr())}async function w1(e){return await v1.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:n}=e||{},i=await hfe();if(!i){t.addTags({enabled:!1,reason:"no config found"});return}r&&(i.model=r),n&&(i.maxTokens=n);let a=HKr[i.provider];if(!a){t.addTags({enabled:!1,reason:"no provider found",provider:i.provider});return}return new a(i)})}async function Gwt(){let e=await w1();if(!e)throw new Ie("No available LLM configurations",500);return e}var v1,qwt,$wt,Wwt,HKr,Ao,y1=v(()=>{"use strict";X();H();DA();Uwt();v1=require("dd-trace");Mwt();tce();qwt=require("zod"),$wt=require("openai/helpers/zod");jwt();Wwt="gpt-5-mini",HKr={OpenAI:hl,TogetherAI:hl,AzureOpenAI:d6,Custom:hl,Anthropic:f6,BudibaseAI:p6};o(KKr,"getAIConfig");o(QKr,"getSelfHostOpenAIKeyConfig");o(hfe,"getLLMConfig");o(w1,"getLLM");o(Gwt,"getLLMOrThrow");Ao=class e{constructor(){this.messages=[];this.tools=[]}static{o(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 qwt.z.ZodType?this.format=(0,$wt.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}}});function u6(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 Ao().addUserMessage(`${n}${r}.
|
|
589
589
|
Only return the summary.`)}function YKr(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
|
|