@budibase/server 3.31.6 → 3.31.7
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 +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/query.js +1 -1
- package/dist/query.js.map +1 -1
- package/package.json +2 -2
- package/src/middleware/utils.ts +7 -12
package/dist/index.js
CHANGED
|
@@ -672,7 +672,7 @@ Example: return $("Score") + $("Weight")
|
|
|
672
672
|
2. If it's a ticketing system, there may be more tickets than users, and some users may have submitted several tickets.
|
|
673
673
|
3. In a CRM, there are fewer users than customers, and customers may have many deals.
|
|
674
674
|
4. In a project management tool, projects might have many tasks, and tasks might have multiple comments.`)}return t}var cs,gzt=b(()=>{"use strict";cs=require("zod");Xe();F();s(ZCe,"tableDataStructuredOutput")});var eOe=b(()=>{"use strict";pzt();mzt();gzt()});var mJ,Ij,tOe,yzt=b(()=>{"use strict";G();Xe();mJ=require("ai"),Ij=H(require("dd-trace"));hJ();eOe();zCe();tOe=class e{constructor(t,r){this.llmFunctions={getTableStructure:async t=>Ij.default.trace("llm.getTableStructure",async()=>{let r=await this.promptForStructuredOutput(WCe().addUserMessage(t),JCe,"Error generating tables");return KCe(r)}),generateAIColumns:(t,r)=>Ij.default.trace("llm.generateAIColumns",async()=>this.generateAIColumns(t,r)),generateData:async(t,r)=>Ij.default.trace("llm.generateData",async()=>this.promptForStructuredOutput(VCe().addUserMessage(t),ZCe(r),"Error generating data"))};this.aiModel=t,this.delegates=r}static{s(this,"TableGeneration")}static async init(t,r){if(!t)throw new Y("LLM not available",422);return new e(t,r)}async generate(t,r,n){return Ij.default.trace("tableGeneration.generate",async i=>{let o=await this.generateTables(t,r,n);return i.addTags({table_count:o.length}),o})}async generateTables(t,r,n){n?.("Generating table schema...");let i=await this.llmFunctions.getTableStructure(t);n?.("Generating AI columns and sample data...");let[o,a]=await Promise.all([this.llmFunctions.generateAIColumns(t,i),this.llmFunctions.generateData(t,i)]);n?.("Creating tables...");let l=await this.delegates.generateTablesDelegate(QCe(i,o));return n?.("Populating rows..."),await this.delegates.generateDataDelegate(a,r,Jt.toMap("name",i)),n?.("Finalizing..."),l}async generateAIColumns(t,r){return this.promptForStructuredOutput(GCe().addUserMessage(`This is the initial user prompt that generated the given schema:
|
|
675
|
-
"${t}"`),XCe(r),"Error generating columns")}async promptForStructuredOutput(t,r,n){let i=this.aiModel.providerOptions?.(!1),o=s(async a=>(0,mJ.generateText)({model:this.aiModel.chat,messages:this.toModelMessages(t.messages),output:mJ.Output.object({schema:r}),providerOptions:a}),"run");try{return(await HCe({providerOptions:i,run:o})).output}catch(a){let l=[n,this.getErrorMessage(a)].filter(Boolean).join(": ");throw new Y(l,500)}}getErrorMessage(t){if(!t||typeof t!="object")return String(t);let r=t;return typeof r.message=="string"?r.message:String(t)}toModelMessages(t){return t.map(r=>{if(typeof r.content!="string")throw new Y("AI message content must be a string",422);return{role:r.role,content:r.content}})}}});var bzt=b(()=>{"use strict";yzt()});var tn={};ie(tn,{LLMRequest:()=>Ql,TableGeneration:()=>tOe,agentHistoryTitleSystemPrompt:()=>iri,agentSystemPrompt:()=>nri,aiColumnSchemas:()=>XCe,aiTableResponseToTableSchema:()=>KCe,appendAIColumns:()=>QCe,classifyText:()=>Kti,cleanData:()=>Qti,composeAutomationAgentSystemPrompt:()=>tri,composeAutomationAgentToolGuidelines:()=>rri,generateAIColumns:()=>GCe,generateCronExpression:()=>Yti,generateData:()=>VCe,generateJs:()=>eri,generateTables:()=>WCe,generationStructure:()=>JCe,getLLMConfig:()=>uzt,normalizeContentType:()=>Wti,parseResponseFormat:()=>dzt,runWithReasoningEffortFallback:()=>HCe,sanitiseToolName:()=>$ti,searchWeb:()=>Zti,sentimentAnalysis:()=>Xti,summarizeText:()=>zti,tableDataStructuredOutput:()=>ZCe,translate:()=>Jti});var _zt=b(()=>{"use strict";lzt();hJ();$Ce();hJ();zCe();bzt();eOe()});var Kt=b(()=>{"use strict";sxe();UD();UD();Ng();Pg();Q4t();azt();_zt()});function U_(e,t={}){return dm("ta",e,t)}function gJ(){return V.generateTableID()}function Cp(e,t={}){return dm("au",e,t)}function Ozt(){return`au${$r}${yx()}`}function kzt(e,t,r,n,i,o){let a=`${$r}${e}${$r}${t}`,l=`${$r}${r}${$r}${n}`,c=`${$r}${i}${$r}${o}`;return`li${a}${l}${c}`}function uri(e={}){return dm("li",null,e)}async function Dzt(){return(await D.getWorkspaceDB().allDocs(uri({include_docs:!0}))).rows.map(r=>r.doc)}function Pzt(e){return`layout${$r}${e||yx()}`}function Mzt(e,t={}){return dm("layout",e,t)}function Nzt(){return`screen${$r}${yx()}`}function Lzt(e,t={}){return dm("screen",e,t)}function Uzt(){return`wh${$r}${yx()}`}function Bzt(e,t={}){return dm("wh",e,t)}function Fzt({plus:e=!1}={}){return`${e?"datasource_plus":"datasource"}${$r}${yx()}`}function Rj(e,t={}){return dm("datasource",e,t)}function yJ(e){return`query${$r}${e}${$r}${yx()}`}function qzt(e){return`meta_au${$r}${e}`}function jzt(e={}){return dm("meta_au",null,e)}function bJ(e,t={}){return e==null?dm("query",null,t):dm("query",`${e}${$r}`,t)}function nOe(e){return`flag${$r}${e}`}function jE(e,t){return`metadata${$r}${e}${$r}${t}`}function bx(e){return`view${$r}${e}`}function $zt(e={}){return dm("view",null,e)}function $E(e,t){let r=e>t?e:t,n=e>t?t:e;return`${r}${$r}${n}`}function _J(e){return`view${$r}${e}${$r}${yx()}`}function WE(e){return e.type==="link"}function iOe(e){return e.type==="ai"}function wJ(e){return`ra${$r}${e}`}function Wzt(e){return e.replace(new RegExp(`^ra${$r}`),"")}var yx,wzt,$r,q9s,vzt,Ezt,fm,Rp,FE,Szt,Tzt,Azt,nf,_n,xj,Izt,xzt,j9s,Rzt,qE,dm,us,Czt,oP,L_,pm,at=b(()=>{"use strict";G();F();F();yx=gt.newid,wzt={_id:Wa,type:V.BUDIBASE_DATASOURCE_TYPE,name:"Budibase DB",source:"BUDIBASE",config:{}},$r=V.SEPARATOR,q9s=V.StaticDatabases,vzt=V.WORKSPACE_PREFIX,Ezt=V.WORKSPACE_DEV_PREFIX,fm=V.isDevWorkspaceID,Rp=V.isProdWorkspaceID,FE=`ro${$r}${V.InternalTable.USER_METADATA}${$r}`,Szt=`li${$r}${V.InternalTable.USER_METADATA}${$r}`,Tzt=`ro${$r}ta`,Azt=`log_au${$r}`,nf=V.ViewName,_n=V.InternalTable,xj=V.UNICODE_MAX,Izt=V.generateWorkspaceID,xzt=V.getDevWorkspaceID,j9s=V.generateRoleID,Rzt=V.getRoleParams,qE=V.getQueryIndex,dm=V.getDocParams,us=V.getRowParams,Czt=V.generateRowID,oP=V.getUserMetadataParams,L_=V.generateUserMetadataID,pm=V.getGlobalIDFromUserMetadataID;s(U_,"getTableParams");s(gJ,"generateTableID");s(Cp,"getAutomationParams");s(Ozt,"generateAutomationID");s(kzt,"generateLinkID");s(uri,"getLinkParams");s(Dzt,"allLinkDocs");s(Pzt,"generateLayoutID");s(Mzt,"getLayoutParams");s(Nzt,"generateScreenID");s(Lzt,"getScreenParams");s(Uzt,"generateWebhookID");s(Bzt,"getWebhookParams");s(Fzt,"generateDatasourceID");s(Rj,"getDatasourceParams");s(yJ,"generateQueryID");s(qzt,"generateAutomationMetadataID");s(jzt,"getAutomationMetadataParams");s(bJ,"getQueryParams");s(nOe,"generateUserFlagID");s(jE,"generateMetadataID");s(bx,"generateMemoryViewID");s($zt,"getMemoryViewParams");s($E,"generateJunctionTableID");s(_J,"generateViewID");s(WE,"isRelationshipColumn");s(iOe,"isAIColumn");s(wJ,"generateRowActionsID");s(Wzt,"extractTableIdFromRowActionsID")});function dri(e,t){let r;t?r=t.split(","):r=e;for(let n of r)if(!e.includes(n))throw new Error(`Feature: ${n} is not an allowed option`);return r}function GE(){return oOe.includes("automations")}function Vzt(){return oOe.includes("api")}function Hzt(){se.APP_FEATURES&&console.log(`**** APP FEATURES SET: ${oOe.join(", ")} ****`)}var Gzt,oOe,Cj=b(()=>{"use strict";Pt();Gzt=(r=>(r.API="api",r.AUTOMATIONS="automations",r))(Gzt||{});s(dri,"processFeatureEnvVar");oOe=dri(Object.values(Gzt),se.APP_FEATURES);s(GE,"automationsEnabled");s(Vzt,"apiEnabled");s(Hzt,"printFeatures")});function zzt(e){let t=null;switch(e){case"query":t="./query";break;case"automation":t="./automation";break;default:throw"Unknown thread type"}return require.resolve(t)}var aOe,VE,vJ=b(()=>{"use strict";aOe=H(require("worker-farm"));Pt();s(zzt,"typeToFile");VE=class e{static{s(this,"Thread")}static{this.workerRefs=[]}constructor(t,r={timeoutMs:null,count:1}){if(this.type=t,this.count=r.count?r.count:1,this.disableThreading=this.shouldDisableThreading(),this.disableThreading)console.log(`[${se.FORKED_PROCESS_NAME}] skipping worker farm type=${t}`);else{console.log(`[${se.FORKED_PROCESS_NAME}] initialising worker farm type=${t}`);let n={autoStart:!0,maxConcurrentWorkers:this.count,workerOptions:{env:{...process.env,FORKED_PROCESS:"1",FORKED_PROCESS_NAME:t},execArgv:process.execArgv.some(i=>i.startsWith("--enable-source-maps"))?["--enable-source-maps"]:void 0}};r.timeoutMs&&(this.timeoutMs=r.timeoutMs,n.maxCallTime=r.timeoutMs),this.workers=(0,aOe.default)(n,zzt(t),["execute"]),e.workerRefs.push(this.workers)}}shouldDisableThreading(){return!!(se.isTest()||se.DISABLE_THREADING||this.count===0||se.isInThread())}run(t){let r=this.timeoutMs;return new Promise((n,i)=>{function o(a){a.execute(t,(l,c)=>{l&&l.type==="TimeoutError"?i(new Error(`Thread timeout exceeded ${r}ms timeout.`)):l?i(l):n(c)})}s(o,"fire"),this.disableThreading?import(zzt(this.type)).then(a=>{o(a)}):o(this.workers)})}static stopThreads(){return new Promise(t=>{e.workerRefs.length===0&&t();let r=0;function n(){r++,r>=e.workerRefs.length&&t()}s(n,"complete");for(let i of e.workerRefs)aOe.default.end(i,n);e.workerRefs=[]})}static async shutdown(){await e.stopThreads(),console.log("Threads shutdown")}}});function Xzt(){let e=lP.default.join(Me.budibaseTempDir(),"ai-downloads");return aP.default.existsSync(e)||aP.default.mkdirSync(e),e}async function Zzt(e){try{let t=await(0,Kzt.default)(e),r=[...t.url.split(".")].pop().split("?")[0],n=lP.default.resolve(Xzt(),`${Jzt.v4()}${r}`),i=aP.default.createWriteStream(n,{flags:"wx"});await(0,Yzt.promisify)(Qzt.pipeline)(t.body,i);let o=lP.default.basename(n),a=`${D.getProdWorkspaceId()}/attachments/${o}`,l=await Me.upload({bucket:br.APPS,filename:a,path:n,type:"image/jpeg"});return{size:i.bytesWritten,name:o,url:await Me.getAppFileUrl(a),extension:r,key:l.Key}}catch(t){console.error("Error downloading file",t);return}}async function e3t(e){let t=lP.default.resolve(Xzt(),`${e.fileName}${e.extension}`);aP.default.writeFileSync(t,e.content);let r=lP.default.basename(t),n=`${D.getProdWorkspaceId()}/attachments/${r}`,i=await Me.upload({bucket:br.APPS,filename:n,path:t,type:"text/plain"});return{size:aP.default.readFileSync(t).byteLength,name:r,url:await Me.getAppFileUrl(n),extension:e.extension,key:i.Key}}var aP,Kzt,lP,Qzt,Yzt,Jzt,t3t=b(()=>{"use strict";aP=H(require("fs")),Kzt=H(require("node-fetch")),lP=H(require("path")),Qzt=require("stream"),Yzt=require("util"),Jzt=H(require("uuid"));G();ss();s(Xzt,"getTmpPath");s(Zzt,"uploadUrl");s(e3t,"uploadFile")});var r3t,n3t=b(()=>{"use strict";G();({getDispatcher:r3t}=gt)});function s3t(e){return new Promise(t=>setTimeout(t,e))}function a3t(e){for(let t of fri)if((0,lOe.default)(e,t,!0).isValid())return!0;return!1}function l3t(e,t){let r=e.indexOf(t);return r!==-1&&e.splice(r,1),e}function hm(e){return e.replace(/(https?:\/\/)|(\/)+/g,"$1$2")}async function Oj(e,t,r){let n=D.getWorkspaceDB(),i=jE(e,t),o=r(await n.tryGet(i)||{});o._id=i;let a=await n.put(o);return{...o,_id:i,_rev:a.rev}}async function c3t(e,t,r){return Oj(e,t,()=>r)}async function cP(e,t){let r=D.getWorkspaceDB(),n=jE(e,t),i=await r.tryGet(n);i&&await r.remove(i)}function u3t(e){return e.replace(/[\\]/g,"\\\\").replace(/[\b]/g,"\\b").replace(/[\f]/g,"\\f").replace(/[\n]/g,"\\n").replace(/[\r]/g,"\\r").replace(/[\t]/g,"\\t")}function d3t(e){let t=/^\d+\.?\d*$/;return typeof e=="string"&&e.match(t)?parseFloat(e):e}function cOe(e){return typeof e=="string"?e.toLowerCase()==="true":e===!0}var lOe,i3t,aJs,o3t,fri,$c=b(()=>{"use strict";t3t();n3t();G();lOe=H(require("dayjs")),i3t=H(require("dayjs/plugin/customParseFormat"));at();Pt();lOe.default.extend(i3t.default);s(s3t,"wait");aJs=se.isDev,o3t=/^[+-]?([0-9]*[.])?[0-9]+$/g,fri=["MM/DD/YYYY","MM/DD/YY","DD/MM/YYYY","DD/MM/YY","YYYY/MM/DD","YYYY-MM-DD","YYYY-MM-DDTHH:mm","YYYY-MM-DDTHH:mm:ss","YYYY-MM-DDTHH:mm:ss[Z]","YYYY-MM-DDTHH:mm:ss.SSS[Z]"];s(a3t,"isDate");s(l3t,"removeFromArray");s(hm,"checkSlashesInUrl");s(Oj,"updateEntityMetadata");s(c3t,"saveEntityMetadata");s(cP,"deleteEntityMetadata");s(u3t,"escapeDangerousCharacters");s(d3t,"convertBookmark");s(cOe,"isQsTrue")});var dOe={};ie(dOe,{getAppUrl:()=>hri,isWorkspacePublished:()=>uOe});function hri(e){let t;return e?.url?t=encodeURI(e?.url):e?.name&&(t=encodeURI(`${e?.name}`)),t&&(t=`/${t.replace(pri,"")}`.toLowerCase()),t}async function uOe(e){return V.isDevWorkspaceID(e)&&(e=V.getProdWorkspaceID(e)),!!(await V.getWorkspacesByIDs([e])).length}var pri,fOe=b(()=>{"use strict";G();pri=/\/|\\/g;s(hri,"getAppUrl");s(uOe,"isWorkspacePublished")});function mOe(){return pOe||(pOe=new hOe),pOe}async function f3t(e){return await mOe().execute(e)}var pOe,hOe,p3t=b(()=>{"use strict";G();F();fOe();hOe=class extends Es.QueuedProcessor{constructor(){super(Es.JobQueue.DEV_REVERT_PROCESSOR,{maxAttempts:3,removeOnFail:!1,removeOnComplete:!1,maxStalledCount:3,waitForCompletionMs:1e4});this.processFn=async r=>await D.doInWorkspaceContext(r.appId,()=>this.revertApp(r))}static{s(this,"DevRevertProcessor")}async revertApp(r){let{appId:n}=r,i=V.getProdWorkspaceID(n),o=D.getProdWorkspaceDB({skip_setup:!0});if(!await uOe(i))throw new Es.UnretriableError("App must be deployed to be reverted.");let l=await o.get("deployments");if(!l.history||Object.keys(l.history).length===0)throw new Es.UnretriableError("No deployments for app");let c=new V.Replication({source:i,target:n});try{await c.rollback();let u=D.getWorkspaceDB(),d=await u.get("app_metadata");return d.appId=n,d.instance._id=n,await u.put(d),await ft.workspace.invalidateWorkspaceMetadata(n),await Pe.app.reverted(d),{message:"Reverted changes successfully."}}catch(u){throw new Error(`Unable to revert. ${u}`,{cause:u})}finally{await c.close()}}};s(mOe,"devRevertProcessor");s(f3t,"revertDevChanges")});var gOe={};ie(gOe,{init:()=>mri,revertDevChanges:()=>f3t});var mri,h3t=b(()=>{"use strict";p3t();mri=s(async()=>{mOe()},"init")});async function yOe(e){if(!e.name||!e.path)throw new Error("File is not valid - cannot upload.");if(!e.name.endsWith(".tar.gz"))throw new Error("Plugin must be compressed into a gzipped tarball.");let t=gY(e.name.split(".tar.gz")[0]);return await FFt(e.path,t),await IE(t)}var bOe=b(()=>{"use strict";xo();s(yOe,"fileUpload")});async function m3t(){[B_,kj,Dj,Pj,_Oe]=await Promise.all([Gn.Client.init(Gn.utils.Databases.DEV_LOCKS),Gn.Client.init(Gn.utils.Databases.DEBOUNCE),Gn.Client.init(Gn.utils.Databases.FLAGS),Gn.Client.init(Gn.utils.Databases.RECAPTCHA_SESSION),Gn.clients.getSocketClient()]),se.isTest()||(EJ=_Oe.client.duplicate())}async function g3t(){console.log("REDIS SHUTDOWN"),B_&&await B_.finish(),kj&&await kj.finish(),Dj&&await Dj.finish(),Pj&&await Pj.finish(),EJ&&EJ.disconnect(),await Gn.clients.shutdown(),console.log("Redis shutdown")}async function SJ(e,t){let r=await B_.get(e);if(!r)return!0;let n=pm(r._id),i=pm(t._id);return n===i}async function y3t(e){return await B_.bulkGet(e)}async function TJ(e,t){let r=pm(t._id),n={...t,userId:r,_id:r,lockedAt:new Date().getTime()};await B_.store(e,n,gri)}async function AJ(e,t){let r=await B_.get(e);if(!r)return;let n=pm(t._id);if(r._id!==n)throw"User does not hold lock, cannot clear it.";await B_.delete(e)}async function b3t(e){return kj.get(e)}async function _3t(e,t){await kj.store(e,"debouncing",t)}async function wOe(e){let t=await Dj?.get(e);return!!(t&&t.testing)}async function w3t(e,t){await Dj.store(e,{testing:!0},yri);try{return await t()}finally{await B_.delete(e)}}function v3t(){return{pub:_Oe.client,sub:EJ}}async function E3t(){let e=gt.newid();return await Pj.store(e,{verified:!0},bri),e}async function IJ(e){let t=await Pj.get(e);return!!(t&&t.verified)}var gri,yri,bri,B_,kj,Dj,Pj,_Oe,EJ,sf=b(()=>{"use strict";G();at();Pt();gri=600,yri=60,bri=typeof se.RECAPTCHA_SESSION_SECONDS=="string"?parseInt(se.RECAPTCHA_SESSION_SECONDS):se.RECAPTCHA_SESSION_SECONDS;s(m3t,"init");s(g3t,"shutdown");s(SJ,"doesUserHaveLock");s(y3t,"getLocksById");s(TJ,"updateLock");s(AJ,"clearLock");s(b3t,"checkDebounce");s(_3t,"setDebounce");s(wOe,"checkTestFlag");s(w3t,"withTestFlag");s(v3t,"getSocketPubSubClients");s(E3t,"setRecaptchaVerified");s(IJ,"isRecaptchaVerified")});var T3t,A3t,xJ,Mj,vOe=b(()=>{"use strict";T3t=H(require("cookies")),A3t=H(require("http"));G();xJ=s((e,t,r)=>{let n=new A3t.default.ServerResponse(t.request);return{...e.createContext(t.request,n),resourceId:r?.resourceId,path:"/fake",request:{url:"/fake",headers:{"x-budibase-app-id":r?.appId}},cookies:new T3t.default(t.request,n),get:o=>t.request.headers?.[o],throw:(...o)=>{throw new Error(...o?.join(" ")||"Unknown error in socket middleware")},headers:t.request.headers,header:t.request.headers}},"createContext"),Mj=s(async(e,t,r)=>{t[0]?await t[0](e,async()=>{await Mj(e,t.slice(1),r)}):await r()},"runMiddlewares")});var I3t,x3t,R3t,C3t,_ri,HE,RJ=b(()=>{"use strict";I3t=require("socket.io"),x3t=require("koa-useragent");G();R3t=require("@socket.io/redis-adapter");sf();Xe();C3t=require("uuid");vOe();_ri=s(()=>({_id:(0,C3t.v4)(),email:"user@mail.com",firstName:"Anonymous"}),"anonUser"),HE=class{static{s(this,"BaseSocket")}constructor(t,r,n="/",i){this.app=t,this.path=n,this.io=new I3t.Server(r,{path:n});let o=Rt.buildAuthMiddleware([],{publicAllowed:!0}),a=[x3t.userAgent,o,...i||[]];this.io.use(async(l,c)=>{let u=xJ(this.app,l);try{await Mj(u,a,async()=>{let d=u.user?._id?u.user:_ri(),{_id:f,email:p,firstName:h,lastName:m}=d;l.data={_id:f,email:p,firstName:h,lastName:m,sessionId:l.id,connectedAt:Date.now()},c()})}catch(d){c(d)}}),this.initialise().then(()=>{this.io.on("connection",async l=>{l.on("Heartbeat",async()=>{await this.extendSessionTTL(l.data.sessionId)}),l.on("disconnect",async()=>{await this.onDisconnect(l),await this.leaveRoom(l)}),await this.onConnect(l)})})}async initialise(){let{pub:t,sub:r}=v3t(),n={key:`${Gn.utils.Databases.SOCKET_IO}-${this.path}-pubsub`};this.io.adapter((0,R3t.createAdapter)(t,r,n)),this.redisClient=await Gn.clients.getSocketClient()}getSessionKey(t){return`${this.path}-session:${t}`}getRoomKey(t){return`${this.path}-room:${t}`}async extendSessionTTL(t){let r=this.getSessionKey(t);await this.redisClient?.setExpiry(r,cce)}async getRoomSessionIds(t){if(Array.isArray(t)){let r=t.map(this.getRoomKey.bind(this)),n=await this.redisClient?.bulkGet(r),i=[];return Object.values(n||{}).forEach(o=>{i=i.concat(o)}),i}else return await this.redisClient?.get(this.getRoomKey(t))||[]}async setRoomSessionIds(t,r){await this.redisClient?.store(this.getRoomKey(t),r)}async getRoomSessions(t){if(t){let n=(await this.getRoomSessionIds(t)).map(this.getSessionKey.bind(this)),i=await this.redisClient?.bulkGet(n);return Object.values(i||{}).filter(o=>o!==null)}else return[]}async pruneRoom(t){let r=await this.getRoomSessionIds(t),n=await Promise.all(r.map(o=>this.redisClient?.exists(this.getSessionKey(o)))),i=r.filter((o,a)=>n[a]?!0:(this.io.to(t).emit("UserDisconnect",{sessionId:r[a]}),!1));await this.setRoomSessionIds(t,i)}async joinRoom(t,r){if(!r)return;await this.pruneRoom(r);let n=t.data.room;n&&n!==r&&await this.leaveRoom(t),(!n||n!==r)&&(t.join(r),t.data.room=r);let i=t.data,{sessionId:o}=i,a=this.getSessionKey(o);await this.redisClient?.store(a,i,cce);let l=await this.getRoomSessionIds(r);l.includes(o)||await this.setRoomSessionIds(r,[...l,o]),t.to(r).emit("UserUpdate",{user:i})}async leaveRoom(t){let r=t.data,{room:n,sessionId:i}=r;if(!n)return;t.leave(n),t.data.room=void 0;let o=this.getSessionKey(i);await this.redisClient?.delete(o);let a=await this.getRoomSessionIds(n);await this.setRoomSessionIds(n,a.filter(l=>l!==i)),t.to(n).emit("UserDisconnect",{sessionId:i})}async updateUser(t,r){t.data={...t.data,...r},t.data.room&&await this.joinRoom(t,t.data.room)}async onConnect(t){}async onDisconnect(t){}emit(t,r){this.io.sockets.emit(t,r)}emitToRoom(t,r,n,i,o){let a={...i};o?.includeOriginator||(a.apiSessionId=t.headers?.["x-budibase-session-id"]),this.io.in(r).emit(n,a)}}});async function vri(e){let t=e.appId;!e.user?._id&&!e.user?.userId||!t||!t.startsWith(Ezt)||await SJ(t,e.user)&&await TJ(t,e.user)}async function Eri(e){let t=e.appId;e.method==="GET"||await b3t(t)||await V.doWithDB(t,async r=>{try{let n=await r.get("app_metadata");n.updatedAt=new Date().toISOString(),n.updatedBy=pm(e.user.userId);let i=await r.put(n);n._rev=i.rev,await ft.workspace.invalidateWorkspaceMetadata(t,n),await _3t(t,wri)}catch(n){if(n&&n.status!==409)throw n}})}async function O3t(e){let t=e.appId;if(!t)return;if(!e.isAuthenticated)return e.throw(403,"Session not authenticated");let r=e.headers.referer,n=r?r.includes(t):!1;r&&n&&(await vri(e),await Eri(e))}var wri,k3t=b(()=>{"use strict";G();F();at();sf();wri=30;s(vri,"checkDevAppLocks");s(Eri,"updateAppUpdatedAt");s(O3t,"builderMiddleware")});function dn(e){return new uP("params").mainResource(e).build()}function dP(e,t){return new uP("params").mainResource(e).subResource(t).build()}function fP(e){return new uP("body").mainResource(e).build()}function D3t(e,t){return new uP("body").mainResource(e).subResource(t).build()}var uP,F_=b(()=>{"use strict";uP=class{static{s(this,"ResourceIdGetter")}constructor(t){return this.parameter=t,this.main=null,this.sub=null,this}mainResource(t){return this.main=t,this}subResource(t){return this.sub=t,this}build(){let t=this.parameter,r=this.main,n=this.sub;return(i,o)=>{let a=i.request[t]||i[t];return a==null||(r!=null&&a[r]&&(i.resourceId=a[r]),n!=null&&a[n]&&(i.subResourceId=a[n])),o()}}};s(dn,"paramResource");s(dP,"paramSubResource");s(fP,"bodyResource");s(D3t,"bodySubResource")});function CJ(e){return Sri.test(e.request.url)}function P3t(e){let t=e.userAgent?.browser;return t&&t!=="unknown"}function M3t(e){return e.loginMethod==="api_key"}var Sri,EOe=b(()=>{"use strict";F();Sri=new RegExp(["webhooks/trigger","webhooks/schema","webhooks/discord","webhooks/ms-teams","webhooks/slack"].join("|"));s(CJ,"isWebhookEndpoint");s(P3t,"isBrowser");s(M3t,"isApiKey")});function Tri(e){return e.resourceId!=null}var Ari,N3t,Iri,L3t,Wr,pP,sl=b(()=>{"use strict";G();F();Le();k3t();F_();EOe();s(Tri,"hasResource");Ari=Rt.buildCsrfMiddleware(),N3t=s(async(e,t,r,n)=>{let i=D.getWorkspaceId(),o=r==="globalBuilder",a=r==="creator",l=r==="builder",c=Ft.isGlobalBuilder(e.user),u=await Ft.isCreatorAsync(e.user),d=i?Ft.isBuilder(e.user,i):Ft.hasBuilderPermissions(e.user);if(o&&!c||a&&!u||l&&!d)return e.throw(403,"Not Authorized");d||await Iri(e,t,r,n)},"checkAuthorized"),Iri=s(async(e,t,r,n)=>{let i=e.roleId||it.BUILTIN_ROLE_IDS.PUBLIC,o=await it.getUserRoleHierarchy(i),a="User does not have permission";t.length>0?o.find(c=>t.indexOf(c._id)!==-1)||e.throw(403,a):qt.doesHaveBasePermission(r,n,o)||e.throw(403,a)},"checkAuthorizedResource"),L3t=s((e,t,r={schema:!1},n)=>async(i,o)=>{if(CJ(i)||i.internal)return o();if(!i.user)return i.throw(401,"No user info found");let a=[],l=[],c=t==="read"?"write":"read";if(n&&dn(n)(i,()=>{}),Tri(i)){let{resourceId:u,subResourceId:d}=i,f=await I.permissions.getResourcePerms(u),p=!!d&&await I.permissions.getResourcePerms(d),h=s(m=>{let g=[];return f[m]&&g.push(f[m].role),p&&p[m]&&g.push(p[m].role),g},"getPermLevel");a=h(t),r&&r.schema&&(l=h(c))}if(a.includes(it.BUILTIN_ROLE_IDS.PUBLIC)||l&&l.includes(it.BUILTIN_ROLE_IDS.PUBLIC))return o();if(!i.isAuthenticated)return i.throw(401,"Session not authenticated");(e==="builder"||e==="creator"||e==="globalBuilder")&&await O3t(i);try{await N3t(i,a,e,t)}catch(u){if(r&&r.schema&&t)await N3t(i,l,e,c);else throw u}return Ari(i,o)},"authorized"),Wr=s((e,t,r={schema:!1})=>L3t(e,t,r),"authorizedMiddleware"),pP=s((e,t,r)=>L3t(e,t,void 0,r),"authorizedResource")});var Nj,U3t=b(()=>{"use strict";RJ();sl();G();Nj=class extends HE{static{s(this,"ClientAppWebsocket")}constructor(t,r){super(t,r,"/socket/client",[Wr(qt.BUILDER)])}}});function xri(e){return["string","number","boolean","datetime","json","bigint","options"].includes(e)}function zE(e){let{externalType:t,autocolumn:r,name:n,presence:i,options:o,userDefinedType:a}=e,l="string",c=t.toLowerCase(),u=[];if(c.startsWith("enum"))u.push({external:"enum",internal:"options"});else if(c==="array"&&a&&(a.toLowerCase().includes("json")||a.toLowerCase().includes("jsonb")))u.push({external:a.toLowerCase(),internal:"json"});else if(a&&a in B3t)l=B3t[a];else for(let[f,p]of Object.entries(Lri))c.includes(f)&&u.push({external:f,internal:p});u.length>0&&(l=u.reduce((f,p)=>f.external.length>=p.external.length?f:p).internal);let d;return l==="options"?d={type:l,externalType:t,autocolumn:r,name:n,constraints:{presence:i,inclusion:o??[]}}:d={type:l,externalType:t,autocolumn:r,name:n,constraints:{presence:i}},d.type==="datetime"&&(d.dateOnly=Ori.includes(c),d.timeOnly=kri.includes(c)||c.startsWith("time(")),d.type==="string"&&c==="array"&&(d.subtype="array"),d}function lo(e){return typeof e=="string"?{sql:e}:e}function q_(e){return Ye.isSQL(e)}function Fri(e,t,r,n){if(r&&r[e]){r[e]?.primaryDisplay&&(t.primaryDisplay=r[e].primaryDisplay),r[e]?.created&&(t.created=r[e]?.created),r[e]?.constrained&&(t.constrained=r[e]?.constrained),t.views=r[e].views;let i=r[e].schema;for(let o in i){if(!Object.prototype.hasOwnProperty.call(i,o))continue;let a=i[o],l=a?.type,c=t.schema[o]?.type,u=s((...f)=>xri(c)&&t.schema[o]&&f.includes(c),"keepIfType"),d=!1;switch(l){case"formula":case"ai":case"auto":case"internal":d=!0;break;case"link":d=l==="link"&&n.includes(a.tableId);break;case"string":case"options":case"longform":case"barcodeqr":d=u("string");break;case"number":case"boolean":d=u("boolean","number");break;case"array":case"attachment":case"attachment_single":case"signature_single":case"json":case"bb_reference":case"bb_reference_single":d=u("json","string");break;case"datetime":d=u("datetime","string");break;case"bigint":d=u("bigint","number");break;default:Jt.unreachable(l)}if(d){let f=t.schema[o];if(t.schema[o]={...(0,OJ.merge)((0,OJ.cloneDeep)(f),i[o]),externalType:i[o].externalType||f?.externalType,autocolumn:f?.autocolumn},f?.constraints){let p=f.constraints,h=t.schema[o].constraints;t.schema[o].constraints={...t.schema[o].constraints,inclusion:p.inclusion?.length?p.inclusion:h?.inclusion},p.presence?t.schema[o].constraints.presence=p.presence:h?.presence===!0&&delete t.schema[o].constraints?.presence}}}}return t}function Wg(e,t){let r={},n=Object.values(e).map(i=>i._id);for(let[i,o]of Object.entries(e))r[i]=Fri(i,o,t,n);return Object.entries(r).sort(([i],[o])=>i.localeCompare(o)).reduce((i,[o,a])=>({...i,[o]:a}),{})}function Gg(e){let t=Object.values(JIe),r={};for(let[n,i]of Object.entries(e))(!i.primary||i.primary.length===0)&&(r[n]="Table must have a primary key."),Object.keys(i.schema).find(a=>t.includes(a))&&(r[n]="Table contains invalid columns.");return r}async function H3t(e){let t=await(0,$3t.parseStringPromise)(e,{explicitArray:!1,trim:!0,explicitRoot:!1})||{},r=Object.keys(t);return r.length===1&&Array.isArray(t[r[0]])&&(t=t[r[0]]),{data:t,rawXml:e}}async function z3t(e,t,r){let n,i=0,o=t.includes(".")?t.split(".").slice(1).join("."):"",a=`${(0,j3t.v4)()}.${o}`,l=`${D.getProdWorkspaceId()}/${a}`,c=Me.ObjectStoreBuckets.TEMP,u=q3t.default.fileSync();try{if(await(0,F3t.pipeline)(e.body,SOe.default.createWriteStream(u.name)),e.body){let d=e.headers.get("content-length");d&&(i=parseInt(d,10));let f=await Me.streamUpload({bucket:c,filename:l,stream:SOe.default.createReadStream(u.name),ttl:1,type:e.headers["content-type"]});!i&&f.ContentLength&&(i=f.ContentLength)}return n=await Me.getPresignedUrl(c,l),{data:{size:i,name:a,url:n,extension:o,key:l},info:{code:e.status,size:Ye.formatBytes(i.toString()),time:`${Math.round(performance.now()-r)}ms`}}}finally{u.removeCallback()}}var SOe,OJ,F3t,q3t,j3t,$3t,Rri,Cri,Ori,kri,Dri,Pri,Mri,Nri,Lri,B3t,On,Lj,Uu,Ri,kJ,W3t,G3t,Aa,V3t,Uri,Bri,Yl,K3t=b(()=>{"use strict";G();Xe();F();SOe=H(require("fs")),OJ=require("lodash"),F3t=require("stream/promises"),q3t=H(require("tmp")),j3t=require("uuid"),$3t=require("xml2js");ss();Pt();s(xri,"isPrimitiveType");Rri={integer:"number",int:"number",decimal:"number",smallint:"number",tinyint:"number",real:"number",float:"number",numeric:"number",mediumint:"number",dec:"number",double:"number",fixed:"number","double precision":"number",number:"number",binary_float:"number",binary_double:"number",money:"number",smallmoney:"number"},Cri={timestamp:"datetime",time:"datetime",datetime:"datetime",smalldatetime:"datetime",date:"datetime"},Ori=["date"],kri=["time","time without time zone","time with time zone"],Dri={varchar:"string",char:"string",nchar:"string",nvarchar:"string",ntext:"string",enum:"string",blob:"string",long:"string",text:"string",array:"string"},Pri={boolean:"boolean",bit:"boolean"},Mri={"user-defined":"options"},Nri={json:"json",bigint:"bigint",enum:"options"},Lri={...Rri,...Cri,...Dri,...Pri,...Nri,...Mri},B3t={citext:"string"},On=ar.utils.isExternalTableID,Lj=ar.utils.isExternalTable,Uu=ar.utils.buildExternalTableId,Ri=ar.utils.breakExternalTableId,kJ=ar.utils.generateRowIdField,W3t=ar.utils.isRowId,G3t=ar.utils.convertRowId,Aa=ar.utils.breakRowIdField,V3t=ar.utils.isValidFilter,Uri=se.isProd()&&!se.SELF_HOSTED,Bri=se.isProd()&&se.SELF_HOSTED,Yl=Bri?"host.docker.internal":Uri?"":"localhost";s(zE,"generateColumnDefinition");s(lo,"getSqlQuery");s(q_,"isSQL");s(Fri,"copyExistingPropsOver");s(Wg,"finaliseExternalTables");s(Gg,"checkExternalTables");s(H3t,"handleXml");s(z3t,"handleFileResponse")});var wn=b(()=>{"use strict";K3t()});function Uj({row:e,tableName:t,fieldName:r,isLinked:n}){let i=e[`${t}.${r}`];return i==null&&!n&&(i=e[r]),i}function Q3t(e,t){return Uj({row:e,tableName:t._id,fieldName:"_id",isLinked:!1})}function j_(e,t,r=!1){let n=t.primary;if(!e||!n)return"";let i=[];for(let o of n){let a=Uj({row:e,tableName:t.name,fieldName:o,isLinked:r});a!=null&&i.push(a)}return i.length===0?"":kJ(i)}function qri(e,t){for(let[r,n]of Object.entries(t.schema))if(G4.includes(n.type)&&typeof e[r]=="string")try{e[r]=JSON.parse(e[r])}catch{Ye.schema.isDeprecatedSingleUserColumn(n)||delete e[r]}return e}async function TOe({row:e,source:t,tables:r,isLinked:n,sqs:i}){let o,a=!1;I.views.isView(t)?(o=await I.views.getTable(t.id),a=Ye.views.isCalculationView(t)):o=t;let l={};for(let u of Object.keys(o.schema)){let d=Uj({row:e,tableName:o.name,fieldName:u,isLinked:n});d instanceof Buffer?d=d.toString():d!=null&&(l[u]=d)}if(I.views.isView(t))for(let u of Object.keys(Ye.views.calculationFields(t)))l[u]=e[u];let c=Object.keys(o.schema);if(!i&&!a)l._id=j_(e,o,n),l.tableId=o._id,l._rev=oXe,c=c.concat(vu);else if(!a){c=c.concat(vu);for(let u of[...Us,...c])l[u]=Uj({row:e,tableName:o._id,fieldName:u,isLinked:n})}for(let u of c){let d=o.schema[u];if(d?.type!=="link")continue;let f=r.find(m=>m._id===d.tableId);if(!f)continue;let p=Uj({row:e,tableName:o._id,fieldName:u,isLinked:n}),h=Array.isArray(p)?p:typeof p=="string"?JSON.parse(p):void 0;if(h&&Array.isArray(h)){l[u]=h;let m=f.primaryDisplay||f.primary[0];l[u]=(await Promise.all(l[u].map(g=>TOe({row:g,source:f,tables:r,isLinked:!1,sqs:i})))).sort((g,y)=>{let w=g?.[m],E=y?.[m];if(w){if(!E)return-1}else return 1;return w.localeCompare?w.localeCompare(E):w-E})}}return qri(l,o)}var AOe=b(()=>{"use strict";F();Xe();wn();Le();s(Uj,"extractFieldValue");s(Q3t,"getInternalRowId");s(j_,"generateIdForRow");s(qri,"fixJsonTypes");s(TOe,"basicProcessing")});function Bj(e){return!!e.through}function Y3t(e,t){let r=[];for(let[n,i]of Object.entries(e.schema)){if(i.type!=="link"||!i.tableId)continue;let{tableName:o}=Ri(i.tableId);if(!t[o])continue;let a=t[o];if(!e.primary||!a.primary)continue;let l={tableName:o,column:n};if(Bj(i)&&i.through){let{tableName:c}=Ri(i.through);l.through=c,l.from=i.throughTo||e.primary[0],l.to=i.throughFrom||a.primary[0],l.fromPrimary=e.primary[0],l.toPrimary=a.primary[0]}else(W4(i)||$4(i))&&(l.from=i.foreignKey||e.primary[0],l.to=i.fieldName);r.push(l)}return r}function J3t(e,t){let r=[],n=Object.values(e.schema).filter(o=>o.type==="link"),i=e._id;for(let o of n){if(o.type!=="link")continue;let a=o.tableId,l=$E(i,a),c=i>a;t.find(u=>u._id===a)&&r.push({through:l,column:o.name,tableName:a,fromPrimary:"_id",to:c?"doc2.rowId":"doc1.rowId",from:c?"doc1.rowId":"doc2.rowId",toPrimary:"_id"})}return r}async function X3t(e,t,r){let{relationships:n}=r||{},i=["link","formula","ai"];function o(f,p=[]){return Object.entries(f.schema).filter(([h,m])=>!i.includes(m.type)&&!p.find(g=>g===h)).map(([h])=>h)}s(o,"extractRealFields");function a(f,p=[]){let h=[];return f.primary&&h.push(...f.primary),f.primaryDisplay&&h.push(f.primaryDisplay),ar.utils.isExternalTable(f)||h.push(...Us),h.filter(m=>!p.find(g=>g===m)&&f.schema[m]&&!i.includes(f.schema[m].type))}s(a,"getRequiredFields");let l=[],c=I.views.isView(e),u;c?(u=await I.views.getTable(e.id),l=Object.keys(Ye.views.basicFields(e)).filter(f=>u.schema[f].type!=="link")):(u=e,l=o(e).filter(f=>u.schema[f].visible!==!1));let d=(c?l:Object.keys(u.schema)).some(f=>u.schema[f]?.type==="formula");d&&(l=o(u)),(!c||!Ye.views.isCalculationView(e))&&l.push(...a({...u,primaryDisplay:e.primaryDisplay||u.primaryDisplay},l)),l=l.map(f=>`${u.name}.${f}`);for(let f of Object.values(u.schema)){if(f.type!=="link"||!n||!f.tableId||c&&(!e.schema?.[f.name]||!Ye.views.isVisible(e.schema[f.name]))&&!d)continue;let{tableName:p}=Ri(f.tableId),h=t[p];if(!h)continue;let m=new Set;d?o(h).forEach(y=>m.add(y)):(h.primary?.forEach(y=>m.add(y)),h.primaryDisplay&&m.add(h.primaryDisplay),c&&Object.entries(e.schema?.[f.name]?.columns||{}).filter(([y,w])=>h.schema[y]&&Ye.views.isVisible(w)&&!["link","formula"].includes(h.schema[y].type)).forEach(([y])=>m.add(y)));let g=Array.from(m).filter(y=>!i.includes(h.schema[y].type)).map(y=>`${h.name}.${y}`).filter(y=>!l.includes(y));l.push(...g)}return[...new Set(l)]}function IOe(e){return!Array.isArray(e)||e.length===0||"read"in e[0]&&e[0].read===!0}function Z3t(e){return!IOe(e)}var xOe=b(()=>{"use strict";F();wn();at();Le();Xe();G();s(Bj,"isManyToMany");s(Y3t,"buildExternalRelationships");s(J3t,"buildInternalRelationships");s(X3t,"buildSqlFieldList");s(IOe,"isKnexEmptyReadResponse");s(Z3t,"isKnexRows")});async function _x(e,t={}){if(!e||!e.roles&&!e.userGroups)return e;e=(0,e6t.default)(e),delete e.password;let r=t.appId||D.getWorkspaceId();if(!r)throw new Error("Unable to process user without app ID");if(se.MULTI_TENANCY&&r&&!et.isUserInWorkspaceTenant(r,e))return e=Ft.removePortalUserPermissions(e),e.roleId=it.BUILTIN_ROLE_IDS.PUBLIC,e;let n=[];r&&e?.userGroups?.length&&(n=t.groups?t.groups:await Xo.getBulk(e.userGroups,{enriched:!1}));let i=await Xo.getGroupBuilderAppIds(e,{appId:r,groups:n});if(i.length&&!Ft.isBuilder(e,r)){let o=e.builder?.apps||[];e.builder={apps:[...new Set(o.concat(i))]}}return Ft.isBuilder(e,r)&&(e.roleId=it.BUILTIN_ROLE_IDS.ADMIN),!e.roleId&&r&&e.roles&&(e.roleId=e.roles[V.getProdWorkspaceID(r)]),!e.roleId&&n&&(e.roleId=await Xo.getGroupRoleId(e,r,{groups:n})),e.roleId||(e.roleId=it.BUILTIN_ROLE_IDS.PUBLIC),delete e.roles,e}async function t6t(e,t){let r=await ft.user.getUser({userId:e.user._id});return _x(r,{appId:t})}async function jri(e){return et.getGlobalDB().get(pm(e))}async function DJ(e){let t=D.getWorkspaceId(),r=await jri(e);return _x(r,{appId:t})}async function ROe(e){let t=et.getGlobalDB(),r;return e?r=await t.getMultiple(e,{allowMissing:!0}):r=(await t.allDocs(V.getGlobalUserParams(null,{include_docs:!0}))).rows.map(n=>n.doc),r.filter(n=>n!=null).map(n=>(delete n.password,delete n.forceResetPassword,n))}async function PJ(e){let t=await ROe(e),r=await Xo.fetch();return Promise.all(t.map(n=>_x(n,{groups:r})))}async function r6t(e){let t=await PJ(e.map(r=>r._id));return e.map(r=>({...t.find(i=>i&&r._id?.includes(i._id)),...r}))}var e6t,KE=b(()=>{"use strict";G();Kt();e6t=H(require("lodash/cloneDeep"));at();Pt();s(_x,"processUser");s(t6t,"getCachedSelf");s(jri,"getRawGlobalUser");s(DJ,"getGlobalUser");s(ROe,"getRawGlobalUsers");s(PJ,"getGlobalUsers");s(r6t,"getGlobalUsersFromMetadata")});var COe,hP,MJ=b(()=>{"use strict";at();F();COe=class{static{s(this,"LinkDocumentImpl")}constructor(t,r,n,i,o,a){this._id=kzt(t,i,n,a,r,o),this.type="link",this.tableId=$E(t,i);let l={tableId:t,fieldName:r,rowId:n},c={tableId:i,fieldName:o,rowId:a};this.doc1=l.tableId>c.tableId?l:c,this.doc2=l.tableId>c.tableId?c:l}},hP=COe});async function mP(){let e=D.getWorkspaceDB(),t=await e.get("_design/database"),r={map:function(n){if(n.type==="link"){let i=n.doc1,o=n.doc2;emit([i.tableId,i.rowId],{id:o.rowId,thisId:i.rowId,fieldName:i.fieldName}),i.tableId!==o.tableId&&emit([o.tableId,o.rowId],{id:i.rowId,thisId:o.rowId,fieldName:o.fieldName})}}.toString()};t.views={...t.views,[nf.LINK]:r},await e.put(t)}async function NJ(){let e=D.getWorkspaceDB(),t=await e.get("_design/database"),r={map:`function(doc) {
|
|
675
|
+
"${t}"`),XCe(r),"Error generating columns")}async promptForStructuredOutput(t,r,n){let i=this.aiModel.providerOptions?.(!1),o=s(async a=>(0,mJ.generateText)({model:this.aiModel.chat,messages:this.toModelMessages(t.messages),output:mJ.Output.object({schema:r}),providerOptions:a}),"run");try{return(await HCe({providerOptions:i,run:o})).output}catch(a){let l=[n,this.getErrorMessage(a)].filter(Boolean).join(": ");throw new Y(l,500)}}getErrorMessage(t){if(!t||typeof t!="object")return String(t);let r=t;return typeof r.message=="string"?r.message:String(t)}toModelMessages(t){return t.map(r=>{if(typeof r.content!="string")throw new Y("AI message content must be a string",422);return{role:r.role,content:r.content}})}}});var bzt=b(()=>{"use strict";yzt()});var tn={};ie(tn,{LLMRequest:()=>Ql,TableGeneration:()=>tOe,agentHistoryTitleSystemPrompt:()=>iri,agentSystemPrompt:()=>nri,aiColumnSchemas:()=>XCe,aiTableResponseToTableSchema:()=>KCe,appendAIColumns:()=>QCe,classifyText:()=>Kti,cleanData:()=>Qti,composeAutomationAgentSystemPrompt:()=>tri,composeAutomationAgentToolGuidelines:()=>rri,generateAIColumns:()=>GCe,generateCronExpression:()=>Yti,generateData:()=>VCe,generateJs:()=>eri,generateTables:()=>WCe,generationStructure:()=>JCe,getLLMConfig:()=>uzt,normalizeContentType:()=>Wti,parseResponseFormat:()=>dzt,runWithReasoningEffortFallback:()=>HCe,sanitiseToolName:()=>$ti,searchWeb:()=>Zti,sentimentAnalysis:()=>Xti,summarizeText:()=>zti,tableDataStructuredOutput:()=>ZCe,translate:()=>Jti});var _zt=b(()=>{"use strict";lzt();hJ();$Ce();hJ();zCe();bzt();eOe()});var Kt=b(()=>{"use strict";sxe();UD();UD();Ng();Pg();Q4t();azt();_zt()});function U_(e,t={}){return dm("ta",e,t)}function gJ(){return V.generateTableID()}function Cp(e,t={}){return dm("au",e,t)}function Ozt(){return`au${$r}${yx()}`}function kzt(e,t,r,n,i,o){let a=`${$r}${e}${$r}${t}`,l=`${$r}${r}${$r}${n}`,c=`${$r}${i}${$r}${o}`;return`li${a}${l}${c}`}function uri(e={}){return dm("li",null,e)}async function Dzt(){return(await D.getWorkspaceDB().allDocs(uri({include_docs:!0}))).rows.map(r=>r.doc)}function Pzt(e){return`layout${$r}${e||yx()}`}function Mzt(e,t={}){return dm("layout",e,t)}function Nzt(){return`screen${$r}${yx()}`}function Lzt(e,t={}){return dm("screen",e,t)}function Uzt(){return`wh${$r}${yx()}`}function Bzt(e,t={}){return dm("wh",e,t)}function Fzt({plus:e=!1}={}){return`${e?"datasource_plus":"datasource"}${$r}${yx()}`}function Rj(e,t={}){return dm("datasource",e,t)}function yJ(e){return`query${$r}${e}${$r}${yx()}`}function qzt(e){return`meta_au${$r}${e}`}function jzt(e={}){return dm("meta_au",null,e)}function bJ(e,t={}){return e==null?dm("query",null,t):dm("query",`${e}${$r}`,t)}function nOe(e){return`flag${$r}${e}`}function jE(e,t){return`metadata${$r}${e}${$r}${t}`}function bx(e){return`view${$r}${e}`}function $zt(e={}){return dm("view",null,e)}function $E(e,t){let r=e>t?e:t,n=e>t?t:e;return`${r}${$r}${n}`}function _J(e){return`view${$r}${e}${$r}${yx()}`}function WE(e){return e.type==="link"}function iOe(e){return e.type==="ai"}function wJ(e){return`ra${$r}${e}`}function Wzt(e){return e.replace(new RegExp(`^ra${$r}`),"")}var yx,wzt,$r,q9s,vzt,Ezt,fm,Rp,FE,Szt,Tzt,Azt,nf,_n,xj,Izt,xzt,j9s,Rzt,qE,dm,us,Czt,oP,L_,pm,at=b(()=>{"use strict";G();F();F();yx=gt.newid,wzt={_id:Wa,type:V.BUDIBASE_DATASOURCE_TYPE,name:"Budibase DB",source:"BUDIBASE",config:{}},$r=V.SEPARATOR,q9s=V.StaticDatabases,vzt=V.WORKSPACE_PREFIX,Ezt=V.WORKSPACE_DEV_PREFIX,fm=V.isDevWorkspaceID,Rp=V.isProdWorkspaceID,FE=`ro${$r}${V.InternalTable.USER_METADATA}${$r}`,Szt=`li${$r}${V.InternalTable.USER_METADATA}${$r}`,Tzt=`ro${$r}ta`,Azt=`log_au${$r}`,nf=V.ViewName,_n=V.InternalTable,xj=V.UNICODE_MAX,Izt=V.generateWorkspaceID,xzt=V.getDevWorkspaceID,j9s=V.generateRoleID,Rzt=V.getRoleParams,qE=V.getQueryIndex,dm=V.getDocParams,us=V.getRowParams,Czt=V.generateRowID,oP=V.getUserMetadataParams,L_=V.generateUserMetadataID,pm=V.getGlobalIDFromUserMetadataID;s(U_,"getTableParams");s(gJ,"generateTableID");s(Cp,"getAutomationParams");s(Ozt,"generateAutomationID");s(kzt,"generateLinkID");s(uri,"getLinkParams");s(Dzt,"allLinkDocs");s(Pzt,"generateLayoutID");s(Mzt,"getLayoutParams");s(Nzt,"generateScreenID");s(Lzt,"getScreenParams");s(Uzt,"generateWebhookID");s(Bzt,"getWebhookParams");s(Fzt,"generateDatasourceID");s(Rj,"getDatasourceParams");s(yJ,"generateQueryID");s(qzt,"generateAutomationMetadataID");s(jzt,"getAutomationMetadataParams");s(bJ,"getQueryParams");s(nOe,"generateUserFlagID");s(jE,"generateMetadataID");s(bx,"generateMemoryViewID");s($zt,"getMemoryViewParams");s($E,"generateJunctionTableID");s(_J,"generateViewID");s(WE,"isRelationshipColumn");s(iOe,"isAIColumn");s(wJ,"generateRowActionsID");s(Wzt,"extractTableIdFromRowActionsID")});function dri(e,t){let r;t?r=t.split(","):r=e;for(let n of r)if(!e.includes(n))throw new Error(`Feature: ${n} is not an allowed option`);return r}function GE(){return oOe.includes("automations")}function Vzt(){return oOe.includes("api")}function Hzt(){se.APP_FEATURES&&console.log(`**** APP FEATURES SET: ${oOe.join(", ")} ****`)}var Gzt,oOe,Cj=b(()=>{"use strict";Pt();Gzt=(r=>(r.API="api",r.AUTOMATIONS="automations",r))(Gzt||{});s(dri,"processFeatureEnvVar");oOe=dri(Object.values(Gzt),se.APP_FEATURES);s(GE,"automationsEnabled");s(Vzt,"apiEnabled");s(Hzt,"printFeatures")});function zzt(e){let t=null;switch(e){case"query":t="./query";break;case"automation":t="./automation";break;default:throw"Unknown thread type"}return require.resolve(t)}var aOe,VE,vJ=b(()=>{"use strict";aOe=H(require("worker-farm"));Pt();s(zzt,"typeToFile");VE=class e{static{s(this,"Thread")}static{this.workerRefs=[]}constructor(t,r={timeoutMs:null,count:1}){if(this.type=t,this.count=r.count?r.count:1,this.disableThreading=this.shouldDisableThreading(),this.disableThreading)console.log(`[${se.FORKED_PROCESS_NAME}] skipping worker farm type=${t}`);else{console.log(`[${se.FORKED_PROCESS_NAME}] initialising worker farm type=${t}`);let n={autoStart:!0,maxConcurrentWorkers:this.count,workerOptions:{env:{...process.env,FORKED_PROCESS:"1",FORKED_PROCESS_NAME:t},execArgv:process.execArgv.some(i=>i.startsWith("--enable-source-maps"))?["--enable-source-maps"]:void 0}};r.timeoutMs&&(this.timeoutMs=r.timeoutMs,n.maxCallTime=r.timeoutMs),this.workers=(0,aOe.default)(n,zzt(t),["execute"]),e.workerRefs.push(this.workers)}}shouldDisableThreading(){return!!(se.isTest()||se.DISABLE_THREADING||this.count===0||se.isInThread())}run(t){let r=this.timeoutMs;return new Promise((n,i)=>{function o(a){a.execute(t,(l,c)=>{l&&l.type==="TimeoutError"?i(new Error(`Thread timeout exceeded ${r}ms timeout.`)):l?i(l):n(c)})}s(o,"fire"),this.disableThreading?import(zzt(this.type)).then(a=>{o(a)}):o(this.workers)})}static stopThreads(){return new Promise(t=>{e.workerRefs.length===0&&t();let r=0;function n(){r++,r>=e.workerRefs.length&&t()}s(n,"complete");for(let i of e.workerRefs)aOe.default.end(i,n);e.workerRefs=[]})}static async shutdown(){await e.stopThreads(),console.log("Threads shutdown")}}});function Xzt(){let e=lP.default.join(Me.budibaseTempDir(),"ai-downloads");return aP.default.existsSync(e)||aP.default.mkdirSync(e),e}async function Zzt(e){try{let t=await(0,Kzt.default)(e),r=[...t.url.split(".")].pop().split("?")[0],n=lP.default.resolve(Xzt(),`${Jzt.v4()}${r}`),i=aP.default.createWriteStream(n,{flags:"wx"});await(0,Yzt.promisify)(Qzt.pipeline)(t.body,i);let o=lP.default.basename(n),a=`${D.getProdWorkspaceId()}/attachments/${o}`,l=await Me.upload({bucket:br.APPS,filename:a,path:n,type:"image/jpeg"});return{size:i.bytesWritten,name:o,url:await Me.getAppFileUrl(a),extension:r,key:l.Key}}catch(t){console.error("Error downloading file",t);return}}async function e3t(e){let t=lP.default.resolve(Xzt(),`${e.fileName}${e.extension}`);aP.default.writeFileSync(t,e.content);let r=lP.default.basename(t),n=`${D.getProdWorkspaceId()}/attachments/${r}`,i=await Me.upload({bucket:br.APPS,filename:n,path:t,type:"text/plain"});return{size:aP.default.readFileSync(t).byteLength,name:r,url:await Me.getAppFileUrl(n),extension:e.extension,key:i.Key}}var aP,Kzt,lP,Qzt,Yzt,Jzt,t3t=b(()=>{"use strict";aP=H(require("fs")),Kzt=H(require("node-fetch")),lP=H(require("path")),Qzt=require("stream"),Yzt=require("util"),Jzt=H(require("uuid"));G();ss();s(Xzt,"getTmpPath");s(Zzt,"uploadUrl");s(e3t,"uploadFile")});var r3t,n3t=b(()=>{"use strict";G();({getDispatcher:r3t}=gt)});function s3t(e){return new Promise(t=>setTimeout(t,e))}function a3t(e){for(let t of fri)if((0,lOe.default)(e,t,!0).isValid())return!0;return!1}function l3t(e,t){let r=e.indexOf(t);return r!==-1&&e.splice(r,1),e}function hm(e){return e.replace(/(https?:\/\/)|(\/)+/g,"$1$2")}async function Oj(e,t,r){let n=D.getWorkspaceDB(),i=jE(e,t),o=r(await n.tryGet(i)||{});o._id=i;let a=await n.put(o);return{...o,_id:i,_rev:a.rev}}async function c3t(e,t,r){return Oj(e,t,()=>r)}async function cP(e,t){let r=D.getWorkspaceDB(),n=jE(e,t),i=await r.tryGet(n);i&&await r.remove(i)}function u3t(e){return e.replace(/[\\]/g,"\\\\").replace(/[\b]/g,"\\b").replace(/[\f]/g,"\\f").replace(/[\n]/g,"\\n").replace(/[\r]/g,"\\r").replace(/[\t]/g,"\\t")}function d3t(e){let t=/^\d+\.?\d*$/;return typeof e=="string"&&e.match(t)?parseFloat(e):e}function cOe(e){return typeof e=="string"?e.toLowerCase()==="true":e===!0}var lOe,i3t,aJs,o3t,fri,$c=b(()=>{"use strict";t3t();n3t();G();lOe=H(require("dayjs")),i3t=H(require("dayjs/plugin/customParseFormat"));at();Pt();lOe.default.extend(i3t.default);s(s3t,"wait");aJs=se.isDev,o3t=/^[+-]?([0-9]*[.])?[0-9]+$/g,fri=["MM/DD/YYYY","MM/DD/YY","DD/MM/YYYY","DD/MM/YY","YYYY/MM/DD","YYYY-MM-DD","YYYY-MM-DDTHH:mm","YYYY-MM-DDTHH:mm:ss","YYYY-MM-DDTHH:mm:ss[Z]","YYYY-MM-DDTHH:mm:ss.SSS[Z]"];s(a3t,"isDate");s(l3t,"removeFromArray");s(hm,"checkSlashesInUrl");s(Oj,"updateEntityMetadata");s(c3t,"saveEntityMetadata");s(cP,"deleteEntityMetadata");s(u3t,"escapeDangerousCharacters");s(d3t,"convertBookmark");s(cOe,"isQsTrue")});var dOe={};ie(dOe,{getAppUrl:()=>hri,isWorkspacePublished:()=>uOe});function hri(e){let t;return e?.url?t=encodeURI(e?.url):e?.name&&(t=encodeURI(`${e?.name}`)),t&&(t=`/${t.replace(pri,"")}`.toLowerCase()),t}async function uOe(e){return V.isDevWorkspaceID(e)&&(e=V.getProdWorkspaceID(e)),!!(await V.getWorkspacesByIDs([e])).length}var pri,fOe=b(()=>{"use strict";G();pri=/\/|\\/g;s(hri,"getAppUrl");s(uOe,"isWorkspacePublished")});function mOe(){return pOe||(pOe=new hOe),pOe}async function f3t(e){return await mOe().execute(e)}var pOe,hOe,p3t=b(()=>{"use strict";G();F();fOe();hOe=class extends Es.QueuedProcessor{constructor(){super(Es.JobQueue.DEV_REVERT_PROCESSOR,{maxAttempts:3,removeOnFail:!1,removeOnComplete:!1,maxStalledCount:3,waitForCompletionMs:1e4});this.processFn=async r=>await D.doInWorkspaceContext(r.appId,()=>this.revertApp(r))}static{s(this,"DevRevertProcessor")}async revertApp(r){let{appId:n}=r,i=V.getProdWorkspaceID(n),o=D.getProdWorkspaceDB({skip_setup:!0});if(!await uOe(i))throw new Es.UnretriableError("App must be deployed to be reverted.");let l=await o.get("deployments");if(!l.history||Object.keys(l.history).length===0)throw new Es.UnretriableError("No deployments for app");let c=new V.Replication({source:i,target:n});try{await c.rollback();let u=D.getWorkspaceDB(),d=await u.get("app_metadata");return d.appId=n,d.instance._id=n,await u.put(d),await ft.workspace.invalidateWorkspaceMetadata(n),await Pe.app.reverted(d),{message:"Reverted changes successfully."}}catch(u){throw new Error(`Unable to revert. ${u}`,{cause:u})}finally{await c.close()}}};s(mOe,"devRevertProcessor");s(f3t,"revertDevChanges")});var gOe={};ie(gOe,{init:()=>mri,revertDevChanges:()=>f3t});var mri,h3t=b(()=>{"use strict";p3t();mri=s(async()=>{mOe()},"init")});async function yOe(e){if(!e.name||!e.path)throw new Error("File is not valid - cannot upload.");if(!e.name.endsWith(".tar.gz"))throw new Error("Plugin must be compressed into a gzipped tarball.");let t=gY(e.name.split(".tar.gz")[0]);return await FFt(e.path,t),await IE(t)}var bOe=b(()=>{"use strict";xo();s(yOe,"fileUpload")});async function m3t(){[B_,kj,Dj,Pj,_Oe]=await Promise.all([Gn.Client.init(Gn.utils.Databases.DEV_LOCKS),Gn.Client.init(Gn.utils.Databases.DEBOUNCE),Gn.Client.init(Gn.utils.Databases.FLAGS),Gn.Client.init(Gn.utils.Databases.RECAPTCHA_SESSION),Gn.clients.getSocketClient()]),se.isTest()||(EJ=_Oe.client.duplicate())}async function g3t(){console.log("REDIS SHUTDOWN"),B_&&await B_.finish(),kj&&await kj.finish(),Dj&&await Dj.finish(),Pj&&await Pj.finish(),EJ&&EJ.disconnect(),await Gn.clients.shutdown(),console.log("Redis shutdown")}async function SJ(e,t){let r=await B_.get(e);if(!r)return!0;let n=pm(r._id),i=pm(t._id);return n===i}async function y3t(e){return await B_.bulkGet(e)}async function TJ(e,t){let r=pm(t._id),n={...t,userId:r,_id:r,lockedAt:new Date().getTime()};await B_.store(e,n,gri)}async function AJ(e,t){let r=await B_.get(e);if(!r)return;let n=pm(t._id);if(r._id!==n)throw"User does not hold lock, cannot clear it.";await B_.delete(e)}async function b3t(e){return kj.get(e)}async function _3t(e,t){await kj.store(e,"debouncing",t)}async function wOe(e){let t=await Dj?.get(e);return!!(t&&t.testing)}async function w3t(e,t){await Dj.store(e,{testing:!0},yri);try{return await t()}finally{await B_.delete(e)}}function v3t(){return{pub:_Oe.client,sub:EJ}}async function E3t(){let e=gt.newid();return await Pj.store(e,{verified:!0},bri),e}async function IJ(e){let t=await Pj.get(e);return!!(t&&t.verified)}var gri,yri,bri,B_,kj,Dj,Pj,_Oe,EJ,sf=b(()=>{"use strict";G();at();Pt();gri=600,yri=60,bri=typeof se.RECAPTCHA_SESSION_SECONDS=="string"?parseInt(se.RECAPTCHA_SESSION_SECONDS):se.RECAPTCHA_SESSION_SECONDS;s(m3t,"init");s(g3t,"shutdown");s(SJ,"doesUserHaveLock");s(y3t,"getLocksById");s(TJ,"updateLock");s(AJ,"clearLock");s(b3t,"checkDebounce");s(_3t,"setDebounce");s(wOe,"checkTestFlag");s(w3t,"withTestFlag");s(v3t,"getSocketPubSubClients");s(E3t,"setRecaptchaVerified");s(IJ,"isRecaptchaVerified")});var T3t,A3t,xJ,Mj,vOe=b(()=>{"use strict";T3t=H(require("cookies")),A3t=H(require("http"));G();xJ=s((e,t,r)=>{let n=new A3t.default.ServerResponse(t.request);return{...e.createContext(t.request,n),resourceId:r?.resourceId,path:"/fake",request:{url:"/fake",headers:{"x-budibase-app-id":r?.appId}},cookies:new T3t.default(t.request,n),get:o=>t.request.headers?.[o],throw:(...o)=>{throw new Error(...o?.join(" ")||"Unknown error in socket middleware")},headers:t.request.headers,header:t.request.headers}},"createContext"),Mj=s(async(e,t,r)=>{t[0]?await t[0](e,async()=>{await Mj(e,t.slice(1),r)}):await r()},"runMiddlewares")});var I3t,x3t,R3t,C3t,_ri,HE,RJ=b(()=>{"use strict";I3t=require("socket.io"),x3t=require("koa-useragent");G();R3t=require("@socket.io/redis-adapter");sf();Xe();C3t=require("uuid");vOe();_ri=s(()=>({_id:(0,C3t.v4)(),email:"user@mail.com",firstName:"Anonymous"}),"anonUser"),HE=class{static{s(this,"BaseSocket")}constructor(t,r,n="/",i){this.app=t,this.path=n,this.io=new I3t.Server(r,{path:n});let o=Rt.buildAuthMiddleware([],{publicAllowed:!0}),a=[x3t.userAgent,o,...i||[]];this.io.use(async(l,c)=>{let u=xJ(this.app,l);try{await Mj(u,a,async()=>{let d=u.user?._id?u.user:_ri(),{_id:f,email:p,firstName:h,lastName:m}=d;l.data={_id:f,email:p,firstName:h,lastName:m,sessionId:l.id,connectedAt:Date.now()},c()})}catch(d){c(d)}}),this.initialise().then(()=>{this.io.on("connection",async l=>{l.on("Heartbeat",async()=>{await this.extendSessionTTL(l.data.sessionId)}),l.on("disconnect",async()=>{await this.onDisconnect(l),await this.leaveRoom(l)}),await this.onConnect(l)})})}async initialise(){let{pub:t,sub:r}=v3t(),n={key:`${Gn.utils.Databases.SOCKET_IO}-${this.path}-pubsub`};this.io.adapter((0,R3t.createAdapter)(t,r,n)),this.redisClient=await Gn.clients.getSocketClient()}getSessionKey(t){return`${this.path}-session:${t}`}getRoomKey(t){return`${this.path}-room:${t}`}async extendSessionTTL(t){let r=this.getSessionKey(t);await this.redisClient?.setExpiry(r,cce)}async getRoomSessionIds(t){if(Array.isArray(t)){let r=t.map(this.getRoomKey.bind(this)),n=await this.redisClient?.bulkGet(r),i=[];return Object.values(n||{}).forEach(o=>{i=i.concat(o)}),i}else return await this.redisClient?.get(this.getRoomKey(t))||[]}async setRoomSessionIds(t,r){await this.redisClient?.store(this.getRoomKey(t),r)}async getRoomSessions(t){if(t){let n=(await this.getRoomSessionIds(t)).map(this.getSessionKey.bind(this)),i=await this.redisClient?.bulkGet(n);return Object.values(i||{}).filter(o=>o!==null)}else return[]}async pruneRoom(t){let r=await this.getRoomSessionIds(t),n=await Promise.all(r.map(o=>this.redisClient?.exists(this.getSessionKey(o)))),i=r.filter((o,a)=>n[a]?!0:(this.io.to(t).emit("UserDisconnect",{sessionId:r[a]}),!1));await this.setRoomSessionIds(t,i)}async joinRoom(t,r){if(!r)return;await this.pruneRoom(r);let n=t.data.room;n&&n!==r&&await this.leaveRoom(t),(!n||n!==r)&&(t.join(r),t.data.room=r);let i=t.data,{sessionId:o}=i,a=this.getSessionKey(o);await this.redisClient?.store(a,i,cce);let l=await this.getRoomSessionIds(r);l.includes(o)||await this.setRoomSessionIds(r,[...l,o]),t.to(r).emit("UserUpdate",{user:i})}async leaveRoom(t){let r=t.data,{room:n,sessionId:i}=r;if(!n)return;t.leave(n),t.data.room=void 0;let o=this.getSessionKey(i);await this.redisClient?.delete(o);let a=await this.getRoomSessionIds(n);await this.setRoomSessionIds(n,a.filter(l=>l!==i)),t.to(n).emit("UserDisconnect",{sessionId:i})}async updateUser(t,r){t.data={...t.data,...r},t.data.room&&await this.joinRoom(t,t.data.room)}async onConnect(t){}async onDisconnect(t){}emit(t,r){this.io.sockets.emit(t,r)}emitToRoom(t,r,n,i,o){let a={...i};o?.includeOriginator||(a.apiSessionId=t.headers?.["x-budibase-session-id"]),this.io.in(r).emit(n,a)}}});async function vri(e){let t=e.appId;!e.user?._id&&!e.user?.userId||!t||!t.startsWith(Ezt)||await SJ(t,e.user)&&await TJ(t,e.user)}async function Eri(e){let t=e.appId;e.method==="GET"||await b3t(t)||await V.doWithDB(t,async r=>{try{let n=await r.get("app_metadata");n.updatedAt=new Date().toISOString(),n.updatedBy=pm(e.user.userId);let i=await r.put(n);n._rev=i.rev,await ft.workspace.invalidateWorkspaceMetadata(t,n),await _3t(t,wri)}catch(n){if(n&&n.status!==409)throw n}})}async function O3t(e){let t=e.appId;if(!t)return;if(!e.isAuthenticated)return e.throw(403,"Session not authenticated");let r=e.headers.referer,n=r?r.includes(t):!1;r&&n&&(await vri(e),await Eri(e))}var wri,k3t=b(()=>{"use strict";G();F();at();sf();wri=30;s(vri,"checkDevAppLocks");s(Eri,"updateAppUpdatedAt");s(O3t,"builderMiddleware")});function dn(e){return new uP("params").mainResource(e).build()}function dP(e,t){return new uP("params").mainResource(e).subResource(t).build()}function fP(e){return new uP("body").mainResource(e).build()}function D3t(e,t){return new uP("body").mainResource(e).subResource(t).build()}var uP,F_=b(()=>{"use strict";uP=class{static{s(this,"ResourceIdGetter")}constructor(t){return this.parameter=t,this.main=null,this.sub=null,this}mainResource(t){return this.main=t,this}subResource(t){return this.sub=t,this}build(){let t=this.parameter,r=this.main,n=this.sub;return(i,o)=>{let a=i.request[t]||i[t];return a==null||(r!=null&&a[r]&&(i.resourceId=a[r]),n!=null&&a[n]&&(i.subResourceId=a[n])),o()}}};s(dn,"paramResource");s(dP,"paramSubResource");s(fP,"bodyResource");s(D3t,"bodySubResource")});function CJ(e){let t=e.path||e.request.url.split("?")[0];return Sri.test(t)}function P3t(e){let t=e.userAgent?.browser;return!!t&&t!=="unknown"}function M3t(e){return e.loginMethod==="api_key"}var Sri,EOe=b(()=>{"use strict";F();Sri=new RegExp("^/api/webhooks/(trigger|schema|discord|ms-teams|slack)(/|$)");s(CJ,"isWebhookEndpoint");s(P3t,"isBrowser");s(M3t,"isApiKey")});function Tri(e){return e.resourceId!=null}var Ari,N3t,Iri,L3t,Wr,pP,sl=b(()=>{"use strict";G();F();Le();k3t();F_();EOe();s(Tri,"hasResource");Ari=Rt.buildCsrfMiddleware(),N3t=s(async(e,t,r,n)=>{let i=D.getWorkspaceId(),o=r==="globalBuilder",a=r==="creator",l=r==="builder",c=Ft.isGlobalBuilder(e.user),u=await Ft.isCreatorAsync(e.user),d=i?Ft.isBuilder(e.user,i):Ft.hasBuilderPermissions(e.user);if(o&&!c||a&&!u||l&&!d)return e.throw(403,"Not Authorized");d||await Iri(e,t,r,n)},"checkAuthorized"),Iri=s(async(e,t,r,n)=>{let i=e.roleId||it.BUILTIN_ROLE_IDS.PUBLIC,o=await it.getUserRoleHierarchy(i),a="User does not have permission";t.length>0?o.find(c=>t.indexOf(c._id)!==-1)||e.throw(403,a):qt.doesHaveBasePermission(r,n,o)||e.throw(403,a)},"checkAuthorizedResource"),L3t=s((e,t,r={schema:!1},n)=>async(i,o)=>{if(CJ(i)||i.internal)return o();if(!i.user)return i.throw(401,"No user info found");let a=[],l=[],c=t==="read"?"write":"read";if(n&&dn(n)(i,()=>{}),Tri(i)){let{resourceId:u,subResourceId:d}=i,f=await I.permissions.getResourcePerms(u),p=!!d&&await I.permissions.getResourcePerms(d),h=s(m=>{let g=[];return f[m]&&g.push(f[m].role),p&&p[m]&&g.push(p[m].role),g},"getPermLevel");a=h(t),r&&r.schema&&(l=h(c))}if(a.includes(it.BUILTIN_ROLE_IDS.PUBLIC)||l&&l.includes(it.BUILTIN_ROLE_IDS.PUBLIC))return o();if(!i.isAuthenticated)return i.throw(401,"Session not authenticated");(e==="builder"||e==="creator"||e==="globalBuilder")&&await O3t(i);try{await N3t(i,a,e,t)}catch(u){if(r&&r.schema&&t)await N3t(i,l,e,c);else throw u}return Ari(i,o)},"authorized"),Wr=s((e,t,r={schema:!1})=>L3t(e,t,r),"authorizedMiddleware"),pP=s((e,t,r)=>L3t(e,t,void 0,r),"authorizedResource")});var Nj,U3t=b(()=>{"use strict";RJ();sl();G();Nj=class extends HE{static{s(this,"ClientAppWebsocket")}constructor(t,r){super(t,r,"/socket/client",[Wr(qt.BUILDER)])}}});function xri(e){return["string","number","boolean","datetime","json","bigint","options"].includes(e)}function zE(e){let{externalType:t,autocolumn:r,name:n,presence:i,options:o,userDefinedType:a}=e,l="string",c=t.toLowerCase(),u=[];if(c.startsWith("enum"))u.push({external:"enum",internal:"options"});else if(c==="array"&&a&&(a.toLowerCase().includes("json")||a.toLowerCase().includes("jsonb")))u.push({external:a.toLowerCase(),internal:"json"});else if(a&&a in B3t)l=B3t[a];else for(let[f,p]of Object.entries(Lri))c.includes(f)&&u.push({external:f,internal:p});u.length>0&&(l=u.reduce((f,p)=>f.external.length>=p.external.length?f:p).internal);let d;return l==="options"?d={type:l,externalType:t,autocolumn:r,name:n,constraints:{presence:i,inclusion:o??[]}}:d={type:l,externalType:t,autocolumn:r,name:n,constraints:{presence:i}},d.type==="datetime"&&(d.dateOnly=Ori.includes(c),d.timeOnly=kri.includes(c)||c.startsWith("time(")),d.type==="string"&&c==="array"&&(d.subtype="array"),d}function lo(e){return typeof e=="string"?{sql:e}:e}function q_(e){return Ye.isSQL(e)}function Fri(e,t,r,n){if(r&&r[e]){r[e]?.primaryDisplay&&(t.primaryDisplay=r[e].primaryDisplay),r[e]?.created&&(t.created=r[e]?.created),r[e]?.constrained&&(t.constrained=r[e]?.constrained),t.views=r[e].views;let i=r[e].schema;for(let o in i){if(!Object.prototype.hasOwnProperty.call(i,o))continue;let a=i[o],l=a?.type,c=t.schema[o]?.type,u=s((...f)=>xri(c)&&t.schema[o]&&f.includes(c),"keepIfType"),d=!1;switch(l){case"formula":case"ai":case"auto":case"internal":d=!0;break;case"link":d=l==="link"&&n.includes(a.tableId);break;case"string":case"options":case"longform":case"barcodeqr":d=u("string");break;case"number":case"boolean":d=u("boolean","number");break;case"array":case"attachment":case"attachment_single":case"signature_single":case"json":case"bb_reference":case"bb_reference_single":d=u("json","string");break;case"datetime":d=u("datetime","string");break;case"bigint":d=u("bigint","number");break;default:Jt.unreachable(l)}if(d){let f=t.schema[o];if(t.schema[o]={...(0,OJ.merge)((0,OJ.cloneDeep)(f),i[o]),externalType:i[o].externalType||f?.externalType,autocolumn:f?.autocolumn},f?.constraints){let p=f.constraints,h=t.schema[o].constraints;t.schema[o].constraints={...t.schema[o].constraints,inclusion:p.inclusion?.length?p.inclusion:h?.inclusion},p.presence?t.schema[o].constraints.presence=p.presence:h?.presence===!0&&delete t.schema[o].constraints?.presence}}}}return t}function Wg(e,t){let r={},n=Object.values(e).map(i=>i._id);for(let[i,o]of Object.entries(e))r[i]=Fri(i,o,t,n);return Object.entries(r).sort(([i],[o])=>i.localeCompare(o)).reduce((i,[o,a])=>({...i,[o]:a}),{})}function Gg(e){let t=Object.values(JIe),r={};for(let[n,i]of Object.entries(e))(!i.primary||i.primary.length===0)&&(r[n]="Table must have a primary key."),Object.keys(i.schema).find(a=>t.includes(a))&&(r[n]="Table contains invalid columns.");return r}async function H3t(e){let t=await(0,$3t.parseStringPromise)(e,{explicitArray:!1,trim:!0,explicitRoot:!1})||{},r=Object.keys(t);return r.length===1&&Array.isArray(t[r[0]])&&(t=t[r[0]]),{data:t,rawXml:e}}async function z3t(e,t,r){let n,i=0,o=t.includes(".")?t.split(".").slice(1).join("."):"",a=`${(0,j3t.v4)()}.${o}`,l=`${D.getProdWorkspaceId()}/${a}`,c=Me.ObjectStoreBuckets.TEMP,u=q3t.default.fileSync();try{if(await(0,F3t.pipeline)(e.body,SOe.default.createWriteStream(u.name)),e.body){let d=e.headers.get("content-length");d&&(i=parseInt(d,10));let f=await Me.streamUpload({bucket:c,filename:l,stream:SOe.default.createReadStream(u.name),ttl:1,type:e.headers["content-type"]});!i&&f.ContentLength&&(i=f.ContentLength)}return n=await Me.getPresignedUrl(c,l),{data:{size:i,name:a,url:n,extension:o,key:l},info:{code:e.status,size:Ye.formatBytes(i.toString()),time:`${Math.round(performance.now()-r)}ms`}}}finally{u.removeCallback()}}var SOe,OJ,F3t,q3t,j3t,$3t,Rri,Cri,Ori,kri,Dri,Pri,Mri,Nri,Lri,B3t,On,Lj,Uu,Ri,kJ,W3t,G3t,Aa,V3t,Uri,Bri,Yl,K3t=b(()=>{"use strict";G();Xe();F();SOe=H(require("fs")),OJ=require("lodash"),F3t=require("stream/promises"),q3t=H(require("tmp")),j3t=require("uuid"),$3t=require("xml2js");ss();Pt();s(xri,"isPrimitiveType");Rri={integer:"number",int:"number",decimal:"number",smallint:"number",tinyint:"number",real:"number",float:"number",numeric:"number",mediumint:"number",dec:"number",double:"number",fixed:"number","double precision":"number",number:"number",binary_float:"number",binary_double:"number",money:"number",smallmoney:"number"},Cri={timestamp:"datetime",time:"datetime",datetime:"datetime",smalldatetime:"datetime",date:"datetime"},Ori=["date"],kri=["time","time without time zone","time with time zone"],Dri={varchar:"string",char:"string",nchar:"string",nvarchar:"string",ntext:"string",enum:"string",blob:"string",long:"string",text:"string",array:"string"},Pri={boolean:"boolean",bit:"boolean"},Mri={"user-defined":"options"},Nri={json:"json",bigint:"bigint",enum:"options"},Lri={...Rri,...Cri,...Dri,...Pri,...Nri,...Mri},B3t={citext:"string"},On=ar.utils.isExternalTableID,Lj=ar.utils.isExternalTable,Uu=ar.utils.buildExternalTableId,Ri=ar.utils.breakExternalTableId,kJ=ar.utils.generateRowIdField,W3t=ar.utils.isRowId,G3t=ar.utils.convertRowId,Aa=ar.utils.breakRowIdField,V3t=ar.utils.isValidFilter,Uri=se.isProd()&&!se.SELF_HOSTED,Bri=se.isProd()&&se.SELF_HOSTED,Yl=Bri?"host.docker.internal":Uri?"":"localhost";s(zE,"generateColumnDefinition");s(lo,"getSqlQuery");s(q_,"isSQL");s(Fri,"copyExistingPropsOver");s(Wg,"finaliseExternalTables");s(Gg,"checkExternalTables");s(H3t,"handleXml");s(z3t,"handleFileResponse")});var wn=b(()=>{"use strict";K3t()});function Uj({row:e,tableName:t,fieldName:r,isLinked:n}){let i=e[`${t}.${r}`];return i==null&&!n&&(i=e[r]),i}function Q3t(e,t){return Uj({row:e,tableName:t._id,fieldName:"_id",isLinked:!1})}function j_(e,t,r=!1){let n=t.primary;if(!e||!n)return"";let i=[];for(let o of n){let a=Uj({row:e,tableName:t.name,fieldName:o,isLinked:r});a!=null&&i.push(a)}return i.length===0?"":kJ(i)}function qri(e,t){for(let[r,n]of Object.entries(t.schema))if(G4.includes(n.type)&&typeof e[r]=="string")try{e[r]=JSON.parse(e[r])}catch{Ye.schema.isDeprecatedSingleUserColumn(n)||delete e[r]}return e}async function TOe({row:e,source:t,tables:r,isLinked:n,sqs:i}){let o,a=!1;I.views.isView(t)?(o=await I.views.getTable(t.id),a=Ye.views.isCalculationView(t)):o=t;let l={};for(let u of Object.keys(o.schema)){let d=Uj({row:e,tableName:o.name,fieldName:u,isLinked:n});d instanceof Buffer?d=d.toString():d!=null&&(l[u]=d)}if(I.views.isView(t))for(let u of Object.keys(Ye.views.calculationFields(t)))l[u]=e[u];let c=Object.keys(o.schema);if(!i&&!a)l._id=j_(e,o,n),l.tableId=o._id,l._rev=oXe,c=c.concat(vu);else if(!a){c=c.concat(vu);for(let u of[...Us,...c])l[u]=Uj({row:e,tableName:o._id,fieldName:u,isLinked:n})}for(let u of c){let d=o.schema[u];if(d?.type!=="link")continue;let f=r.find(m=>m._id===d.tableId);if(!f)continue;let p=Uj({row:e,tableName:o._id,fieldName:u,isLinked:n}),h=Array.isArray(p)?p:typeof p=="string"?JSON.parse(p):void 0;if(h&&Array.isArray(h)){l[u]=h;let m=f.primaryDisplay||f.primary[0];l[u]=(await Promise.all(l[u].map(g=>TOe({row:g,source:f,tables:r,isLinked:!1,sqs:i})))).sort((g,y)=>{let w=g?.[m],E=y?.[m];if(w){if(!E)return-1}else return 1;return w.localeCompare?w.localeCompare(E):w-E})}}return qri(l,o)}var AOe=b(()=>{"use strict";F();Xe();wn();Le();s(Uj,"extractFieldValue");s(Q3t,"getInternalRowId");s(j_,"generateIdForRow");s(qri,"fixJsonTypes");s(TOe,"basicProcessing")});function Bj(e){return!!e.through}function Y3t(e,t){let r=[];for(let[n,i]of Object.entries(e.schema)){if(i.type!=="link"||!i.tableId)continue;let{tableName:o}=Ri(i.tableId);if(!t[o])continue;let a=t[o];if(!e.primary||!a.primary)continue;let l={tableName:o,column:n};if(Bj(i)&&i.through){let{tableName:c}=Ri(i.through);l.through=c,l.from=i.throughTo||e.primary[0],l.to=i.throughFrom||a.primary[0],l.fromPrimary=e.primary[0],l.toPrimary=a.primary[0]}else(W4(i)||$4(i))&&(l.from=i.foreignKey||e.primary[0],l.to=i.fieldName);r.push(l)}return r}function J3t(e,t){let r=[],n=Object.values(e.schema).filter(o=>o.type==="link"),i=e._id;for(let o of n){if(o.type!=="link")continue;let a=o.tableId,l=$E(i,a),c=i>a;t.find(u=>u._id===a)&&r.push({through:l,column:o.name,tableName:a,fromPrimary:"_id",to:c?"doc2.rowId":"doc1.rowId",from:c?"doc1.rowId":"doc2.rowId",toPrimary:"_id"})}return r}async function X3t(e,t,r){let{relationships:n}=r||{},i=["link","formula","ai"];function o(f,p=[]){return Object.entries(f.schema).filter(([h,m])=>!i.includes(m.type)&&!p.find(g=>g===h)).map(([h])=>h)}s(o,"extractRealFields");function a(f,p=[]){let h=[];return f.primary&&h.push(...f.primary),f.primaryDisplay&&h.push(f.primaryDisplay),ar.utils.isExternalTable(f)||h.push(...Us),h.filter(m=>!p.find(g=>g===m)&&f.schema[m]&&!i.includes(f.schema[m].type))}s(a,"getRequiredFields");let l=[],c=I.views.isView(e),u;c?(u=await I.views.getTable(e.id),l=Object.keys(Ye.views.basicFields(e)).filter(f=>u.schema[f].type!=="link")):(u=e,l=o(e).filter(f=>u.schema[f].visible!==!1));let d=(c?l:Object.keys(u.schema)).some(f=>u.schema[f]?.type==="formula");d&&(l=o(u)),(!c||!Ye.views.isCalculationView(e))&&l.push(...a({...u,primaryDisplay:e.primaryDisplay||u.primaryDisplay},l)),l=l.map(f=>`${u.name}.${f}`);for(let f of Object.values(u.schema)){if(f.type!=="link"||!n||!f.tableId||c&&(!e.schema?.[f.name]||!Ye.views.isVisible(e.schema[f.name]))&&!d)continue;let{tableName:p}=Ri(f.tableId),h=t[p];if(!h)continue;let m=new Set;d?o(h).forEach(y=>m.add(y)):(h.primary?.forEach(y=>m.add(y)),h.primaryDisplay&&m.add(h.primaryDisplay),c&&Object.entries(e.schema?.[f.name]?.columns||{}).filter(([y,w])=>h.schema[y]&&Ye.views.isVisible(w)&&!["link","formula"].includes(h.schema[y].type)).forEach(([y])=>m.add(y)));let g=Array.from(m).filter(y=>!i.includes(h.schema[y].type)).map(y=>`${h.name}.${y}`).filter(y=>!l.includes(y));l.push(...g)}return[...new Set(l)]}function IOe(e){return!Array.isArray(e)||e.length===0||"read"in e[0]&&e[0].read===!0}function Z3t(e){return!IOe(e)}var xOe=b(()=>{"use strict";F();wn();at();Le();Xe();G();s(Bj,"isManyToMany");s(Y3t,"buildExternalRelationships");s(J3t,"buildInternalRelationships");s(X3t,"buildSqlFieldList");s(IOe,"isKnexEmptyReadResponse");s(Z3t,"isKnexRows")});async function _x(e,t={}){if(!e||!e.roles&&!e.userGroups)return e;e=(0,e6t.default)(e),delete e.password;let r=t.appId||D.getWorkspaceId();if(!r)throw new Error("Unable to process user without app ID");if(se.MULTI_TENANCY&&r&&!et.isUserInWorkspaceTenant(r,e))return e=Ft.removePortalUserPermissions(e),e.roleId=it.BUILTIN_ROLE_IDS.PUBLIC,e;let n=[];r&&e?.userGroups?.length&&(n=t.groups?t.groups:await Xo.getBulk(e.userGroups,{enriched:!1}));let i=await Xo.getGroupBuilderAppIds(e,{appId:r,groups:n});if(i.length&&!Ft.isBuilder(e,r)){let o=e.builder?.apps||[];e.builder={apps:[...new Set(o.concat(i))]}}return Ft.isBuilder(e,r)&&(e.roleId=it.BUILTIN_ROLE_IDS.ADMIN),!e.roleId&&r&&e.roles&&(e.roleId=e.roles[V.getProdWorkspaceID(r)]),!e.roleId&&n&&(e.roleId=await Xo.getGroupRoleId(e,r,{groups:n})),e.roleId||(e.roleId=it.BUILTIN_ROLE_IDS.PUBLIC),delete e.roles,e}async function t6t(e,t){let r=await ft.user.getUser({userId:e.user._id});return _x(r,{appId:t})}async function jri(e){return et.getGlobalDB().get(pm(e))}async function DJ(e){let t=D.getWorkspaceId(),r=await jri(e);return _x(r,{appId:t})}async function ROe(e){let t=et.getGlobalDB(),r;return e?r=await t.getMultiple(e,{allowMissing:!0}):r=(await t.allDocs(V.getGlobalUserParams(null,{include_docs:!0}))).rows.map(n=>n.doc),r.filter(n=>n!=null).map(n=>(delete n.password,delete n.forceResetPassword,n))}async function PJ(e){let t=await ROe(e),r=await Xo.fetch();return Promise.all(t.map(n=>_x(n,{groups:r})))}async function r6t(e){let t=await PJ(e.map(r=>r._id));return e.map(r=>({...t.find(i=>i&&r._id?.includes(i._id)),...r}))}var e6t,KE=b(()=>{"use strict";G();Kt();e6t=H(require("lodash/cloneDeep"));at();Pt();s(_x,"processUser");s(t6t,"getCachedSelf");s(jri,"getRawGlobalUser");s(DJ,"getGlobalUser");s(ROe,"getRawGlobalUsers");s(PJ,"getGlobalUsers");s(r6t,"getGlobalUsersFromMetadata")});var COe,hP,MJ=b(()=>{"use strict";at();F();COe=class{static{s(this,"LinkDocumentImpl")}constructor(t,r,n,i,o,a){this._id=kzt(t,i,n,a,r,o),this.type="link",this.tableId=$E(t,i);let l={tableId:t,fieldName:r,rowId:n},c={tableId:i,fieldName:o,rowId:a};this.doc1=l.tableId>c.tableId?l:c,this.doc2=l.tableId>c.tableId?c:l}},hP=COe});async function mP(){let e=D.getWorkspaceDB(),t=await e.get("_design/database"),r={map:function(n){if(n.type==="link"){let i=n.doc1,o=n.doc2;emit([i.tableId,i.rowId],{id:o.rowId,thisId:i.rowId,fieldName:i.fieldName}),i.tableId!==o.tableId&&emit([o.tableId,o.rowId],{id:i.rowId,thisId:o.rowId,fieldName:o.fieldName})}}.toString()};t.views={...t.views,[nf.LINK]:r},await e.put(t)}async function NJ(){let e=D.getWorkspaceDB(),t=await e.get("_design/database"),r={map:`function(doc) {
|
|
676
676
|
if (doc._id.startsWith("${$ri}")) {
|
|
677
677
|
emit([doc.workspaceAppId, doc._id], {
|
|
678
678
|
id: doc._id,
|