@budibase/server 3.23.10 → 3.23.11
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/builder/assets/{easymde-92d28041.js → easymde-ad68176c.js} +1 -1
- package/builder/assets/{index-25de6765.css → index-68c7076a.css} +1 -1
- package/builder/assets/{index-200c1478.js → index-d2c74196.js} +3 -3
- package/builder/index.html +2 -2
- 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/src/integrations/rest.ts +31 -49
- package/src/integrations/tests/rest.spec.ts +44 -1
package/dist/query.js
CHANGED
|
@@ -952,7 +952,7 @@ Instructions: ${e.instructions}
|
|
|
952
952
|
Generate the content based on these instructions. Format appropriately for a ${e.contentType}.`),o=(await t.prompt(n))?.message?.trim();return o?{response:o,success:!0}:{success:!1,response:"Generate Text AI Step Failed: AI did not return any content."}}catch(t){return{success:!1,response:tr(t)}}}a(mit,"run");function zkr(e){switch(e){case"email":return"You are writing an email. Include an appropriate, greeting, body, and signature.";case"document":return"You are writing a formal document. Include appropriate headings, sections, and formatting.";case"blog_post":return"You are writing a blog post. Include an engaging title, introduction, body with subheadings, and conclusion.";case"chat_message":return"You are writing a chat message. Keep it conversational, concise, and appropriate for instant messaging.";case"letter":return"You are writing a letter. Include a date, recipient address, greeting, body, complimentary close, and signature.";case"proposal":return"You are writing a proposal. Include an executive summary, problem statement, proposed solution, benefits, and conclusion.";case"other":return"You are generating text content.";default:return Ut.unreachable(e)}}a(zkr,"getContentTypePrompt");var git=ie(require("node-fetch"));async function Gkr(e,t,r){let n=await(0,git.default)(e);if(!n.ok)throw new Error(`Failed to fetch file from URL: ${n.statusText}`);let i=n.body,o=n.headers.get("content-type")||t,s=`document.${t}`;return await r.uploadFile(i,s,o)}a(Gkr,"processUrlFile");async function Hkr(e,t){let r=gt.ObjectStoreBuckets.APPS,{stream:n}=await gt.getReadStream(r,e.key),i=e.name||"document";return await t.uploadFile(n,i,e.extension)}a(Hkr,"processAttachmentFile");async function Vkr(e){try{return JSON.parse(e.message).data}catch(t){throw console.error("Error parsing JSON response:",t),new Error("Could not parse AI response as valid JSON.")}}a(Vkr,"parseAIResponse");async function yit({inputs:e}){if(!e.file||!e.schema)return{success:!1,data:{},response:"Extract Document Data AI Step Failed: File and Schema are required."};try{let t=await Hn.getLLMOrThrow(),r;if(e.source==="URL"&&typeof e.file=="string")r=await Gkr(e.file,e.fileType,t);else if(e.source==="Attachment"&&typeof e.file!="string")r=await Hkr(e.file,t);else throw new Error("Invalid file input \u2013 source and file type do not match");let n=Hn.extractFileData(e.schema,r),i=await t.prompt(n);return{data:await Vkr(i),success:!0}}catch(t){return console.error("Document extraction error:",t),{success:!1,data:{},response:tr(t)}}}a(yit,"run");async function bit({inputs:e,context:t}){let{value:r}=e;if(r==null)return{success:!1,response:{message:"Invalid inputs"}};r=r.trim();try{return{success:!0,value:An(e.value,t,{noThrow:!1})}}catch(n){return{success:!1,response:tr(n)}}}a(bit,"run");var Zae={SEND_EMAIL_SMTP:fnt,CREATE_ROW:bnt,GET_ROW:nit,UPDATE_ROW:vnt,DELETE_ROW:wnt,QUERY_ROWS:rit,OUTGOING_WEBHOOK:qnt,EXECUTE_SCRIPT:Ant,EXECUTE_SCRIPT_V2:Rnt,EXECUTE_QUERY:Mnt,API_REQUEST:jnt,SERVER_LOG:$nt,DELAY:eit,FILTER:Znt,COLLECT:iit,TRIGGER_AUTOMATION_RUN:ait,OPENAI:uit,CLASSIFY_CONTENT:fit,PROMPT_LLM:pit,TRANSLATE:dit,SUMMARISE:hit,GENERATE_TEXT:mit,EXTRACT_FILE_DATA:yit,EXTRACT_STATE:bit,discord:Wnt,slack:Hnt,zapier:Knt,integromat:Xnt,n8n:Ynt},vit={SEND_EMAIL_SMTP:zt.steps.sendSmtpEmail.definition,CREATE_ROW:zt.steps.createRow.definition,GET_ROW:zt.steps.getRow.definition,UPDATE_ROW:zt.steps.updateRow.definition,DELETE_ROW:zt.steps.deleteRow.definition,QUERY_ROWS:zt.steps.queryRows.definition,OUTGOING_WEBHOOK:zt.steps.outgoingWebhook.definition,EXECUTE_SCRIPT:zt.steps.executeScript.definition,EXECUTE_SCRIPT_V2:zt.steps.executeScriptV2.definition,EXECUTE_QUERY:zt.steps.executeQuery.definition,API_REQUEST:zt.steps.apiRequest.definition,SERVER_LOG:zt.steps.serverLog.definition,DELAY:zt.steps.delay.definition,FILTER:zt.steps.filter.definition,LOOP:zt.steps.loop.definition,COLLECT:zt.steps.collect.definition,TRIGGER_AUTOMATION_RUN:zt.steps.triggerAutomationRun.definition,BRANCH:zt.steps.branch.definition,CLASSIFY_CONTENT:zt.steps.classifyText.definition,PROMPT_LLM:zt.steps.promptLLM.definition,TRANSLATE:zt.steps.translate.definition,SUMMARISE:zt.steps.summarise.definition,GENERATE_TEXT:zt.steps.generate.definition,EXTRACT_FILE_DATA:zt.steps.extract.definition,EXTRACT_STATE:zt.steps.extractState.definition,LOOP_V2:zt.steps.loopV2.definition,discord:zt.steps.discord.definition,slack:zt.steps.slack.definition,zapier:zt.steps.zapier.definition,integromat:zt.steps.make.definition,n8n:zt.steps.n8n.definition};Oe.SELF_HOSTED&&(Zae.EXECUTE_BASH=lit,vit.EXECUTE_BASH=zt.steps.bash.definition,Oe.isTest()&&(vit.OPENAI=zt.steps.openai.definition));async function wit(e){if(Zae[e]!=null)return Zae[e];if(Oe.SELF_HOSTED){let r=(await G.plugins.fetch("automation")).find(n=>n.schema.schema.stepId===e);if(!r)throw new Error(`Unable to find action implementation for "${e}"`);return(await BJe(r)).action}}a(wit,"getAction");var Eit=ie(require("object-sizeof"));var _it=5,Jkr=1024*1024;function Xkr(e){let t=`[removed] - max results size of ${_it}MB exceeded`;for(let r of e.steps)r.inputs={message:t},r.outputs={message:t,success:r.outputs.success}}a(Xkr,"sanitiseResults");async function Sit(e,t){if(Oe.DISABLE_AUTOMATION_LOGS)return;(0,Eit.default)(t)/Jkr>_it&&Xkr(t);try{await q_.logs.storeLog(e,t)}catch(n){n.status===413&&n.request?.data&&(delete n.request.data,n.request.data={message:"removed due to large size"}),kt.logAlert("Error writing automation log",n)}}a(Sit,"storeLog");async function xit(e){let t=await q_.logs.oldestLogDate();for(let r of e)if(r.automationErrors)for(let[n,i]of Object.entries(r.automationErrors)){let o=[];for(let s of i){if(!s)continue;s.split(ne.SEPARATOR)[2]>t&&o.push(s)}r.automationErrors[n]=o}return e}a(xit,"checkAppMetadata");var yCr=ie(require("dd-trace"));var Tit=(r=>(r.API="api",r.AUTOMATIONS="automations",r))(Tit||{});function Zkr(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}a(Zkr,"processFeatureEnvVar");var eCr=Zkr(Object.values(Tit),Oe.APP_FEATURES);function Ait(){return eCr.includes("automations")}a(Ait,"automationsEnabled");var cCr=require("@bull-board/api"),lCr=require("@bull-board/api/bullAdapter"),fCr=require("@bull-board/koa");var KB=ie(require("dd-trace"));var tCr=a(async()=>{let e=await zYe(),t=[];for(let n of e)if(!n.tableId&&!n.tableId){let i=new OI(n.doc1.tableId,n.doc1.fieldName,n.doc1.rowId,n.doc2.tableId,n.doc2.fieldName,n.doc2.rowId);i._id=n._id,i._rev=n._rev,t.push(i)}let r=z.getWorkspaceDB();t.length&&await r.bulkDocs(t),await G.tables.sqs.syncDefinition()},"migration"),Rit=tCr;var rCr=a(async()=>{let e=await G.screens.fetch(),t=await G.workspaces.metadata.get(),r=await G.workspaceApps.fetch(z.getWorkspaceDB()),[n]=r;n||(n=await G.workspaceApps.create({name:t.name,url:"/",navigation:t.navigation,isDefault:!0}));let i=z.getWorkspaceDB(),o=e.filter(u=>!u.workspaceAppId).map(u=>({...u,workspaceAppId:n._id}));for(let u of r)u.url||o.push({...u,url:u.urlPrefix||"/",urlPrefix:void 0});let s=await i.get("_design/database");s.views?.screen_routes_2&&s.views.screen_routes_2.version===void 0&&(delete s.views?.screen_routes_2,o.push(s)),await i.bulkDocs(o)},"migration"),Oit=rCr;var nCr=a(async()=>{let t=(await G.workspaceApps.fetch()).filter(r=>r.isDefault);if(t.length>1){let[r,...n]=t.sort((u,c)=>c.updatedAt.localeCompare(u.updatedAt)),i=z.getWorkspaceDB(),o=[],s=await G.screens.fetch();for(let u of n)o.push({...u,_deleted:!0}),o.push(...s.filter(c=>c.workspaceAppId===u._id).map(c=>({...c,workspaceAppId:r._id})));await i.bulkDocs(o)}},"migration"),Iit=nCr;var eoe=[{id:"20240604153647_initial_sqs",func:Rit},{id:"20250618162639_workspace_apps",func:Oit},{id:"20250729134531_workspace_cleanups",func:Iit}];var iCr=gi.fromDays(1).toSeconds();async function toe(e){return ne.doWithDB(e,t=>t.get("_design/migrations"),{skip_setup:!0})}a(toe,"getFromDB");var VB=a(e=>`appmigrations_${K.VERSION}_${e}`,"getWorkspaceMigrationCacheKey");async function roe(e){let t=VB(e),r=await jt.get(t);if(r)return r;try{r=(await toe(e)).version||""}catch(n){if(n.status!==404)throw n;r=""}return r&&await jt.store(t,r,iCr),r}a(roe,"getWorkspaceMigrationVerions");async function kit({workspaceId:e,version:t,skipHistory:r}){let n=ne.getDB(e),i;try{i=await toe(e)}catch(u){if(u.status!==404)throw u;i={_id:"_design/migrations",version:"",initialVersion:t,history:{}},await n.put(i),i=await toe(e)}let o={...i,version:t};r||(o.history[t]={runAt:new Date().toISOString()}),await n.put(o);let s=VB(e);await jt.destroy(s)}a(kit,"updateWorkspaceMigrationMetadata");async function Cit(e,t){if(Oe.isTest()&&Oe.SKIP_MIGRATION_LOCKS_IN_TESTS)return console.log("Bypassing lock for in test environment"),t();console.log(`Acquiring app migration lock for "${e}"`);let r=ne.getProdWorkspaceID(e),{result:n}=await $c.doWithLock({name:"app_migrations",type:"auto_extend",resource:r},async()=>(console.log(`Migration lock acquired for app "${r}"`),await t()));return n}a(Cit,"doInMigrationLock");async function Dit(e,t){let r=await roe(e),n=t.findIndex(i=>i.id===r);return t.slice(n+1)}a(Dit,"getPendingMigrationsForWorkspace");function oCr(e){return Object.values(e).flatMap(t=>t).map(t=>t.id)}a(oCr,"getAllPendingMigrationIds");function sCr(e,t){return e.filter(r=>t.includes(r.id))}a(sCr,"getUniquePendingMigrations");async function Pit({migrationId:e,migrationFunc:t,workspaceId:r}){await KB.default.trace("runMigrationForApp",async n=>{n.addTags({appId:r,migrationId:e}),await z.doInWorkspaceMigrationContext(r,async()=>{console.log(`Running migration "${e}" for app "${r}"`),await t(),console.log(`Migration "${e}" ran for app "${r}"`)})})}a(Pit,"runMigrationForApp");async function uCr(e){await KB.default.trace("runMigrationForApp",async t=>{t.addTags({appId:e}),await z.doInWorkspaceMigrationContext(e,async()=>{await G.workspaces.syncWorkspace(e),console.log(`Workspace synchronized for dev "${e}"`)})})}a(uCr,"syncDevApp");async function Nit(e,t){await z.doInWorkspaceMigrationContext(e,()=>kit({workspaceId:e,version:t}))}a(Nit,"updateMigrationVersion");async function noe(e,t=eoe){console.log(`Processing workspace migration for "${e}"`),await KB.default.trace("runMigrationForApp",async r=>{r.addTags({appId:e});try{await z.doInWorkspaceContext(e,()=>Cit(e,async()=>{let n=ne.getDevWorkspaceID(e),i=ne.getProdWorkspaceID(e),o=await G.workspaces.isWorkspacePublished(i),s=o?i:n;console.log(`Starting workspace migration for "${s}"`);let u={[n]:await Dit(n,t),[i]:o?await Dit(i,t):[]};function c(d,h){return u[h].some(m=>m.id===d)}a(c,"needsToRun");let l=oCr(u),f=sCr(t,l);r.addTags({migrationsToRun:f.length}),console.log(`Workspace migrations to run for "${s}" - ${f.map(d=>d.id).join(",")}`);let p=0;for(let{id:d,func:h,disabled:m}of f){if(m){console.log(`Migration ${d} is disabled, stopping migration process`);return}let g=`(${++p}/${f.length})`;console.info(`Running migration ${d}... ${g}`,{migrationId:d,workspaceId:s});let y=c(d,s),b=o&&c(d,n);y&&await Pit({migrationId:d,migrationFunc:h,workspaceId:s}),b&&(await uCr(n),await Pit({migrationId:d,migrationFunc:h,workspaceId:n})),y&&await Nit(s,d),b&&await Nit(n,d)}console.log(`Workspace migration for "${s}" processed`)}))}catch(n){throw kt.logAlert("Failed to run workspace migration",n),n}})}a(noe,"processMigrations");var Lit=3;var qZn=new $a.BudibaseQueue($a.JobQueue.APP_MIGRATION,{jobOptions:{attempts:Lit,removeOnComplete:!0,removeOnFail:!0},maxStalledCount:Lit,removeStalledCb:async e=>{kt.logAlert(`App migration failed, queue job ID: ${e.id} - reason: ${e.failedReason}`)}});var sS=new $a.BudibaseQueue($a.JobQueue.AUTOMATION,{removeStalledCb:e=>Fit(e),jobTags:e=>({"automation.id":e.automation._id,"automation.name":e.automation.name,"automation.appId":e.automation.appId,"automation.createdAt":e.automation.createdAt,"automation.trigger":e.automation.definition.trigger.stepId})});var dCr=require("mailparser"),hCr=require("html-to-text");var mCr=require("imapflow");var bCr=require("lodash");var vCr;Ait()&&(vCr=new oS(aS.AUTOMATION));async function Uit(e){let t=await sS.getBullQueue().getRepeatableJobs();for(let r of t)r.id===e&&await sS.getBullQueue().removeRepeatableByKey(r.key);console.log(`jobId=${e} disabled`)}a(Uit,"disableCronById");var Mit=5,ioe=class{static{a(this,"AutomationEmitter")}constructor(t){this.chainCount=t,this.metadata={automationChainCount:t}}async getMaxAutomationChain(){let n=(await z.getWorkspaceDB().get("app_metadata"))?.automations?.chainAutomations;return n===!0?Mit:Oe.isTest()?0:n===void 0&&Oe.SELF_HOSTED?Mit:0}async emitRow({eventName:t,appId:r,row:n,table:i,oldRow:o,user:s}){let u=await this.getMaxAutomationChain();this.chainCount>=u||mB({emitter:Lb,eventName:t,appId:r,row:n,table:i,oldRow:o,metadata:this.metadata,user:s})}async emitTable(t,r,n){let i=await this.getMaxAutomationChain();this.chainCount>=i||gB({emitter:Lb,eventName:t,appId:r,table:n,metadata:this.metadata})}},jit=ioe;ld.threadSetup();var ECr=zt.triggers.definitions.CRON.stepId,_Cr={success:!0,status:"stopped"};function aoe(e,t,r){if(e.isLegacyLoop){t.items=zie(t.items);let n=e?.inputs?.children?.[0],i=n?.id||e.id,o=n?.stepId||e.stepId,s=r||n?.inputs||e.inputs;return{id:i,stepId:o,inputs:s,outputs:{success:!0,...t}}}return{id:e.id,stepId:e.stepId,inputs:r||e.inputs,outputs:{success:!0,...t}}}a(aoe,"stepSuccess");function uS(e,t,r){if(e.isLegacyLoop){t.items=zie(t.items);let n=e?.inputs?.children?.[0],i=n?.id||e.id,o=n?.stepId||e.stepId,s=r||n?.inputs||e.inputs;return{id:i,stepId:o,inputs:s,outputs:{success:!1,...t}}}return{id:e.id,stepId:e.stepId,inputs:r||e.inputs,outputs:{success:!1,...t}}}a(uS,"stepFailure");function SCr(e){return{id:e.id,stepId:e.stepId,inputs:e.inputs,outputs:_Cr}}a(SCr,"stepStopped");async function xCr(e,t){let r={},n=a(o=>{let s=(0,tk.cloneDeep)(o);for(let u of Object.values(s))if(u)if(bse(u))u.conditions=u.conditions.map(n);else for(let[c,l]of Object.entries(u))r[c]=An(c,e),typeof l=="string"&&ru(l).length>0&&(u[c]=An(l,e));return s},"evaluateBindings");return Lr.runQuery([r],n(t.condition)).length>0}a(xCr,"branchMatches");async function TCr(e){e.env=await cd();try{let{config:t}=await ii.getSettingsConfigDoc();e.settings={url:t.platformUrl,logo:t.logoUrl,company:t.company}}catch{e.settings={}}}a(TCr,"enrichBaseContext");function ACr(e,t){e.trigger.outputs={...e.trigger.outputs,...t},e.steps[0]=e.trigger}a(ACr,"setTriggerOutput");var QB=class{static{a(this,"Orchestrator")}constructor(t){this.job=t,this.stopped=!1,this.job.data.automation=Ytt(t.data.automation);let r=t.data.event.metadata?.automationChainCount||0;this.emitter=new jit(r+1)}get automation(){return this.job.data.automation}get appId(){return this.job.data.event.appId}isCron(){return this.automation.definition.trigger.stepId===ECr}async stopCron(t,r){if(!this.isCron())return;let n=`CRON disabled reason=${t} - ${this.appId}/${this.automation._id}`;kt.logWarn(n),await Uit(this.job.id);let{result:i}=r||{};i&&(ACr(i,{success:!1,status:"stopped_error"}),i.status="stopped_error",await this.logResult(i))}async logResult(t){await Sit(this.automation,t)}async getMetadata(){let t=KYe(this.automation._id);return await z.getWorkspaceDB().tryGet(t)||{_id:t,errorCount:0}}async incrementErrorCount(){let t=z.getWorkspaceDB(),r;for(let n=0;n<10;n++){let i=await this.getMetadata();i.errorCount||=0,i.errorCount++;try{return await t.put(i),i.errorCount}catch(o){r=o,await Ye.wait(1e3+Math.random()*1e3)}}kt.logAlertWithInfo("Failed to update error count in automation metadata",t.name,this.automation._id,r)}isProd(){return JM(this.appId)}hasErrored(t){return t._error===!0}async execute(){return await qb.default.trace("execute",async t=>{t.addTags({appId:this.appId,automationId:this.automation._id});let r=(0,tk.cloneDeep)(this.job.data);delete r.event.appId,delete r.event.metadata,this.isCron()&&!r.event.timestamp&&(r.event.timestamp=Date.now());let n={id:r.automation.definition.trigger.id,stepId:r.automation.definition.trigger.stepId,inputs:null,outputs:r.event},i={trigger:n,steps:[n],status:"success"},o={trigger:n.outputs,steps:{0:n.outputs},stepsByName:{},stepsById:{},user:n.outputs.user,state:{},_error:!1,_stepIndex:1,_stepResults:[]};await TCr(o);let s=this.job.data.event.timeout||Oe.AUTOMATION_THREAD_TIMEOUT,u=[];try{u=await Ye.withTimeout(s,()=>this.executeSteps(o,r.automation.definition.steps)),this.stopped?i.status="stopped":this.hasErrored(o)&&(i.status="error")}catch(l){if(l.errno==="ETIME")t.addTags({timeout:!0}),i.status="timed_out",u=o._stepResults;else throw l}i.steps.push(...u);let c=0;return this.isProd()&&this.isCron()&&this.hasErrored(o)&&(c=await this.incrementErrorCount()||0),c>=rJe?(await this.stopCron("errors",{result:i}),t?.addTags({shouldStop:!0})):await this.logResult(i),Object.keys(o?.state||{}).length>0&&(i.state=o.state),i})}async executeSteps(t,r){return await qb.default.trace("executeSteps",async()=>{let n=0,i=[];function o(s,u,c=!1){s.stepId==="EXTRACT_STATE"&&!c&&(t.state??={},t.state[u.inputs.key]=u.outputs.value),t.steps[s.id]=u.outputs,t.steps[s.name||s.id]=u.outputs,t.stepsById[s.id]=u.outputs,t.stepsByName[s.name||s.id]=u.outputs,t.previous=u.outputs,t._stepIndex||=0,t.steps[t._stepIndex]=u.outputs,t._stepIndex++,u.outputs.success===!1&&(t._error=!0),t._stepResults.push(u),i.push(u)}for(a(o,"addToContext");n<r.length&&!this.stopped;){let s=r[n];switch(s.stepId){case"BRANCH":{let u=await this.executeBranchStep(t,s);t._stepResults.push(...u),i.push(...u),n++;break}case"LOOP_V2":{let u=await this.executeLoopStep(t,s);if(s.isLegacyLoop){let c=s.inputs.children?.[0];c&&o(c,u,!0)}else o(s,u,!0);n++;break}default:{o(s,await Wn.addAction(async()=>{let u=await this.executeStep(t,s);return s.stepId==="EXTRACT_STATE"&&(t.state??={},t.state[u.inputs.key]=u.outputs.value),St.action.automationStepExecuted({stepId:s.stepId}),u})),n++;break}}}return i})}async executeLoopStep(t,r){return await qb.default.trace("executeLoopStep",async n=>{let i=(0,tk.cloneDeep)(r.inputs.children)||[],o=r.inputs;await QM(o,t);let s=Htt(r),u=(t._loopDepth||0)+1;t._loopDepth=u;try{let c=0,l=[];try{l=Gtt(r)}catch{return n.addTags({status:"INCORRECT_TYPE",iterations:c}),uS(r,{status:"INCORRECT_TYPE"})}let p=r.isLegacyLoop?Number.MAX_SAFE_INTEGER:Vtt(r),d=Ktt(i,p);for(;c<l.length;c++){let m=l[c];if(c===s)return n.addTags({status:"max_iterations_reached",iterations:c}),uS(r,PI(d,"max_iterations_reached",c));if(Wtt(r,m))return n.addTags({status:"FAILURE_CONDITION_MET",iterations:c}),uS(r,PI(d,"FAILURE_CONDITION_MET",c));let g=t.loop;t.loop={currentItem:m};try{let y=t._stepIndex,b=await this.executeSteps(t,i);t._stepIndex=y;for(let w of b)i.some(T=>T.id===w.id)&&Qtt(d,w,c);if(b.some(w=>w.outputs.success===!1))return uS(r,PI(d,void 0,void 0,!0))}finally{t.loop=g}}let h=c===0?"no_iterations":void 0;return aoe(r,PI(d,h,c))}finally{t._loopDepth=u-1}})}async executeBranchStep(t,r){return await qb.default.trace("executeBranchStep",async n=>{let{branches:i,children:o}=r.inputs;for(let s of i)if(await xCr(t,s))return n.addTags({branchName:s.name,branchId:s.id}),[aoe(r,{branchName:s.name,status:`${s.name} branch taken`,branchId:`${s.id}`}),...await this.executeSteps(t,o?.[s.id]||[])];return n.addTags({status:"No branch condition met"}),[uS(r,{status:"No branch condition met"})]})}async executeStep(t,r){return await qb.default.trace(r.stepId,async n=>{if(n.addTags({step:{stepId:r.stepId,id:r.id,name:r.name,type:r.type,title:r.stepTitle,internal:r.internal,deprecated:r.deprecated},inputsKeys:Object.keys(r.inputs)}),this.stopped)return n.addTags({stopped:!0}),SCr(r);let i=await wit(r.stepId);if(i==null)throw new Error(`Cannot find automation step by name ${r.stepId}`);let o=(0,tk.cloneDeep)(r.inputs);r.stepId!=="EXECUTE_SCRIPT_V2"&&r.stepId!=="EXTRACT_STATE"&&(o=await QM(o,t)),o=$ie(o,r.schema.inputs.properties);let s;try{s=await qb.default.trace("fn",()=>i({inputs:o,appId:this.appId,emitter:this.emitter,context:t}))}catch(u){return uS(r,{status:"error",error:tr(u)})}return r.stepId==="FILTER"&&"result"in s&&s.result===!1&&(this.stopped=!0,s.status="stopped"),n.addTags({outputsKeys:Object.keys(s)}),aoe(r,s,o)})}};async function Bit(e){let t=e.data.event.appId;if(!t)throw new Error("Unable to execute, event doesn't contain app ID.");return await z.doInWorkspaceContext(t,async()=>{await z.ensureSnippetContext();let r=await cd();return await z.doInEnvironmentContext(r,async()=>new QB(e).execute())})}a(Bit,"executeInThread");var Fit=a(async e=>{let t=e.data.event.appId;if(!t)throw new Error("Unable to execute, event doesn't contain app ID.");await z.doInWorkspaceContext(t,async()=>{await new QB(e).stopCron("stalled")})},"removeStalled");var ari=zt.triggers.definitions,qit={removeOnComplete:!0,removeOnFail:!0};async function RCr(){return(await z.getWorkspaceDB().allDocs(sm(null,{include_docs:!0}))).rows.map(r=>r.doc)}a(RCr,"getAllAutomations");async function OCr(e,t){let r=e.row.tableId;if(e.appId==null)throw`No appId specified for ${t} - check event emitters.`;!r||!await Cae(r)||await z.doInWorkspaceContext(e.appId,async()=>{let n=await RCr();n=n.filter(i=>{let o=i.definition.trigger,s=o?.inputs;return o&&o.event===t&&!i.disabled&&s?.tableId===e.row.tableId});for(let i of n){if(!Oe.ALLOW_DEV_AUTOMATIONS&&wte(e.appId)&&!await ire(i._id))continue;if(await $it(i,{row:e.row,oldRow:e.oldRow}))try{await sS.add({automation:i,event:e},qit)}catch(s){kt.logAlert("Failed to queue automation",s)}}})}a(OCr,"queueRelevantRowAutomations");async function ooe(e,t){try{await OCr(e,t)}catch(r){kt.logWarn("Unable to process row event",r)}}a(ooe,"queueRowAutomations");Lb.on("row:save",async function(e){!e||!e.row||!e.row.tableId||await ooe(e,"row:save")});Lb.on("row:update",async function(e){!e||!e.row||!e.row.tableId||await ooe(e,"row:update")});Lb.on("row:delete",async function(e){!e||!e.row||!e.row.tableId||await ooe(e,"row:delete")});function ICr(e,t){return Lr.runQuery([e],t).length>0}a(ICr,"rowPassesFilters");function oit(e){return e!==null&&"steps"in e&&Array.isArray(e.steps)}a(oit,"isAutomationResults");async function Bb(e,t,{getResponses:r}={}){if(e.disabled)throw new Error("Automation is disabled");if(Zi.automations.isAppAction(e)&&!await ire(e._id)){t.fields==null&&(t.fields={});let o={},s=e.definition.trigger.inputs||{},u="fields"in s?s.fields:{};for(let c of Object.keys(u||{}))o[c]=Cb(t.fields[c],u[c]);t.fields=o}else(Zi.automations.isRowAction(e)||Zi.automations.isWebhookAction(e))&&(t={...t,...t.fields,fields:{}});let n={automation:e,event:t};return await $it(e,{row:n.event?.row??{},oldRow:n.event?.oldRow??{}})?r?(n.event={...n.event,appId:z.getWorkspaceId(),automation:e},Bit({data:n})):sS.add(n,qit):{outputs:{success:!1,status:"stopped"},message:"Automation did not run. Filter conditions in trigger were not met."}}a(Bb,"externalTrigger");async function $it(e,t){let r=e.definition.trigger,n=r.inputs,i=n?.filters,o=n?.tableId;if(!i)return!0;if(r.stepId===zt.triggers.definitions.ROW_UPDATED.stepId||r.stepId===zt.triggers.definitions.ROW_SAVED.stepId){let s=await K_(o,t.row);return ICr(s,i)}return!0}a($it,"checkTriggerFilters");async function kCr(e,t={},r){let i=await z.getWorkspaceDB().get(e);if(!i)throw new Error(`Automation with ID ${e} not found`);let o=i.definition?.trigger?.stepId;if(o!=="APP")throw new Error(`Cannot manually trigger automation '${i.name}'. Only automations with APP trigger type can be manually triggered. This automation has trigger type: ${o}`);if(G.automations.utils.checkForCollectStep(i)&&await vs.isSyncAutomationsEnabled()){let u=await Bb(i,{fields:t,timeout:r?r*1e3:Oe.AUTOMATION_THREAD_TIMEOUT},{getResponses:!0});if(!("steps"in u))throw new Error("Unable to collect response");return u.steps.find(l=>l.stepId==="COLLECT")?.outputs}else{let u=z.getWorkspaceId();return await Bb(i,{fields:t,appId:u}),{message:`Automation ${i._id} has been triggered.`,automation:i}}}a(kCr,"trigger");var Af={...Fie,webhook:Uie,utils:Mie,execution:soe};var coe={};oe(coe,{exportApp:()=>Vit,exportDB:()=>Hit,streamExportApp:()=>NCr});var zit=require("dd-trace"),uoe=ie(require("fs")),fd=ie(require("fs/promises")),_m=require("path"),Wit=ie(require("tar")),Git=require("uuid");var cS="db.txt",YB="global.txt",JB="attachments";var CCr=require("memorystream");async function DCr(e,t){let r=`${(0,Git.v4)()}.tar.gz`,n=(0,_m.join)(al(),r);return await Wit.default.create({gzip:!0,file:n,noDirRecurse:!1,cwd:e},t),n}a(DCr,"tarFilesToTmp");async function Hit(e,t={}){let r={filter:t?.filter,batch_size:1e3,batch_limit:5,style:"main_only"};return ne.doWithDB(e,async n=>{if(t?.exportPath){let i=t?.exportPath,o=uoe.default.createWriteStream(i);return await n.dump(o,r),i}else{let i=new CCr,o="";return i.on("data",s=>{o+=s.toString()}),await n.dump(i,r),o}})}a(Hit,"exportDB");function PCr(e){let t=[XM,FYe,MYe];return e&&t.push(UYe),r=>!t.map(n=>r._id.includes(n)).reduce((n,i)=>n||i)}a(PCr,"defineFilter");async function Vit(e,t){return await zit.tracer.trace("exportApp",async r=>{r.addTags({"config.excludeRows":t?.excludeRows,"config.tar":t?.tar,"config.encryptPassword":!!t?.encryptPassword,"config.exportPath":t?.exportPath,"config.filter":!!t?.filter});let n=ne.getProdWorkspaceID(e),i=`${n}/`,o=[/\/\..+/];t?.excludeRows&&o.push(/\/attachments\/.*/);let s=await gt.retrieveDirectory(ys.APPS,i,o);r.addTags({prodAppId:n,tmpPath:s});let u=(0,_m.join)(s,i);if(uoe.default.existsSync(u)){let l=await fd.default.readdir(u);for(let f of l){let p=(0,_m.join)(u,f);await fd.default.rename(p,(0,_m.join)(u,"..",f))}await fd.default.rmdir(u)}let c=(0,_m.join)(s,cS);if(await Hit(e,{filter:PCr(t?.excludeRows),exportPath:c}),t?.encryptPassword){let l=a(async(f,p="")=>{for(let d of await fd.default.readdir(f)){let h=(0,_m.join)(f,d),m=p?(0,_m.join)(p,d):d;if(d!==JB){let g=await fd.default.lstat(h);g.isFile()?(await Wc.encryptFile({dir:f,filename:d},t.encryptPassword),await fd.default.rm(h)):g.isDirectory()&&await l(h,m)}}},"processDirectory");await l(s)}if(t?.tar){let l=await DCr(s,await fd.default.readdir(s));return await fd.default.rm(s,{recursive:!0,force:!0}),l}else return s})}a(Vit,"exportApp");async function NCr({appId:e,excludeRows:t,encryptPassword:r}){let n=await Vit(e,{excludeRows:t,tar:!0,encryptPassword:r});return DJe(n)}a(NCr,"streamExportApp");var loe={};oe(loe,{getGlobalDBFile:()=>MCr,getListOfAppsInMulti:()=>jCr,importApp:()=>BCr,untarFile:()=>Xit,updateAttachmentColumns:()=>Jit});var lS=ie(require("fs")),kf=ie(require("fs/promises")),Sm=require("path"),Qit=ie(require("tar")),Yit=require("uuid");function Kit(e,t){let r=t.key?.split("/")||[];r.shift(),r.unshift(e);let n=r.join("/");return{...t,key:n,url:""}}a(Kit,"rewriteAttachmentUrl");async function Jit(e,t){let r=await G.tables.getAllInternalTables(t),n=[];for(let i of r){let{rows:o,columns:s}=await G.rows.getRowsWithAttachments(t.name,i);n=n.concat(o.map(u=>{for(let c of s){let l=i.schema[c].type;l==="attachment"&&Array.isArray(u[c])?u[c]=u[c].map(f=>Kit(e,f)):(l==="attachment_single"||l==="signature_single")&&u[c]&&(u[c]=Kit(e,u[c]))}return u}))}await t.bulkDocs(n)}a(Jit,"updateAttachmentColumns");async function LCr(e,t){let r=(await t.allDocs(sm(null,{include_docs:!0}))).rows.map(o=>o.doc),n=ne.getDevWorkspaceID(e),i=[];for(let o of r){let s=o.appId,u=ne.getProdWorkspaceID(o.appId);if(o.definition.trigger?.stepId==="WEBHOOK"){let c=o.definition.trigger.inputs;o.definition.trigger.inputs={schemaUrl:c.schemaUrl.replace(s,n),triggerUrl:c.triggerUrl.replace(u,e)}}o.appId=n,i.push(o)}await t.bulkDocs(i)}a(LCr,"updateAutomations");async function FCr(e){if(e.file&&e.file.type!=="text/plain")throw new Error("Cannot import a non-text based file.");if(e.file)return lS.default.createReadStream(e.file.path);if(e.key){let[t,r]=e.key.split("/"),n=await qJe(t,r);return lS.default.createReadStream((0,Sm.join)(n,r,"db","dump.txt"))}else throw new Error("Either file or key is required.")}a(FCr,"getTemplateStream");async function Xit(e){let t=(0,Sm.join)(al(),(0,Yit.v4)());return await kf.default.mkdir(t),await Qit.default.extract({cwd:t,file:e.path}),t}a(Xit,"untarFile");async function UCr(e,t){try{let r=a(async n=>{for(let i of await kf.default.readdir(n)){let o=(0,Sm.join)(n,i);if(!o.endsWith(JB)){let s=await kf.default.lstat(o);if(s.isFile()&&o.endsWith(".enc")){let u=o.replace(/\.enc$/,"");await Wc.decryptFile(o,u,t),await kf.default.rm(o)}else s.isDirectory()&&await r(o)}}},"processDirectory");await r(e)}catch(r){throw r.message==="incorrect header check"?new Error("File cannot be imported"):r}}a(UCr,"decryptFiles");function MCr(e){return lS.default.readFileSync((0,Sm.join)(e,YB),"utf8")}a(MCr,"getGlobalDBFile");function jCr(e){return lS.default.readdirSync(e).filter(t=>t!==YB)}a(jCr,"getListOfAppsInMulti");async function BCr(e,t,r,n={updateAttachmentColumns:!0}){let i=ne.getProdWorkspaceID(e),o,s=r.file&&r?.file?.type?.endsWith("gzip"),u=r.file&&(await kf.default.lstat(r.file.path)).isDirectory(),c;if(r.file&&(s||u)){c=s?await Xit(r.file):r.file.path,s&&r.file.password&&await UCr(c,r.file.password);let f=await kf.default.readdir(c);if(!!f.find(m=>m.endsWith(".enc")))throw new Error("Files are encrypted but no password has been supplied.");if(!!f.find(m=>m==="plugin.min.js"))throw new Error("Supplied file is a plugin - cannot import as app.");if(!f.find(m=>m===cS))throw new Error("App export does not appear to be valid - no DB file found.");{let m=[],g=[YB,cS];for(let v of f){let w=(0,Sm.join)(c,v);g.includes(v)||(v=(0,Sm.join)(i,v),(await kf.default.lstat(w)).isDirectory()?m.push(gt.uploadDirectory(ys.APPS,w,v)):m.push(gt.upload({bucket:ys.APPS,path:w,filename:v})))}await Promise.all(m);let y=await kf.default.readdir(c,{recursive:!0}),b=[];await Ut.parallelForeach(gt.listAllObjects(gt.ObjectStoreBuckets.APPS,i),async v=>{v.Key&&!y.includes(v.Key.replace(new RegExp(`^${i}/`),""))&&b.push(v.Key)},5),b.length&&await gt.deleteFiles(gt.ObjectStoreBuckets.APPS,b)}o=lS.default.createReadStream((0,Sm.join)(c,cS))}else o=await FCr(r);let{ok:l}=await t.load(o);if(!l)throw"Error loading database dump from template.";return n.updateAttachmentColumns&&await Jit(i,t),await LCr(i,t),c&&await kf.default.rm(c,{recursive:!0,force:!0}),l}a(BCr,"importApp");var foe={};oe(foe,{calculateAutomationCount:()=>eat,calculateBackupStats:()=>qCr,calculateDatasourceCount:()=>Zit,calculateScreenCount:()=>tat});async function XB(e,t,r){if(r)return t(r);{let n=ne.getDevWorkspaceID(e);return z.doInWorkspaceContext(n,()=>{let i=z.getWorkspaceDB();return t(i)})}}a(XB,"runInContext");async function Zit(e,t){return XB(e,async r=>{let n=await r.allDocs(DO()),i=await r.allDocs(om());return n.rows.length+i.rows.length},t)}a(Zit,"calculateDatasourceCount");async function eat(e,t){return XB(e,async r=>(await r.allDocs(sm())).rows.length,t)}a(eat,"calculateAutomationCount");async function tat(e,t){return XB(e,async r=>(await G.screens.fetch(r)).length,t)}a(tat,"calculateScreenCount");async function qCr(e){return XB(e,async t=>{let r=[];r.push(Zit(e,t)),r.push(eat(e,t)),r.push(tat(e,t));let n=await Promise.all(r);return{datasources:n[0],automations:n[1],screens:n[2]}})}a(qCr,"calculateBackupStats");var poe={};oe(poe,{clearErrors:()=>$Cr});async function $Cr(e){let t=z.getProdWorkspaceDB(),r=await t.get("app_metadata");e?r.backupErrors&&r.backupErrors[e]&&delete r.backupErrors[e]:delete r.backupErrors,await t.put(r),await jt.workspace.invalidateWorkspaceMetadata(r.appId,r)}a($Cr,"clearErrors");var ZB={...coe,...loe,...foe,...poe};var doe={};oe(doe,{getSourceType:()=>zCr});function zCr(e){if(gc(e))return"table";if(ea(e))return"view";if(pv(e))return"datasource";if(Afe(e))return"query";throw new Error(`Unknown source type for source "${e}"`)}a(zCr,"getSourceType");function rat(e,t){return!e.disabled&&t?"published":"disabled"}a(rat,"getPublishedState");async function nat(){let t=await z.getProdWorkspaceDB().exists(),r={automations:[],workspaceApps:[],screens:[],tables:[]},n={automations:[],workspaceApps:[],screens:[],tables:[]},i=a(async h=>{let[m,g,y,b]=await Promise.all([G.automations.fetch(),G.workspaceApps.fetch(),G.screens.fetch(),G.tables.getAllInternalTables()]);h.automations=m,h.workspaceApps=g,h.screens=y,h.tables=b},"updateState");await z.doInWorkspaceContext(z.getDevWorkspaceId(),async()=>i(r));let o;t&&(o=await G.workspaces.metadata.tryGet({production:!0}),await z.doInWorkspaceContext(z.getProdWorkspaceId(),async()=>i(n)));let s=new Set(n.automations.map(h=>h._id)),u=new Set(n.workspaceApps.map(h=>h._id)),c=new Set(n.tables.map(h=>h._id)),l=a((h,m,g)=>{let y=g._id,b=o?.resourcesPublishedAt?.[y];h[y]={published:m.has(y),name:g.name,publishedAt:b,unpublishedChanges:!b||g.updatedAt>b,state:rat(g,b)}},"processResource"),f={};for(let h of r.automations)l(f,s,h);let p={};for(let h of r.tables)l(p,c,h);let d={};for(let h of r.workspaceApps){let m=o?.resourcesPublishedAt?.[h._id],g=r.screens.filter(y=>y.workspaceAppId===h._id);d[h._id]={published:u.has(h._id),name:h.name,publishedAt:m,unpublishedChanges:!m||!!g.find(y=>y.updatedAt>m),state:rat(h,m)}}return{automations:f,workspaceApps:d,tables:p}}a(nat,"status");var iat={status:nat};var hoe={};oe(hoe,{create:()=>GCr,fetch:()=>WCr,findByResourceId:()=>VCr,remove:()=>HCr});async function WCr(e){return(await z.getWorkspaceDB().find({selector:{_id:{$regex:`^workspace_favourite${je}`},...e?{createdBy:e}:{}}})).docs}a(WCr,"fetch");async function GCr(e){let r=await z.getWorkspaceDB().put({_id:ne.generateWorkspaceFavouriteID(),...e});return{...e,_id:r.id,_rev:r.rev}}a(GCr,"create");async function HCr(e,t){return await z.getWorkspaceDB().remove(e,t)}a(HCr,"remove");async function VCr(e){return(await z.getWorkspaceDB().find({selector:{_id:{$regex:`^workspace_favourite${je}`},resourceId:e},limit:1})).docs}a(VCr,"findByResourceId");var moe={};oe(moe,{fetch:()=>KCr,fetchWithDocument:()=>QCr});async function KCr(e){if(!gc(e))throw new Error(`Invalid tableId: ${e}`);let t=z.getWorkspaceDB(),r={startkey:[e],endkey:[e,{}]};return(await t.query(CO(ed.LINK),r)).rows.map(i=>i.value)}a(KCr,"fetch");async function QCr(e){if(!gc(e))throw new Error(`Invalid tableId: ${e}`);let t=z.getWorkspaceDB(),r={startkey:[e],endkey:[e,{}],include_docs:!0};return(await t.query(CO(ed.LINK),r)).rows.map(i=>i.doc)}a(QCr,"fetchWithDocument");var aat={...moe};var goe={};oe(goe,{addLink:()=>YCr,deleteLink:()=>JCr,update:()=>XCr});async function YCr({label:e,url:t,roleId:r,workspaceAppId:n}){let i=await G.workspaceApps.get(n);if(!i)throw new Se("Workspace app should be defined",500);i.navigation.links??=[],i.navigation.links.push({text:e,url:t,roleId:r,type:"link"}),await G.workspaceApps.update(i)}a(YCr,"addLink");async function JCr(e,t){let r=await G.workspaceApps.get(t);r.navigation.links??=[];let n=r.navigation.links.filter(i=>i.url!==e);n.forEach(i=>{i.type==="sublinks"&&i.subLinks?.length&&(i.subLinks=i.subLinks.filter(o=>o.url!==e))}),await G.workspaceApps.update({...r,navigation:{...r.navigation,links:n}})}a(JCr,"deleteLink");async function XCr(e,t){let r=await G.workspaceApps.get(e);if(!r)throw new Se("Workspace app not found",400);await G.workspaceApps.update({...r,navigation:t})}a(XCr,"update");var yoe={};oe(yoe,{cleanStoredToken:()=>s1r,create:()=>ZCr,fetch:()=>sat,get:()=>eq,getLastUsages:()=>o1r,getToken:()=>i1r,remove:()=>t1r,update:()=>e1r,validateConfig:()=>a1r});async function oat(e,t){if((await sat()).find(n=>n.name===e&&n._id!==t))throw new Se(`OAuth2 config with name '${e}' is already taken.`,400)}a(oat,"guardName");async function sat(){return(await z.getWorkspaceDB().allDocs(Ti.getOAuth2ConfigParams(null,{include_docs:!0}))).rows.map(n=>({...n.doc,_id:n.doc._id,_rev:n.doc._rev}))}a(sat,"fetch");async function ZCr(e){let t=z.getWorkspaceDB();await oat(e.name);let r=await t.put({_id:`oauth2${je}${gr.newid()}`,...e});return{_id:r.id,_rev:r.rev,...e}}a(ZCr,"create");async function eq(e){return await z.getWorkspaceDB().tryGet(e)}a(eq,"get");async function e1r(e){let t=z.getWorkspaceDB();await oat(e.name,e._id);let r=await eq(e._id);if(!r)throw new Se(`OAuth2 config with id '${e._id}' not found.`,404);let n={...e,clientSecret:e.clientSecret===Pf?r.clientSecret:e.clientSecret},i=await t.put(n);return await uat(e._id),{...n,_rev:i.rev}}a(e1r,"update");async function t1r(e,t){let r=z.getWorkspaceDB();try{await r.remove(e,t)}catch(i){throw i.status===404?new Se(`OAuth2 config with id '${e}' not found.`,404):i}await uat(e);let n=await r.tryGet(Ti.generateOAuth2LogID(e));n&&await r.remove(n)}a(t1r,"remove");async function uat(e){let t=jt.CacheKey.OAUTH2_TOKEN(e);await jt.destroy(t)}a(uat,"cleanCache");var cat=require("koa"),lat=ie(require("node-fetch"));var{DocWritethrough:r1r}=jt.docWritethrough;async function fat(e){e=await rrt(e);let t={method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"client_credentials"}),redirect:"follow"},r={grant_type:e.grantType};return e.method==="HEADER"?t.headers={"Content-Type":"application/x-www-form-urlencoded",Authorization:`Basic ${Buffer.from(`${e.clientId}:${e.clientSecret}`,"utf-8").toString("base64")}`}:(r.client_id=e.clientId,r.client_secret=e.clientSecret),e.scope&&(r.scope=e.scope),t.body=new URLSearchParams(r),await(0,lat.default)(e.url,t)}a(fat,"fetchToken");var n1r=a(async e=>{await new r1r(z.getWorkspaceDB(),Ti.generateOAuth2LogID(e)).patch({lastUsage:Date.now()})},"trackUsage");async function i1r(e){let t=await jt.withCacheWithDynamicTTL(jt.CacheKey.OAUTH2_TOKEN(e),async()=>{let r=await eq(e);if(!r)throw new cat.HttpError(`oAuth config ${e} count not be found`);let n=await fat(r),i=await n.json();if(!n.ok){let u=i.error_description??n.statusText;throw new Error(`Error fetching oauth2 token: ${u}`)}let o=`${i.token_type} ${i.access_token}`,s=i.expires_in??-1;return{value:o,ttl:s}});return await n1r(e),t}a(i1r,"getToken");async function a1r(e){try{let t=await fat(e),r=await t.json();return t.ok?{valid:!0}:{valid:!1,message:r.error_description??t.statusText}}catch(t){return{valid:!1,message:t.message}}}a(a1r,"validateConfig");async function o1r(e){let t=await z.getWorkspaceDB().getMultiple(e.map(Ti.generateOAuth2LogID),{allowMissing:!0}),r=await z.getProdWorkspaceDB().getMultiple(e.map(Ti.generateOAuth2LogID),{allowMissing:!0});return e.reduce((i,o)=>{let s=t.find(c=>c._id===Ti.generateOAuth2LogID(o));s&&(i[o]=s.lastUsage);let u=r.find(c=>c._id===Ti.generateOAuth2LogID(o));return u&&(!i[o]||i[o]<u.lastUsage)&&(i[o]=u.lastUsage),i},{})}a(o1r,"getLastUsages");async function s1r(e){await jt.destroy(jt.CacheKey.OAUTH2_TOKEN(e),{useTenancy:!0})}a(s1r,"cleanStoredToken");var voe={};oe(voe,{enrichArrayContext:()=>hat,enrichContext:()=>boe,fetch:()=>l1r,find:()=>c1r});function pat(e){if(!e.schema)return e;let t={};for(let r of Object.keys(e.schema))typeof e.schema[r]=="string"?t[r]={type:e.schema[r],name:r}:t[r]=e.schema[r];return e.schema=t,e}a(pat,"updateSchema");function u1r(e){return e.map(t=>pat(t))}a(u1r,"updateSchemas");function dat(e){let t=Array.isArray(e),r=t?e:[e];for(let n of r)n.queryVerb==="read"&&(n.readable=!0);return t?r:r[0]}a(dat,"enrichQueries");async function c1r(e){let t=z.getWorkspaceDB(),r=z.getWorkspaceId(),n=dat(await t.get(e));return JM(r)&&(delete n.fields,delete n.parameters),pat(n)}a(c1r,"find");async function l1r(e={enrich:!0}){let n=(await z.getWorkspaceDB().allDocs(_te(null,{include_docs:!0}))).rows.map(i=>i.doc);return e.enrich&&(n=await dat(n)),u1r(n)}a(l1r,"fetch");async function hat(e,t={}){let r={};for(let o in e)r[o]=e[o];let n=await boe(r,t),i=[];for(let[o,s]of Object.entries(n))i[parseInt(o)]=s;return i}a(hat,"enrichArrayContext");async function boe(e,t={}){let r={};if(!e||!t)return r;if(Array.isArray(e))return hat(e,t);let n=await cd(),i={...t,env:n};for(let o of Object.keys(e))e[o]!=null&&(typeof e[o]=="object"?r[o]=await boe(e[o],i):typeof e[o]=="string"?r[o]=An(e[o],i,{noEscaping:!0,noHelpers:!0,escapeNewlines:!0}):r[o]=e[o]);if(r.json||r.customData||r.requestBody){try{r.json=JSON.parse(r.json||r.customData||r.requestBody)}catch{}delete r.customData}return r}a(boe,"enrichContext");var mat={...voe};var Eoe={};oe(Eoe,{duplicateResourcesToWorkspace:()=>m1r,getResourcesInfo:()=>f1r});async function f1r(){let e=await G.automations.fetch(),t=await G.workspaceApps.fetch(),r={},n=[],i=await G.tables.getAllInternalTables(),o=await G.rowActions.getAll();n.push(...i.map(p=>({id:p._id,idToSearch:p._id,name:p.name,type:"table"})));let s=await G.datasources.fetch();n.push(...s.filter(p=>p._id!==to).map(p=>({id:p._id,idToSearch:p._id,name:p.name,type:"datasource"}))),n.push(...e.map(p=>({id:p._id,idToSearch:p._id,name:p.name,type:"automation"})));let u=await G.queries.fetch();if(n.push(...u.map(p=>({id:p._id,idToSearch:p._id,name:p.name,type:"query"}))),o.length){let p=await G.rowActions.getNames(Object.values(o).flatMap(d=>Object.values(d.actions)));for(let d of o){let h=Object.entries(d.actions).flatMap(([m,g])=>e.filter(y=>y._id===g.automationId).map(y=>({id:y._id,name:y.name,type:"automation"})));for(let[m,g]of Object.entries(d.actions))for(let y of[m,YYe(d._id)])n.push({id:d._id,idToSearch:y,name:p[g.automationId],type:"row_action",extraDependencies:h})}}let c=a((p,d)=>{let h=JSON.stringify(d);r[p]??={dependencies:[]};for(let m of n)if(h.includes(m.idToSearch)&&!r[p].dependencies.find(g=>g.id===m.id)){r[p].dependencies.push({id:m.id,name:m.name,type:m.type});let g=[...m.extraDependencies||[],...r[m.id]?.dependencies||[]].filter(({id:y})=>!r[p].dependencies.some(b=>b.id===y));r[p].dependencies.push(...g)}},"searchForUsages");for(let p of i)c(p._id,p);for(let p of e)c(p._id,p);for(let p of u)c(p._id,p);let l=await G.screens.fetch(),f={};for(let p of l)p.workspaceAppId&&(f[p.workspaceAppId]||(f[p.workspaceAppId]=[]),f[p.workspaceAppId].push(p));for(let p of t){let d=f[p._id]||[];r[p._id]??={dependencies:[]},r[p._id].dependencies.push(...d.map(h=>({id:h._id,name:h.name,type:"screen"})));for(let h of d)c(p._id,h)}for(let p of Object.values(r).flatMap(d=>d.dependencies).filter(d=>d.type==="row_action")){let d=o.find(h=>h._id===p.id);if(d)for(let h of Object.values(d.actions)){if(r[p.id]?.dependencies.some(g=>g.id===h.automationId))continue;let m=e.find(g=>g._id===h.automationId);m&&(r[p.id]??={dependencies:[]},r[p.id].dependencies.push({id:m._id,name:m.name,type:"automation"}))}}return r}a(f1r,"getResourcesInfo");async function p1r(e){let t=ne.getDB(ne.getDevWorkspaceID(e),{skip_setup:!0});if(!await t.exists())throw new Se("Destination workspace does not exist",400);return t}a(p1r,"getDestinationDb");var d1r={datasource:eo("datasource"),table:eo("ta"),row_action:eo("ra"),query:eo("query"),automation:eo("au"),workspace_app:eo("workspace_app"),screen:eo("screen")};function woe(e){return Object.entries(d1r).find(([r,n])=>e.startsWith(n))?.[0]}a(woe,"getResourceType");function gat(e){return e._id?woe(e._id)==="automation":!1}a(gat,"isAutomation");function h1r(e){return e._id?woe(e._id)==="workspace_app":!1}a(h1r,"isWorkspaceApp");async function m1r(e,t){e=Array.from(new Set(e).keys());let r=await p1r(t),n=await r.getMultiple(e,{allowMissing:!0}),i=new Set(n.map(f=>f._id));if(!e.filter(f=>!i.has(f)).length)return;let s=await z.getWorkspaceDB().getMultiple(e,{allowMissing:!1}),u=z.getWorkspaceId();if(!u)throw new Error("Could not get workspaceId");await r.bulkDocs(s.map(f=>{let p={...f,fromWorkspace:u};return delete p._rev,delete p.createdAt,delete p.updatedAt,(gat(p)||h1r(p))&&(p.disabled=!0),gat(p)&&(p.appId=t),p}));let c=(await G.workspaces.metadata.tryGet())?.name||u,l=await z.doInContext(t,async()=>(await G.workspaces.metadata.tryGet())?.name||t);for(let f of s){let p,d,h=woe(f._id);switch(h){case"automation":p=f.name,d="Automation";break;case"datasource":p=f.name||"Unknown",d="Datasource";break;case"query":p=f.name,d="Query";break;case"row_action":p=f._id,d="Row action";break;case"table":p=f.name,d="Table";break;case"screen":p=f.name||"Unkown",d="Screen";break;case"workspace_app":p=f.name,d="App";break;case void 0:throw new Error("Resource type could not be infered");default:throw Ut.unreachable(h)}let m={id:f._id,name:p,type:d};await St.resource.duplicatedToWorkspace({resource:m,fromWorkspace:c,toWorkspace:l})}}a(m1r,"duplicateResourcesToWorkspace");var _oe={};oe(_oe,{create:()=>y1r,deleteAll:()=>v1r,deleteAllForDatasource:()=>R1r,docExists:()=>w1r,get:()=>yat,getAll:()=>b1r,getAllForTable:()=>tq,getNames:()=>vat,remove:()=>T1r,run:()=>A1r,setTablePermission:()=>E1r,setViewPermission:()=>S1r,unsetTablePermission:()=>_1r,unsetViewPermission:()=>x1r});async function g1r(e,t,r){let n=await vat(Object.values(e.actions));if(t=t.toLowerCase().trim(),Object.entries(n).find(([i,o])=>o.toLowerCase().trim()===t&&i!==r))throw new Se("A row action with the same name already exists.",409)}a(g1r,"ensureUniqueAndThrow");async function y1r(e,t){let r={name:t.name.trim()},n=z.getWorkspaceDB(),i=tj(e),o=await n.tryGet(i);o||(o={_id:i,actions:{}}),await g1r(o,r.name);let s=z.getWorkspaceId();if(!s)throw new Error("Could not get the current appId");let u=`row_action${je}${gr.newid()}`,c=await Af.create({name:r.name,appId:s,definition:{trigger:{id:"trigger",...zt.triggers.definitions.ROW_ACTION,stepId:"ROW_ACTION",inputs:{tableId:e,rowActionId:u}},steps:[]}});return o.actions[u]={automationId:c._id,permissions:{table:{runAllowed:!0},views:{}}},await n.put(o),{id:u,name:c.name,...o.actions[u]}}a(y1r,"create");async function yat(e,t){let n=(await tq(e))?.actions[t];if(!n)throw new Se(`Row action '${t}' not found in '${e}'`,400);return n}a(yat,"get");async function tq(e){let t=z.getWorkspaceDB(),r=tj(e);return await t.tryGet(r)}a(tq,"getAllForTable");async function b1r(){return(await z.getWorkspaceDB().allDocs(Ti.getDocParams("ra",void 0,{include_docs:!0}))).rows.map(t=>t.doc)}a(b1r,"getAll");async function v1r(e){let t=z.getWorkspaceDB(),r=await tq(e);if(!r)return;let n=Object.values(r.actions).map(o=>o.automationId),i=await t.getMultiple(n);for(let o of i)await G.automations.remove(o._id,o._rev);await t.remove(r)}a(v1r,"deleteAll");async function w1r(e){let t=z.getWorkspaceDB(),r=tj(e);return await t.exists(r)}a(w1r,"docExists");async function rk(e,t,r){let n=await tq(e);if(!n?.actions[t])throw new Se(`Row action '${t}' not found in '${e}'`,400);let o=await r(n);return await z.getWorkspaceDB().put(o),{id:t,...o.actions[t]}}a(rk,"updateDoc");async function bat(e,t){let r;if(ea(t)&&(r=await G.views.get(t)),!r||r.tableId!==e)throw new Se(`View '${t}' not found in '${e}'`,400)}a(bat,"guardView");async function E1r(e,t){return await rk(e,t,async r=>(r.actions[t].permissions.table.runAllowed=!0,r))}a(E1r,"setTablePermission");async function _1r(e,t){return await rk(e,t,async r=>(r.actions[t].permissions.table.runAllowed=!1,r))}a(_1r,"unsetTablePermission");async function S1r(e,t,r){return await bat(e,r),await rk(e,t,async n=>(n.actions[t].permissions.views[r]={runAllowed:!0},n))}a(S1r,"setViewPermission");async function x1r(e,t,r){return await bat(e,r),await rk(e,t,async n=>(delete n.actions[t].permissions.views[r],n))}a(x1r,"unsetViewPermission");async function T1r(e,t){return await rk(e,t,async r=>{let{automationId:n}=r.actions[t],i=await Af.get(n);return await Af.remove(i._id,i._rev),delete r.actions[t],r})}a(T1r,"remove");async function A1r(e,t,r,n){let i=await G.tables.getTable(e);if(!i)throw new Se("Table not found",404);let{automationId:o}=await yat(e,t),s=await G.automations.get(o),u=await G.rows.find(e,r);await Bb(s,{fields:{id:u._id,revision:u._rev,row:u,table:i},user:n,appId:z.getWorkspaceId()},{getResponses:!0})}a(A1r,"run");async function vat(e){return(await G.automations.find(e.map(({automationId:n})=>n))).reduce((n,i)=>(n[i._id]=i.name,n),{})}a(vat,"getNames");async function R1r(e){let r=(await G.tables.getAllTables()).filter(n=>n.sourceId===e);for(let n of Object.values(r))await G.rowActions.deleteAll(n._id)}a(R1r,"deleteAllForDatasource");var xoe={};oe(xoe,{FIND_LIMIT:()=>Soe,getRowsWithAttachments:()=>I1r});var Soe=25;function O1r(e,t,r){let n={selector:{$or:t.map(i=>({[i]:{$exists:!0}})),_id:{$regex:`^ro${Hr}${e}`}},limit:Soe};return r&&(n.bookmark=r),n}a(O1r,"generateAttachmentFindParams");async function I1r(e,t){let r=ne.getDB(e),n=[];for(let[u,c]of Object.entries(t.schema))(c.type==="attachment"||c.type==="attachment_single"||c.type==="signature_single")&&n.push(u);if(n.length===0)return{rows:[],columns:[]};let i,o=0,s=[];do{let u=O1r(t._id,n,i),c=await r.find(u);i=c.bookmark,o=c.docs.length;let l=c.docs;s=s.concat(l)}while(o===Soe);return{rows:s,columns:n}}a(I1r,"getRowsWithAttachments");var Aoe={};oe(Aoe,{find:()=>N1r,getAllInternalRows:()=>D1r,save:()=>P1r});var nk={};oe(nk,{find:()=>C1r,getRow:()=>Toe,save:()=>k1r});var wat=ie(require("lodash/fp/cloneDeep"));async function Toe(e,t,r){let n;return typeof e=="string"?ea(e)?n=await G.views.get(e):n=await G.tables.getTable(e):n=e,((await Qo("READ",n,{id:Da(t),includeSqlRelationships:r?.relationships?1:0}))?.rows||[])[0]}a(Toe,"getRow");async function k1r(e,t,r){let{tableId:n,viewId:i}=Ub(e),o;if(i?o=await G.views.get(i):o=await G.tables.getTable(n),G.views.isView(o)&&Ye.views.isCalculationView(o))throw new Se("Cannot insert rows through a calculation view",400);let s=await fl(r,(0,wat.default)(o),t),u=await G.rows.utils.validate({row:s,source:o});if(!u.valid)throw{validation:u.errors};let c=await Qo("CREATE",o,{row:s}),l=c.row._id;if(l){let f=await Toe(o,l,{relationships:!0});return{...c,row:await gn(o,f,{preserveLinks:!0,squash:!0})}}else return c}a(k1r,"save");async function C1r(e,t){let{tableId:r,viewId:n}=Ub(e),i;n?i=await G.views.get(n):i=await G.tables.getTable(r);let o=await Toe(i,t,{relationships:!0});if(!o)throw new Se("Row not found",404);return await gn(i,o,{squash:!0,preserveLinks:!0})}a(C1r,"find");async function D1r(e){let t;return e?t=ne.getDB(e):t=z.getWorkspaceDB(),(await t.allDocs(Yu(null,null,{include_docs:!0}))).rows.map(n=>n.doc)}a(D1r,"getAllInternalRows");function Eat(e){let t=e;return ea(e)&&(t=Mi(e)),en(t)?nk:Bae}a(Eat,"pickApi");async function P1r(e,t,r,n){return Eat(e).save(e,t,r,n)}a(P1r,"save");async function N1r(e,t){return Eat(e).find(e,t)}a(N1r,"find");var Foe={};oe(Foe,{exportRows:()=>eDr,fetch:()=>tDr,fetchLegacyView:()=>nDr,fetchRaw:()=>rDr,isValidFilter:()=>RJe,search:()=>Z1r});var Doe={};oe(Doe,{exportRows:()=>H1r,fetch:()=>Nat,fetchLegacyView:()=>Coe,fetchRaw:()=>koe,sqs:()=>ik});var ik={};oe(ik,{buildInternalFieldList:()=>Ooe,search:()=>Dat});var Aat=ie(require("dd-trace")),Rat=require("lodash"),Oat=ie(require("lodash/pick"));var _at=require("lodash");var L1r=["CREATE","UPDATE","DELETE"],F1r=["mysql2","mssql","oracledb"],U1r=["CREATE_TABLE","UPDATE_TABLE","DELETE_TABLE"],Roe=class e{static{a(this,"CharSequence")}static{this.alphabet="abcdefghijklmnopqrstuvwxyz"}constructor(){this.counters=[0]}getCharacter(){let t=this.counters.map(r=>e.alphabet[r]).join("");for(let r=this.counters.length-1;r>=0;r--){if(this.counters[r]<e.alphabet.length-1)return this.counters[r]++,t;this.counters[r]=0}return this.counters.unshift(0),t}},$b=class{static{a(this,"AliasTables")}constructor(t){this.tableNames=t,this.aliases={},this.tableAliases={},this.charSeq=new Roe}isAliasingEnabled(t,r){let n=t.resource?.fields?.length;if(!n||n<=0||U1r.includes(t.operation))return!1;if(!r)return!0;try{let i=Xie(r),o=L1r.includes(t.operation),s=F1r.includes(i);if(o&&s)return!1}catch{return!1}return!0}getAlias(t){if(typeof t=="object"&&(t=t.name),this.aliases[t])return this.aliases[t];let r=this.charSeq.getCharacter();return this.aliases[t]=r,this.tableAliases[r]=t,r}aliasField(t){let r=this.tableNames;if(t.includes(".")){let[n,...i]=t.split("."),o=i.join("."),s=r.find(u=>{let c=n.indexOf(u);if(c===-1||c>1)return;let l=c*2;return Math.abs(n.length-u.length)<=l});s&&(t=`${n.replace(s,this.getAlias(s))}.${o}`)}return t}reverse(t){let r=new Map,n=a(i=>{let o={};for(let s of Object.keys(i)){let u=r.get(s);if(!u){let c=s.indexOf(".");if(c===-1)u=s;else{let l=s.slice(0,c),f=s.slice(c+1);u=`${this.tableAliases[l]||l}.${f}`}r.set(s,u)}o[u]=i[s]}return o},"process");return Array.isArray(t)?t.map(i=>n(i)):n(t)}aliasMap(t){let r={};for(let n of t)n&&(r[n]=this.getAlias(n));return r}async queryWithAliasing(t,r){let n=t.datasource,i=n===void 0,o;if(i?o=this.isAliasingEnabled(t):o=this.isAliasingEnabled(t,n),o){if(t=(0,_at.cloneDeep)(t),t.resource?.fields&&(t.resource.fields=t.resource.fields.map(c=>this.aliasField(c))),t.filters){let c=a(l=>{for(let[f,p]of Object.entries(l)){if(typeof p!="object")continue;let d={};for(let h of Object.keys(p))d[this.aliasField(h)]=p[h];l[f]=d}return Lr.recurseLogicalOperators(l,c)},"aliasFilters");t.filters=c(t.filters)}t.relationships&&(t.relationships=t.relationships.map(c=>({...c,aliases:this.aliasMap([c.through,c.tableName,t.table.name])}))),this.getAlias(t.table);for(let c of Object.keys(t.tables))this.getAlias(c);let u={};for(let[c,l]of Object.entries(this.tableAliases))u[l]=c;t.tableAliases=u}let s=await r(t);return Array.isArray(s)&&o?this.reverse(s):s}};function M1r(e,t,r){if(t){for(let n of Object.values(t))if(typeof n=="object")for(let[i,o]of Object.entries(n))i.endsWith(e)&&(n[i]=r(o))}}a(M1r,"findColumnInQueries");function Sat(e,t){M1r(e,t,r=>{let n=Array.isArray(r);if(!(typeof r=="string")&&!n)return r;let o=a(s=>{let u="ro"+je;return s.startsWith(u)?ne.getGlobalIDFromUserMetadataID(s):s},"processString");return n?r.map(s=>typeof s=="string"?o(s):s):o(r)})}a(Sat,"userColumnMapping");function rq(e,t){for(let[r,n]of Object.entries(e.schema||{}))switch(n.type){case"bb_reference_single":{let i=n.subtype;switch(i){case"user":Sat(r,t);break;default:Ut.unreachable(i)}break}case"bb_reference":{Sat(r,t);break}}return Lr.recurseLogicalOperators(t,r=>rq(e,r))}a(rq,"checkFilters");function xat(e,t){return t.query&&(t.query=rq(e,t.query)),t}a(xat,"searchInputMapping");function nq(e){for(let t of Object.values(e)){if(typeof t!="object")continue;if(Object.keys(t).find(n=>ne.removeKeyNumbering(n)==="_id"&&t[n]))return!0}return!1}a(nq,"isSearchingByRowID");var Iat=new Vt.Sql("sqlite3"),j1r=2e3,kat=new RegExp("no such column: .+"),B1r=new RegExp("no such table: .+"),q1r=new RegExp("duplicate column name: .+");async function Ooe(e,t,r){let{relationships:n,allowedFields:i,includeHiddenFields:o}=r||{},s=[],u=G.views.isView(e),c;u?c=await G.views.getTable(e.id):c=e,u?s=Object.keys(Ye.views.basicFields(e)):s=Object.keys(e.schema).filter(d=>o||e.schema[d].visible!==!1);let l=s.some(d=>c.schema[d]?.type==="formula");l?s=Object.keys(c.schema):i&&(s=s.filter(d=>i.includes(d)));let f=[],p=a((d,h)=>{let m=[];return h.forEach(g=>{m.push(`${um(c._id,d._id)}.${g}`)}),m},"getJunctionFields");if(G.tables.isTable(e))for(let d of va)i&&!i.includes(d)||f.push(`${c._id}.${d}`);for(let d of s){let h=c.schema[d],m=h.type==="link";if(!(!n&&m))if(!m)f.push(`${c._id}.${If(d)}`);else{let g=h,y=t.find(v=>v._id===g.tableId);if(!y)continue;let b=(await Ooe(y,t,{includeHiddenFields:l})).concat(p(y,["doc1.fieldName","doc2.fieldName"]));if(b.length+f.length>j1r)break;f=f.concat(b)}}if(!u||!Ye.views.isCalculationView(e))for(let d of va)f.push(`${c._id}.${d}`);return[...new Set(f)]}a(Ooe,"buildInternalFieldList");function $1r(e,t){let r={};for(let s of t)for(let u of Object.keys(s.schema))Dm(u)||(r[u]=If(u));let n=a(s=>Dm(s)?!1:t.some(u=>u.schema[s]),"keyInAnyTable"),i=new Lr.ColumnSplitter(t),o=a(s=>{for(let u of Object.keys(s))if(dd(u))for(let c of s[u].conditions)o(c);else{let c=s[u];if(typeof c!="object")continue;for(let l of Object.keys(c)){let{numberPrefix:f,relationshipPrefix:p,column:d}=i.run(l);n(d)&&(c[`${f||""}${p||""}${If(d)}`]=c[l],delete c[l])}}},"prefixFilters");return o(e),e}a($1r,"cleanupFilters");function Cat(e,t){let r=nS.length;return e.map(n=>{let i={};for(let o of Object.keys(n)){t?.schema[o]?.type==="link"&&typeof n[o]=="string"&&(n[o]=Cat(JSON.parse(n[o])));let s=o.indexOf(nS);if(s!==-1){let u=o.slice(0,s)+o.slice(s+r),c=Ye.schema.decodeNonAscii(u);i[c]=n[o]}else i[o]=n[o]}return i})}a(Cat,"reverseUserColumnMapping");async function Tat(e,t,r,n){let i=r.map(c=>c.through),o=new $b(t.map(c=>c._id).concat(i));n?.countTotalRows&&(e.operation="COUNT");let s=a(async c=>{let l=Iat._query(c,{disableReturning:!0});if(Array.isArray(l))throw new Error("SQS cannot currently handle multiple queries");let f=l.sql,p=l.bindings,d=a(m=>["doc1","doc2"].forEach(g=>{f=f.replaceAll(`\`${g}\`.\`${m}\``,`\`${g}.${m}\``)}),"fixJunctionDocs");if(d("rowId"),d("fieldName"),Array.isArray(l))throw new Error("SQS cannot currently handle multiple queries");let h=z.getWorkspaceDB();return await Aat.default.trace("sqs.runSqlQuery",async m=>(m?.addTags({sql:f}),await h.sql(f,p)))},"processSQLQuery"),u=await o.queryWithAliasing(e,s);return n?.countTotalRows?FI(u):Array.isArray(u)?Cat(u,e.table):u}a(Tat,"runSqlQuery");function z1r(e,t){return e===400&&t?.match(B1r)||e===400&&t?.match(kat)||e===400&&t?.match(q1r)||e===404&&t?.includes(Fa)}a(z1r,"resyncDefinitionsRequired");async function Dat(e,t,r){let{paginate:n,query:i,...o}=(0,Rat.cloneDeep)(e),s;G.views.isView(t)?s=await G.views.getTable(t.id):s=t;let u=await G.tables.getAllInternalTables(),c=u.reduce((g,y)=>(g[y._id]=y,g),{});if(s._id&&(s=c[s._id]),!s)throw new Error("Unable to find table");let l=oXe(s,u),f={...$1r(i,u),documentType:"ro"},p=[];if(G.views.isView(t)&&Ye.views.isCalculationView(t)){let g=Ye.views.calculationFields(t);for(let[y,b]of Object.entries(g))e.fields&&!e.fields.includes(y)||(b.calculationType==="count"?"distinct"in b&&b.distinct?p.push({name:y,distinct:!0,field:If(b.field),calculationType:b.calculationType}):p.push({name:y,calculationType:b.calculationType,field:If(b.field)}):p.push({name:y,field:If(b.field),calculationType:b.calculationType}))}let d={endpoint:{datasourceId:Ad,entityId:s._id,operation:"READ"},filters:f,meta:{columnPrefix:nS},resource:{fields:await Ooe(t,u,{relationships:l,allowedFields:e.fields}),aggregations:p},relationships:l};if(o.sort){let g=s.schema[o.sort];if(p.some(b=>b.name===o.sort))d.sort={[o.sort]:{direction:o.sortOrder||"ascending",type:"number"}};else if(g){let b=g.type==="number"?"number":"string";d.sort={[If(g.name)]:{direction:o.sortOrder||"ascending",type:b}}}else throw new Error(`Unable to sort by ${o.sort}`)}if(o.bookmark&&typeof o.bookmark!="number")throw new Error("Unable to paginate with string based bookmarks");let h=o.bookmark||0;!nq(f)&&o.limit&&(n=!0,d.paginate={limit:o.limit+1,offset:h});let m=await Fb(d);try{let[g,y]=await Promise.all([Tat(m,u,l),e.countRows?Tat(m,u,l,{countTotalRows:!0}):Promise.resolve(void 0)]),b=Iat.convertJsonStringColumns(s,await hB(g,t,c,l,{sqs:!0})),v=!1;n&&o.limit&&g.length>o.limit&&(v=!0,b.length>o.limit&&b.pop());let w=await gn(t,b,{preserveLinks:!0,squash:!0}),T=[...e.fields||Object.keys(t.schema||{}).filter(R=>t.schema?.[R].visible!==!1),...va];w=w.map(R=>(0,Oat.default)(R,T));let I={rows:w};return y!=null&&(I.totalRows=y),n&&v&&(I.hasNextPage=!0,I.bookmark=h+b.length),n&&!v&&(I.hasNextPage=!1),I}catch(g){let y=typeof g=="string"?g:g.message;if(!r?.retrying&&z1r(g.status,y))return await $c.doWithLock({type:"auto_extend",name:"sys_sync_definitions",resource:z.getWorkspaceId()},G.tables.sqs.syncDefinition),Dat(e,t,{retrying:!0});if(g.status===400&&y?.match(kat))return{rows:[]};throw new Error(`Unable to search by SQL - ${y}`,{cause:g})}}a(Dat,"search");var W1r=ne.getPouch({inMemory:!0});async function Pat(view,calculation,group,data){let db=new W1r(gr.newid());try{await db.bulkDocs(data.map(e=>({...e,_rev:void 0})));let fn=a((e,t)=>t(e._id),"fn");eval("fn = "+view?.map?.replace("function (doc)","function (doc, emit)"));let queryFns={meta:view.meta,map:fn};view.reduce&&(queryFns.reduce=view.reduce);let response=await db.query(queryFns,{include_docs:!calculation,group:!!group});for(let e of response.rows){if(!e._rev||!e._id)continue;let t=data.find(r=>r._id===e._id);t&&(e._rev=t._rev)}return response}finally{await db.destroy(),await ne.closePouchDB(db)}}a(Pat,"runView");async function H1r(e){let{tableId:t,format:r,rowIds:n,columns:i,query:o,sort:s,sortOrder:u,delimiter:c,customHeaders:l}=e,f=z.getWorkspaceDB(),p=await G.tables.getTable(t),d=[];if(n){let b=(await f.allDocs({include_docs:!0,keys:n.map(v=>{let w=Da(v);if(w.length>1)throw new Se("Export data does not support composite keys.",400);return w[0]})})).rows.map(v=>v.doc);d=await gn(p,b)}else d=(await G.rows.search({tableId:t,query:o||{},sort:s,sortOrder:u})).rows;let h=[],m=p.schema,g;if(d=K1r(d,m),i&&i.length){for(let b=0;b<d.length;b++){h[b]={};for(let v of i)h[b][v]=d[b][v]}g=i}else h=d;let y=G.rows.utils.cleanExportRows(h,m,r,i,l);if(r==="csv")return{fileName:"export.csv",content:TB(g??Object.keys(h[0]),y,c,l)};if(r==="json")return{fileName:"export.json",content:AB(y)};if(r==="jsonWithSchema")return{fileName:"export.json",content:RB(m,y)};throw"Format not recognised"}a(H1r,"exportRows");async function Nat(e){let t=await G.tables.getTable(e),r=await koe(e);return await gn(t,r)}a(Nat,"fetch");async function koe(e,t){let r=z.getWorkspaceDB(),n;return e===mn.USER_METADATA?n=await G.users.fetchMetadata():n=(await r.allDocs(Yu(e,null,{include_docs:!0,limit:t}))).rows.map(o=>o.doc),n}a(koe,"fetchRaw");async function Coe(e,t){if(e.startsWith("ta"))return Nat(e);let r=z.getWorkspaceDB(),{calculation:n,group:i,field:o}=t,s=await V1r(r,e),u;if(Oe.SELF_HOSTED)u=await r.query(`database/${e}`,{include_docs:!n,group:!!i});else{let l=s.meta.tableId,f=await koe(l);u=await Pat(s,n,!!i,f)}let c=[];if(!n){u.rows=u.rows.map(f=>f.doc);let l;try{l=await G.tables.getTable(s.meta.tableId)}catch{throw new Error("Unable to retrieve view table.")}c=await gn(l,u.rows)}return n===Ioe.STATS&&(u.rows=u.rows.map(l=>({group:l.key,field:o,...l.value,avg:l.value.sum/l.value.count})),c=u.rows),(n===Ioe.COUNT||n===Ioe.SUM)&&(c=u.rows.map(l=>({group:l.key,field:o,value:l.value}))),c}a(Coe,"fetchLegacyView");var Ioe={SUM:"sum",COUNT:"count",STATS:"stats"};async function V1r(e,t){let r=Oe.SELF_HOSTED?iae:aae,n=Oe.SELF_HOSTED?aae:iae,i=Oe.SELF_HOSTED?yrt:grt,o,s=!1;try{o=await r(e,t)}catch(u){u.status!==404?o=null:(o=await n(e,t),s=!!o)}if(s&&await i(e,t),!o)throw"View does not exist.";return o}a(V1r,"getView");function K1r(e,t){let r=["_id",...Object.keys(t)];return e.map(i=>Object.keys(i).filter(o=>r.includes(o)).reduce((o,s)=>({...o,[s]:i[s]}),{}))}a(K1r,"trimFields");var Poe={};oe(Poe,{exportRows:()=>Y1r,fetch:()=>J1r,fetchRaw:()=>X1r,search:()=>iq});var Lat=ie(require("lodash/pick"));function Q1r(e,t,r,n){let i;if(!nq(e)){if(t&&!n)throw new Error("Cannot paginate query without a limit");return t&&n?(i={limit:n+1},r&&(i.offset=r)):n&&(i={limit:n}),i}}a(Q1r,"getPaginationAndLimitParameters");async function iq(e,t){let{countRows:r,paginate:n,query:i,...o}=e,{limit:s}=o,u=o.bookmark&&parseInt(o.bookmark)||void 0;n&&!u&&(u=0);let c=Q1r(i,n,u,s),l;if(o.sort){let f=o.sortOrder==="descending"?"descending":"ascending";l={[o.sort]:{direction:f}}}if(i?.oneOf?._id){let f=i.oneOf._id;i.oneOf._id=f.map(p=>Da(p)[0])}try{let f={filters:i,sort:l,paginate:c,includeSqlRelationships:1},[{rows:p,rawResponseSize:d},h]=await Promise.all([Qo("READ",t,f),r?Qo("COUNT",t,f):Promise.resolve(void 0)]),m=await gn(t,p,{preserveLinks:!0,squash:!0}),g=!1;n&&s&&d>s&&(g=!0,m.length>s&&m.pop());let b=[...e.fields||Object.keys(t.schema||{}).filter(w=>t.schema?.[w].visible!==!1),...cc];m=m.map(w=>(0,Lat.default)(w,b));let v={rows:m,hasNextPage:g};return g&&u!=null&&(v.bookmark=u+m.length),h!=null&&(v.totalRows=h),n&&!g&&(v.hasNextPage=!1),v}catch(f){throw f.message&&f.message.includes("does not exist")?new Error(`Table updated externally, please re-fetch - ${f.message}`,{cause:f}):f}}a(iq,"search");async function Y1r(e){let{tableId:t,format:r,columns:n,rowIds:i,query:o,sort:s,sortOrder:u,delimiter:c,customHeaders:l}=e;if(!t)throw new Se("No table ID for search provided.",400);let{datasourceId:f,tableName:p}=zn(t),d={};i?.length?d={oneOf:{_id:i.map(I=>{let R=Da(I);return R.length>1?R:R[0]})}}:d=o||{};let h=await G.datasources.get(f),m=await G.tables.getTable(t);if(!h||!h.entities)throw new Se("Datasource has not been configured for plus API.",400);let g=await iq({tableId:m._id,query:d,sort:s,sortOrder:u},m),y=[],b;if(n&&n.length){for(let I=0;I<g.rows.length;I++){y[I]={};for(let R of n)y[I][R]=g.rows[I][R]}b=n}else y=g.rows;let v=h.entities[p].schema,w=G.rows.utils.cleanExportRows(y,v,r,n,l),x;switch(r){case"csv":x=TB(b??Object.keys(v),w,c,l);break;case"json":x=AB(w);break;case"jsonWithSchema":x=RB(v,w);break;default:throw Ut.unreachable(r)}return{fileName:`export.${r}`,content:x}}a(Y1r,"exportRows");async function J1r(e){let t=await G.tables.getTable(e),r=await Qo("READ",t,{includeSqlRelationships:1});return await gn(t,r.rows,{preserveLinks:!0,squash:!0})}a(J1r,"fetch");async function X1r(e,t){let r=await G.tables.getTable(e),n;return t&&(n={limit:t}),(await Qo("READ",r,{includeSqlRelationships:1,paginate:n})).rows}a(X1r,"fetchRaw");var Uat=ie(require("dd-trace"));var Noe=a((e,t)=>{t=t.map(r=>r.toLowerCase());for(let r of Object.keys(e||{}))if(dd(r)){let n=e[r];if(!n)continue;for(let i of n.conditions)Noe(i,t)}else{let n=e[r];if(!n||typeof n!="object")continue;for(let i of Object.keys(n))if(!t.includes(i.toLowerCase())&&!t.includes(ne.removeKeyNumbering(i).toLowerCase()))throw new Se(`Invalid filter field: ${i}`,400)}},"validateFilters"),Fat=a(async(e,t)=>{let r=a(async(i,o,s,u)=>{let c=[];gae({table:i})&&c.push("_id");for(let l of Object.keys(i.schema).filter(f=>o.includes(f)&&i.schema[f].visible!==!1)){let f=i.schema[l],p=f.type==="link";if(!(p&&(u?.noRelationships||s.includes(f.tableId))))if(p)try{let d=await G.tables.getTable(f.tableId),h=await r(d,Object.keys(d.schema),[...s,f.tableId],{noRelationships:!0});c.push(...h.flatMap(m=>[`${f.name}.${m}`,`${d.name}.${m}`]))}catch(d){if(d.status!==404)throw d}else c.push(l)}return c},"extractTableFields"),n=["_id"];return t==null&&(t=Object.keys(e.schema)),n.push(...await r(e,t,[e._id])),Array.from(new Set(n))},"getQueryableFields");function Loe(e){return en(e)?Poe:Doe}a(Loe,"pickApi");async function Z1r(e,t){return await Uat.default.trace("search",async r=>{r?.addTags({tableId:e.tableId,viewId:e.viewId,query:e.query,sort:e.sort,sortOrder:e.sortOrder,sortType:e.sortType,limit:e.limit,bookmark:e.bookmark,paginate:e.paginate,fields:e.fields,countRows:e.countRows});let n,i;if(e.viewId)n=await G.views.get(e.viewId),i=await G.views.getTable(n);else if(e.tableId)n=await G.tables.getTable(e.tableId),i=n;else throw new Error("Must supply either a view ID or a table ID");let o=en(i._id);if(e.query){let u=(e.fields||Object.keys(i.schema)).filter(l=>i.schema[l]?.visible!==!1),c=await Fat(i,u);Noe(e.query,c)}else e.query={};if(t&&(e.query=await Pb(e.query,t)),e=xat(i,e),e.viewId){let c=await Pb(n.query||{},t);Array.isArray(c)&&(c=Lr.buildQuery(c)),c=rq(i,c);let l=c?[c]:[];e.query={$and:{conditions:[...l,e.query]}},c.onEmptyFilter&&(e.query.onEmptyFilter=c.onEmptyFilter)}if(e.query=Lr.cleanupQuery(e.query),e.query=Lr.fixupFilterArrays(e.query),r.addTags({cleanedQuery:e.query}),!Lr.hasFilters(e.query)&&e.query.onEmptyFilter==="none")return r.addTags({emptyQuery:!0}),{rows:[]};e.sortOrder&&(e.sortOrder=e.sortOrder.toLowerCase());let s;return o?(r?.addTags({searchType:"external"}),s=await iq(e,n)):(r?.addTags({searchType:"sqs"}),s=await ik.search(e,n)),r.addTags({foundRows:s.rows.length,totalRows:s.totalRows}),s})}a(Z1r,"search");async function eDr(e){return Loe(e.tableId).exportRows(e)}a(eDr,"exportRows");async function tDr(e){return Loe(e).fetch(e)}a(tDr,"fetch");async function rDr(e,t){return Loe(e).fetchRaw(e,t)}a(rDr,"fetchRaw");async function nDr(e,t){return Coe(e,t)}a(nDr,"fetchLegacyView");var Mat={...xoe,...Aoe,...Foe,utils:eae,external:nk,AliasTables:$b};var Uoe={};oe(Uoe,{create:()=>aDr,ensureHomepageUniqueness:()=>sDr,fetch:()=>iDr,update:()=>oDr});async function iDr(e=z.getWorkspaceDB()){let t=(await e.allDocs(GYe(null,{include_docs:!0}))).rows.map(n=>n.doc),r=t.filter(n=>!n.workspaceAppId);if(r.length){let n=await G.workspaceApps.fetch(),i=n.find(o=>o.isDefault)||n[0];i&&r.forEach(o=>{o.workspaceAppId=i._id})}return t}a(iDr,"fetch");async function aDr(e){let r=await z.getWorkspaceDB().put({...e,_id:WYe()});return{...e,_id:r.id,_rev:r.rev}}a(aDr,"create");async function oDr(e){let r=await z.getWorkspaceDB().put(e);return{...e,_rev:r.rev}}a(oDr,"update");async function sDr(e){let n=(await G.screens.fetch()).filter(i=>i._id!==e._id&&i.workspaceAppId===e.workspaceAppId).filter(i=>i.routing.homeScreen&&i.routing.roleId===e.routing.roleId);if(n.length)for(let i of n)i.routing.homeScreen=!1,await G.screens.update(i)}a(sDr,"ensureHomepageUniqueness");var Moe={};oe(Moe,{create:()=>fDr,duplicate:()=>pDr,fetch:()=>Bat,get:()=>qat,getMatchedWorkspaceApp:()=>mDr,remove:()=>hDr,update:()=>dDr});async function jat(e,t){if((await Bat()).find(n=>n.name===e&&n._id!==t))throw new Se(`App with name '${e}' is already taken.`,400)}a(jat,"guardName");var uDr=a(async(e,t)=>{let n=(await G.screens.fetch()).filter(o=>o.workspaceAppId===e),i=[];for(let o=0;o<n.length;o++){let s=n[o],u=await G.screens.create({layoutId:s.layoutId,showNavigation:s.showNavigation,width:s.width,routing:s.routing,props:s.props,name:s.name,pluginAdded:s.pluginAdded,onLoad:s.onLoad,variant:s.variant,workspaceAppId:t});i.push(u)}return i},"duplicateScreens"),cDr=a(async e=>{let t=await G.workspaceApps.fetch(),r=Ye.duplicateName(e.name,t.map(i=>i.name)),n={name:r,url:`/${lDr(r)}`,disabled:!0,navigation:e.navigation,isDefault:!1};return G.workspaceApps.create(n)},"createDuplicatedApp"),lDr=a(e=>e.toLowerCase().replaceAll(" ","-"),"slugify");async function Bat(e=z.getWorkspaceDB()){return(await e.allDocs(Ti.getWorkspaceAppParams(null,{include_docs:!0}))).rows.map(n=>({...n.doc,_id:n.doc._id,_rev:n.doc._rev}))}a(Bat,"fetch");async function qat(e){return await z.getWorkspaceDB().tryGet(e)}a(qat,"get");async function fDr(e){let t=z.getWorkspaceDB();return await jat(e.name),(await t.put({...e,_id:Ti.generateWorkspaceAppID()},{returnDoc:!0})).doc}a(fDr,"create");async function pDr(e){let t=await cDr(e);return await uDr(e._id,t._id),t}a(pDr,"duplicate");async function dDr(e){let t=z.getWorkspaceDB(),r=await qat(e._id);if(!r)throw new Se(`Project app with id '${e._id}' not found.`,404);e.name!==r.name&&await jat(e.name,e._id);let n={_id:e._id,_rev:e._rev,name:e.name,url:e.url,navigation:e.navigation,disabled:e.disabled,createdAt:r.createdAt,updatedAt:r.updatedAt,isDefault:r.isDefault,_deleted:void 0};return(await t.put(n,{returnDoc:!0})).doc}a(dDr,"update");async function hDr(e,t){let r=z.getWorkspaceDB();try{let i=await r.tryGet(e);if(!i)throw new Se(`Project app with id '${e}' not found.`,404);await r.remove(e,t),St.workspace.deleted(i,z.getWorkspaceId())}catch(i){throw i.status===404?new Se(`Project app with id '${e}' not found.`,404):i}let n=(await G.screens.fetch()).filter(i=>i.workspaceAppId===e);await r.bulkRemove(n)}a(hDr,"remove");async function mDr(e){let t=await G.workspaces.metadata.get(),r=ne.isProdWorkspaceID(t.appId)?`/app/${t.url}`.replace("//","/"):`/${t.appId}`,n=ne.isProdWorkspaceID(t.appId)?`/embed/${t.url}`.replace("//","/"):null,i=await G.workspaceApps.fetch();function o({url:u,isDefault:c}){return e.replace(/\/$/,"")===`${r}${u.replace(/\/$/,"")}`||n&&e.replace(/\/$/,"")===`${n}${u.replace(/\/$/,"")}`||!e&&c}return a(o,"isWorkspaceAppMatch"),i.find(o)}a(mDr,"getMatchedWorkspaceApp");var joe={};oe(joe,{updateWithExport:()=>wDr});var $at=[Ym.SQLITE,"_design/migrations"];async function gDr(e,t){let r="app_metadata";try{let[n,i]=await Promise.all([e.get(r),t.get(r)]);return{...i,automationErrors:void 0,theme:n.theme,customTheme:n.customTheme,features:n.features,icon:n.icon,navigation:n.navigation,scripts:n.scripts,type:n.type,version:n.version}}catch(n){throw new Error(`Unable to retrieve workspace metadata for import - ${n.message}`)}}a(gDr,"getNewWorkspaceMetadata");function yDr(e,t,r){let n=[];for(let o of t){let s=e.find(u=>u._id===o._id);s?s._rev=o._rev:n.push(o)}return[...e,...n,r]}a(yDr,"mergeUpdateAndDeleteDocuments");async function bDr(e){let t=[];for(let o of uq)t.push(e.allDocs(ne.getDocParams(o)));let r=[];for(let o of await Promise.all(t))r=r.concat(o.rows.map(s=>({_id:s.id,_rev:s.value.rev})));let n=await e.getMultiple($at,{allowMissing:!0});r.push(...n.map(o=>({_id:o._id,_rev:o._rev})));let i=new Map;return r.forEach(o=>{i.set(o._id,o)}),Array.from(i.values()).map(o=>({_deleted:!0,...o}))}a(bDr,"removeImportableDocuments");async function vDr(e){let t=[];for(let o of uq)t.push(e.allDocs(ne.getDocParams(o,null,{include_docs:!0})));let r=[];for(let o of await Promise.all(t))r=r.concat(o.rows.map(s=>s.doc));let n=await e.getMultiple($at,{allowMissing:!0});r.push(...n);let i=new Map;return r.forEach(o=>{delete o._rev,i.set(o._id,o)}),Array.from(i.values())}a(vDr,"getImportableDocuments");async function wDr(e,t,r){let n=ne.getDevWorkspaceID(e),i=`temp_${n}`,o=ne.getDB(i),s=ne.getDB(n);try{let u={file:{type:t.type,path:t.path,password:r}};await ZB.importApp(n,o,u,{updateAttachmentColumns:!0});let c=await gDr(o,s),l=await vDr(o),f=await bDr(s);if((await s.bulkDocs(yDr(l,f,c))).some(d=>d.error))throw new Se("Error importing documents",500);await jt.destroy(VB(n)),await noe(n)}finally{await o.destroy()}}a(wDr,"updateWithExport");var Boe={};oe(Boe,{get:()=>EDr,tryGet:()=>_Dr});async function EDr(e){return await(e?.production?z.getProdWorkspaceDB():z.getWorkspaceDB()).get("app_metadata")}a(EDr,"get");async function _Dr(e){return await(e?.production?z.getProdWorkspaceDB():z.getWorkspaceDB()).tryGet("app_metadata")}a(_Dr,"tryGet");var qoe={};oe(qoe,{getAppUrl:()=>xDr,isWorkspacePublished:()=>TDr});var SDr=/\/|\\/g;function xDr(e){let t;return e?.url?t=encodeURI(e?.url):e?.name&&(t=encodeURI(`${e?.name}`)),t&&(t=`/${t.replace(SDr,"")}`.toLowerCase()),t}a(xDr,"getAppUrl");async function TDr(e){return ne.isDevWorkspaceID(e)&&(e=ne.getProdWorkspaceID(e)),!!(await ne.getWorkspacesByIDs([e])).length}a(TDr,"isWorkspacePublished");var $oe={};oe($oe,{enrichWithDefaultWorkspaceAppUrl:()=>RDr,fetch:()=>ADr,filterAppList:()=>zat});function zat(e,t){let r=[],n=Object.keys(e.roles);if(ar.hasAppBuilderPermissions(e))r=e.builder?.apps||[],r=r.concat(n);else if(!ar.isAdminOrBuilder(e))r=n;else return t;return t.filter(i=>r.includes(ne.getProdWorkspaceID(i.appId)))}a(zat,"filterAppList");async function ADr(e,t){let r=e==="development",n=e==="all",i=await ne.getAllWorkspaces({dev:r,all:n}),o={...t,roles:t?.roles||{}},s=await on.enrichUserRolesFromGroups(o);i=zat(s,i);let u=i.filter(l=>l.status==="development").map(l=>l.appId);if(r||n){let l=await tXe(u);for(let f of i){let p=l[f.appId];p?f.lockedBy=p:delete f.lockedBy}}let c=await kie(i);return await xit(c)}a(ADr,"fetch");async function RDr(e){let t=[];for(let r of e){let n=await ne.doWithDB(r.appId,i=>G.workspaceApps.fetch(i));t.push({...r,defaultWorkspaceAppUrl:n[0]?.url||""})}return t}a(RDr,"enrichWithDefaultWorkspaceAppUrl");var Wat={...Bie,...qoe,...$oe,...joe,metadata:Boe};var Woe={};oe(Woe,{create:()=>kDr,fetch:()=>zoe,find:()=>Qat,getLLMOrThrow:()=>LDr,remove:()=>DDr,update:()=>CDr});var fS=ie(require("node-fetch"));var ak=`Bearer ${Oe.LITELLM_MASTER_KEY}`;async function Gat(e){let t=JSON.stringify({key_alias:e}),r={method:"POST",headers:{"Content-Type":"application/json",Authorization:ak},body:t},i=await(await(0,fS.default)(`${Oe.LITELLM_URL}/key/generate`,r)).json();return{id:i.token_id,secret:i.key}}a(Gat,"generateKey");async function Hat(e){let{name:t,baseUrl:r,provider:n,apiKey:i}=e;await Kat(e);let o={method:"POST",headers:{"Content-Type":"application/json",Authorization:ak},body:JSON.stringify({model_name:t,litellm_params:{api_base:r,api_key:i,custom_llm_provider:n,model:`${n}/${t}`,use_in_pass_through:!1,use_litellm_proxy:!1,merge_reasoning_content_in_choices:!1,input_cost_per_token:0,output_cost_per_token:0,guardrails:[]},model_info:{created_at:new Date().toISOString(),created_by:z.getIdentity()?.email}})};return(await(await(0,fS.default)(`${Oe.LITELLM_URL}/model/new`,o)).json()).model_id}a(Hat,"addModel");async function Vat(e){let{llmModelId:t,name:r,baseUrl:n,provider:i,apiKey:o}=e;await Kat(e);let s={method:"PATCH",headers:{"Content-Type":"application/json",Authorization:ak},body:JSON.stringify({model_name:r,litellm_params:{api_base:n,api_key:o,custom_llm_provider:i,model:`${i}/${r}`,use_in_pass_through:!1,use_litellm_proxy:!1,merge_reasoning_content_in_choices:!1,input_cost_per_token:0,output_cost_per_token:0,guardrails:[]},model_info:{updated_at:new Date().toISOString(),updated_by:z.getIdentity()?.email}})},c=await(await(0,fS.default)(`${Oe.LITELLM_URL}/model/${t}/update`,s)).json();if(c.status==="error"){let l=c.result.error.split(`
|
|
953
953
|
`)[0]||c.result.error;throw new Se(`Error updating configuration: ${l}`,400)}}a(Vat,"updateModel");async function Kat(e){let{name:t,baseUrl:r,provider:n,apiKey:i}=e,o={method:"POST",headers:{"Content-Type":"application/json",Authorization:ak},body:JSON.stringify({litellm_params:{model:`${n}/${t}`,custom_llm_provider:n,api_key:i,api_base:r}})},s=await(0,fS.default)(`${Oe.LITELLM_URL}/health/test_connection`,o);if(s.status!==200){let c=await s.text();throw new Se(c,500)}let u=await s.json();if(u.status==="error"){let c=u.result.error.split(`
|
|
954
954
|
`)[0]||u.result.error;throw new Se(`Error validating configuration: ${c}`,400)}}a(Kat,"validateConfig");async function aq(){let{liteLLM:e}=await ii.getSettingsConfig();if(!e)throw new Error("LiteLLM key not configured");let t=await G.aiConfigs.fetch(),r={method:"POST",headers:{"Content-Type":"application/json",Authorization:ak},body:JSON.stringify({key:e.keyId,models:t.map(o=>o.liteLLMModelId)})},i=await(await(0,fS.default)(`${Oe.LITELLM_URL}/key/update`,r)).json();if(i.status==="error"){let o=i.result.error.split(`
|
|
955
|
-
`)[0]||i.result.error;throw new Se(`Error syncing keys: ${o}`,400)}}a(aq,"syncKeyModels");async function zoe(){return(await z.getGlobalDB().allDocs(Ti.getDocParams("aiconfig",void 0,{include_docs:!0}))).rows.map(r=>r.doc).filter(r=>!!r)}a(zoe,"fetch");async function Qat(e){return await z.getGlobalDB().tryGet(e)}a(Qat,"find");async function Yat(e){let t=await zoe(),r=z.getGlobalDB(),n=[];for(let i of t)!i.isDefault||i._id===e||n.push({...i,isDefault:!1});n.length&&await r.bulkDocs(n)}a(Yat,"ensureSingleDefault");async function IDr(){let e=await ii.getSettingsConfigDoc();if(!e?.config.liteLLM?.keyId){e??={type:"settings",config:{}};let t=await Gat(z.getTenantId());e.config.liteLLM={keyId:t.id,secretKey:t.secret},await z.getGlobalDB().put(e)}return e.config.liteLLM}a(IDr,"ensureLiteLLMConfigured");async function kDr(e){await IDr();let t=z.getGlobalDB(),r=await Hat({provider:e.provider,name:e.model,baseUrl:e.baseUrl,apiKey:e.apiKey}),n={_id:Ti.generateAIConfigID(),isDefault:e.isDefault??!1,name:e.name,baseUrl:e.baseUrl,provider:e.provider,model:e.model,apiKey:e.apiKey,liteLLMModelId:r},{rev:i}=await t.put(n);return n._rev=i,n.isDefault&&await Yat(n._id),await aq(),n}a(kDr,"create");async function CDr(e){let t=e._id;if(!t)throw new Se("id cannot be empty",400);let r=await Qat(t);if(!r)throw new Se("Config to edit not found",404);e.apiKey=e.apiKey===Pf?r.apiKey:e.apiKey;let n={...r,...e},i=z.getGlobalDB(),{rev:o}=await i.put(n);return n._rev=o,n.isDefault&&await Yat(n._id),await Vat({llmModelId:e.liteLLMModelId,provider:e.provider,name:e.model,baseUrl:e.baseUrl,apiKey:e.apiKey}),await aq(),n}a(CDr,"update");async function DDr(e){let t=z.getGlobalDB(),r=await t.get(e);await t.remove(r),await aq()}a(DDr,"remove");async function PDr(){return(await zoe()).find(t=>t.isDefault)}a(PDr,"getDefault");async function NDr(){return(await ii.getSettingsConfigDoc()).config.liteLLM?.secretKey}a(NDr,"getLiteLLMSecretKey");async function LDr(){let e=await PDr();if(!e)throw new Se("Chat config not found",422);let t=await NDr();if(!t)throw new Se("LiteLLM should be configured. Contact support if the issue persists.",422);return await Hn.getChatLLM({model:e.liteLLMModelId,baseUrl:Oe.LITELLM_URL,apiKey:t})}a(LDr,"getLLMOrThrow");var FDr={backups:ZB,tables:Mb,automations:Af,workspaces:Wat,rows:Mat,users:Ctt,datasources:Of,queries:mat,plugins:Rie,screens:Uoe,views:zI,permissions:_ae,links:aat,rowActions:_oe,common:doe,oauth2:yoe,ai:Nie,workspaceApps:Moe,navigation:goe,resources:Eoe,deployment:iat,dev:nre,workspace:hoe,aiConfigs:Woe},G=FDr;var xm=require("undici");var ok={path:{type:"string",display:"URL"},queryString:{type:"string"},headers:{type:"object"},enabledHeaders:{type:"object"},requestBody:{type:"json"},bodyType:{type:"string",enum:Object.values(cq)},pagination:{type:"object"}},UDr={docs:"https://github.com/node-fetch/node-fetch",description:"With the REST API datasource, you can connect, query and pull data from multiple REST APIs. You can then use the retrieved data to build apps.",friendlyName:"REST API",type:"API",datasource:{url:{type:"string",default:"",required:!1,deprecated:!0},defaultHeaders:{type:"object",required:!1,default:{}},rejectUnauthorized:{display:"Reject Unauthorized",type:"boolean",default:!0,required:!1},downloadImages:{display:"Download images",type:"boolean",default:!0,required:!1}},query:{create:{readable:!0,displayName:"POST",type:"fields",fields:ok},read:{displayName:"GET",readable:!0,type:"fields",fields:ok},update:{displayName:"PUT",readable:!0,type:"fields",fields:ok},patch:{displayName:"PATCH",readable:!0,type:"fields",fields:ok},delete:{displayName:"DELETE",type:"fields",fields:ok}}},Voe=a(e=>Object.prototype.toString.call(e)==="[object Object]","isPlainRecord"),MDr=a(e=>{if(e==null)return{bodyString:"",bodyObject:{},jsonValue:void 0};if(typeof e=="string")try{let t=JSON.parse(e);return Voe(t)?{bodyString:e,bodyObject:t,jsonValue:t}:{bodyString:e,bodyObject:{},jsonValue:t}}catch(t){return{bodyString:e,bodyObject:{},parseError:t}}return Buffer.isBuffer(e)?{bodyString:e.toString(),bodyObject:{},jsonValue:e.toString()}:e instanceof Uint8Array?{bodyString:Buffer.from(e).toString(),bodyObject:{},jsonValue:Buffer.from(e).toString()}:Voe(e)?{bodyString:JSON.stringify(e),bodyObject:e,jsonValue:e}:Array.isArray(e)?{bodyString:JSON.stringify(e),bodyObject:{},jsonValue:e}:{bodyString:JSON.stringify(e),bodyObject:{},jsonValue:void 0}},"normaliseBody"),Koe=class{constructor(t){this.headers={};this.startTimeMs=oq.performance.now();this.config=t}static{a(this,"RestIntegration")}async parseResponse(t,r){let n,i,o={},s,{contentType:u,contentDisposition:c}=XJe(t.headers,{downloadImages:this.config.downloadImages}),l=t.headers.get("content-length"),f=t.status>=200&&t.status<300;(c.includes("filename")||c.includes("attachment")||c.includes("form-data"))&&f&&(s=Zat.default.basename((0,Xat.parse)(c).parameters?.filename)||"");let p=!1,d;try{if(s)return IJe(t,s,this.startTimeMs);{d=t.text?await t.text():"",!l&&d&&(l=Buffer.byteLength(d,"utf8").toString());let y=l&&parseInt(l)>0||d.length>0;if(t.status===204)n=[],i="";else if(y&&u.includes("application/json"))p=!0,n=JSON.parse(d),i=d;else if(y&&u.includes("text/xml")||u.includes("application/xml")){p=!0;let b=await OJe(d);n=b.data,i=b.rawXml}else n=d,i=d}}catch(y){if(p)n=d,i=d;else throw new Error(`Failed to parse response body: ${y}`)}let h=rj(l||"0"),m=`${Math.round(oq.performance.now()-this.startTimeMs)}ms`;for(let[y,b]of t.headers.entries())o[y]=b;let g;return r?.responseParam&&(g=(0,Jat.default)(n,r.responseParam)),{data:n,info:{code:t.status,size:h,time:m},extra:{raw:i,headers:o},pagination:{cursor:g}}}getUrl(t,r,n,i){if(n?.location==="query"&&i){let{pageParam:u,sizeParam:c}=n,l=new Hoe.URLSearchParams;u&&i.page!=null&&l.append(u,i.page),c&&i.limit!=null&&l.append(c,String(i.limit));let f=l.toString();f&&(r=`${f}&${r}`)}if(r){let u=Goe.default.decode(r),c={};for(let[l,f]of Object.entries(u))f!==""&&f!=null&&(c[l]=f);Object.keys(c).length>0?r="?"+Goe.default.encode(c):r=""}let o=`${t}${r}`,s=o;return this.config.url&&!o.startsWith("http")&&(s=this.config.url?`${this.config.url}/${o}`:o),s.startsWith("http")||(s=`http://${s}`),s}addBody(t,r,n,i,o){if(n.headers||(n.headers={}),t==="none")return n;let s,u={},c="",l;if(r!=null){let{bodyString:p,bodyObject:d,parseError:h,jsonValue:m}=MDr(r);c=p,u=d,s=h,l=m}let f=a(p=>{i?.location==="body"&&(i?.pageParam&&o?.page!=null&&p(i.pageParam,o.page),i?.sizeParam&&o?.limit!=null&&p(i.sizeParam,o.limit))},"addPaginationToBody");switch(t){case"text":n.body=c;break;case"encoded":{let p=new Hoe.URLSearchParams;for(let[d,h]of Object.entries(u))p.append(d,String(h));f((d,h)=>{h!=null&&p.append(d,String(h))}),n.body=p;break}case"form":{let p=new xm.FormData,d=a((g,y)=>{if(y==null){p.append(g,"");return}if(typeof y=="string"){p.append(g,y);return}if(y instanceof Blob){p.append(g,y);return}if(Buffer.isBuffer(y)){p.append(g,Buffer.from(y).toString());return}if(y instanceof Uint8Array){p.append(g,Buffer.from(y).toString());return}p.append(g,String(y))},"appendFormValue");for(let[g,y]of Object.entries(u))d(g,y);f((g,y)=>{y!=null&&d(g,y)});let m=p.getHeaders?.();if(m){let y=a(()=>{if(!n.headers){let b={};return n.headers=b,b}if(Array.isArray(n.headers)){let b=n.headers.reduce((v,[w,x])=>(v[w]=x,v),{});return n.headers=b,b}if(n.headers instanceof xm.Headers){let b={};return n.headers.forEach((v,w)=>{b[w]=v}),n.headers=b,b}return n.headers},"ensureHeaderObject")();for(let[b,v]of Object.entries(m)){let w=b.toLowerCase();if(Object.keys(y).find(I=>I.toLowerCase()===w)||typeof v>"u"||v===null)continue;let T=Array.isArray(v)?v.join(", "):String(v);y[b]=T}}n.body=p;break}case"xml":u!=null&&Object.keys(u).length&&(c=new eot.Builder().buildObject(u)),n.body=c,n.headers["Content-Type"]="application/xml";break;case"json":{if(s)throw"Invalid JSON for request body";let p;if(typeof l<"u")p=l;else if(c)try{p=JSON.parse(c)}catch{p=u}else p=u;if(i?.location==="body"&&Voe(p)){let d={...p};i.pageParam&&o?.page!=null&&(d[i.pageParam]=o.page),i.sizeParam&&o?.limit!=null&&(d[i.sizeParam]=o.limit),p=d}else if(i?.location==="body"){let d={...u};i.pageParam&&o?.page!=null&&(d[i.pageParam]=o.page),i.sizeParam&&o?.limit!=null&&(d[i.sizeParam]=o.limit),Object.keys(d).length>0&&(p=d)}n.body=typeof p=="string"?p:JSON.stringify(p),n.headers["Content-Type"]="application/json";break}}return n}async getAuthHeaders(t,r){if(!t)return{};if(r==="oauth2")return{Authorization:await G.oauth2.getToken(t)};if(!this.config.authConfigs)return{};let n={},i=this.config.authConfigs.filter(o=>o._id===t)[0];if(i){let{type:o,config:s}=i;switch(o){case"basic":n.Authorization=`Basic ${Buffer.from(`${s.username}:${s.password}`).toString("base64")}`;break;case"bearer":n.Authorization=`Bearer ${s.token}`;break;default:throw Ut.unreachable(o)}}return n}async _req(t,r=!0){let{path:n="",queryString:i="",headers:o={},method:s="GET",disabledHeaders:u,bodyType:c="none",requestBody:l,authConfigId:f,authConfigType:p,pagination:d,paginationValues:h}=t,m=await this.getAuthHeaders(f,p);if(this.headers={...this.config.defaultHeaders||{},...o,...m},u)for(let x of Object.keys(this.headers))u[x]&&delete this.headers[x];let g={method:s,headers:this.headers};g=this.addBody(c,l,g,d,h),this.config.legacyHttpParser&&(g.extraHttpOptions={insecureHTTPParser:!0}),this.startTimeMs=oq.performance.now();let y=this.getUrl(n,i,d,h);if(await GU.isBlacklisted(y))throw new Error("Cannot connect to URL.");let b=!!Oe.REST_REJECT_UNAUTHORIZED,v=pJe({rejectUnauthorized:b});if(v)console.log("[rest integration] Using proxy for request",{url:y,hasDispatcher:!0,isHttpsUrl:y.startsWith("https://"),rejectUnauthorized:b,configRejectUnauthorized:this.config.rejectUnauthorized,proxyUri:process.env.GLOBAL_AGENT_HTTPS_PROXY||process.env.GLOBAL_AGENT_HTTP_PROXY||process.env.HTTPS_PROXY||process.env.HTTP_PROXY}),g.dispatcher=v;else if(b){let x=new xm.Agent({connect:{rejectUnauthorized:!1}});g.dispatcher=x}let w;try{w=await(0,xm.fetch)(y,g)}catch(x){let T=x;throw console.log("[rest integration] Fetch error details",{url:y,error:T.message,cause:T.cause?.message,code:T.cause?.code,hasDispatcher:!!g.dispatcher,isHttpsUrl:y.startsWith("https://"),rejectUnauthorized:b}),T.cause?.code==="UNABLE_TO_VERIFY_LEAF_SIGNATURE"||T.cause?.code==="CERT_UNTRUSTED"||T.cause?.code==="SELF_SIGNED_CERT_IN_CHAIN"?new Error(`SSL certificate verification failed for ${y}. Consider setting rejectUnauthorized to false if using self-signed certificates. Original error: ${T.message}`):T.cause?.code==="ECONNREFUSED"&&g.dispatcher?new Error(`Connection refused when using proxy. Check proxy configuration and ensure the proxy server is accessible. Original error: ${T.message}`):T}return w.status===401&&p==="oauth2"&&r?(await G.oauth2.cleanStoredToken(f),await this._req(t,!1)):await this.parseResponse(w,d)}async create(t){return this._req({...t,method:"POST"})}async read(t){return this._req({...t,method:"GET"})}async update(t){return this._req({...t,method:"PUT"})}async patch(t){return this._req({...t,method:"PATCH"})}async delete(t){return this._req({...t,method:"DELETE"})}},Qoe={schema:UDr,integration:Koe};var tot=require("@google-cloud/firestore");var jDr={docs:"https://firebase.google.com/docs/firestore/quickstart",friendlyName:"Firestore",type:"Non-relational",description:"Cloud Firestore is a flexible, scalable database for mobile, web, and server development from Firebase and Google Cloud.",features:{connection:!0},datasource:{email:{type:"string",required:!0},privateKey:{type:"string",display:"Private Key",required:!0},projectId:{type:"string",display:"Project ID",required:!0},databaseId:{type:"string",display:"Database ID",required:!1,default:"(default)",placeholder:"(default)"}},query:{create:{type:"json"},read:{type:"json"},update:{type:"json"},delete:{type:"json"}},extra:{collection:{displayName:"Collection",type:"string",required:!0},filterField:{displayName:"Filter field",type:"string",required:!1},filter:{displayName:"Filter comparison",type:"list",required:!1,data:{read:["==","<","<=","!=",">=",">","array-contains","in","not-in","array-contains-any"]}},filterValue:{displayName:"Filter value",type:"string",required:!1}}},Yoe=class{static{a(this,"FirebaseIntegration")}constructor(t){this.config=t,this.client=new tot.Firestore({projectId:t.projectId,databaseId:t.databaseId||"(default)",credentials:{client_email:t.email,private_key:t.privateKey?.replace(/\\n/g,`
|
|
955
|
+
`)[0]||i.result.error;throw new Se(`Error syncing keys: ${o}`,400)}}a(aq,"syncKeyModels");async function zoe(){return(await z.getGlobalDB().allDocs(Ti.getDocParams("aiconfig",void 0,{include_docs:!0}))).rows.map(r=>r.doc).filter(r=>!!r)}a(zoe,"fetch");async function Qat(e){return await z.getGlobalDB().tryGet(e)}a(Qat,"find");async function Yat(e){let t=await zoe(),r=z.getGlobalDB(),n=[];for(let i of t)!i.isDefault||i._id===e||n.push({...i,isDefault:!1});n.length&&await r.bulkDocs(n)}a(Yat,"ensureSingleDefault");async function IDr(){let e=await ii.getSettingsConfigDoc();if(!e?.config.liteLLM?.keyId){e??={type:"settings",config:{}};let t=await Gat(z.getTenantId());e.config.liteLLM={keyId:t.id,secretKey:t.secret},await z.getGlobalDB().put(e)}return e.config.liteLLM}a(IDr,"ensureLiteLLMConfigured");async function kDr(e){await IDr();let t=z.getGlobalDB(),r=await Hat({provider:e.provider,name:e.model,baseUrl:e.baseUrl,apiKey:e.apiKey}),n={_id:Ti.generateAIConfigID(),isDefault:e.isDefault??!1,name:e.name,baseUrl:e.baseUrl,provider:e.provider,model:e.model,apiKey:e.apiKey,liteLLMModelId:r},{rev:i}=await t.put(n);return n._rev=i,n.isDefault&&await Yat(n._id),await aq(),n}a(kDr,"create");async function CDr(e){let t=e._id;if(!t)throw new Se("id cannot be empty",400);let r=await Qat(t);if(!r)throw new Se("Config to edit not found",404);e.apiKey=e.apiKey===Pf?r.apiKey:e.apiKey;let n={...r,...e},i=z.getGlobalDB(),{rev:o}=await i.put(n);return n._rev=o,n.isDefault&&await Yat(n._id),await Vat({llmModelId:e.liteLLMModelId,provider:e.provider,name:e.model,baseUrl:e.baseUrl,apiKey:e.apiKey}),await aq(),n}a(CDr,"update");async function DDr(e){let t=z.getGlobalDB(),r=await t.get(e);await t.remove(r),await aq()}a(DDr,"remove");async function PDr(){return(await zoe()).find(t=>t.isDefault)}a(PDr,"getDefault");async function NDr(){return(await ii.getSettingsConfigDoc()).config.liteLLM?.secretKey}a(NDr,"getLiteLLMSecretKey");async function LDr(){let e=await PDr();if(!e)throw new Se("Chat config not found",422);let t=await NDr();if(!t)throw new Se("LiteLLM should be configured. Contact support if the issue persists.",422);return await Hn.getChatLLM({model:e.liteLLMModelId,baseUrl:Oe.LITELLM_URL,apiKey:t})}a(LDr,"getLLMOrThrow");var FDr={backups:ZB,tables:Mb,automations:Af,workspaces:Wat,rows:Mat,users:Ctt,datasources:Of,queries:mat,plugins:Rie,screens:Uoe,views:zI,permissions:_ae,links:aat,rowActions:_oe,common:doe,oauth2:yoe,ai:Nie,workspaceApps:Moe,navigation:goe,resources:Eoe,deployment:iat,dev:nre,workspace:hoe,aiConfigs:Woe},G=FDr;var xm=require("undici");var ok={path:{type:"string",display:"URL"},queryString:{type:"string"},headers:{type:"object"},enabledHeaders:{type:"object"},requestBody:{type:"json"},bodyType:{type:"string",enum:Object.values(cq)},pagination:{type:"object"}},UDr={docs:"https://github.com/node-fetch/node-fetch",description:"With the REST API datasource, you can connect, query and pull data from multiple REST APIs. You can then use the retrieved data to build apps.",friendlyName:"REST API",type:"API",datasource:{url:{type:"string",default:"",required:!1,deprecated:!0},defaultHeaders:{type:"object",required:!1,default:{}},rejectUnauthorized:{display:"Reject Unauthorized",type:"boolean",default:!0,required:!1},downloadImages:{display:"Download images",type:"boolean",default:!0,required:!1}},query:{create:{readable:!0,displayName:"POST",type:"fields",fields:ok},read:{displayName:"GET",readable:!0,type:"fields",fields:ok},update:{displayName:"PUT",readable:!0,type:"fields",fields:ok},patch:{displayName:"PATCH",readable:!0,type:"fields",fields:ok},delete:{displayName:"DELETE",type:"fields",fields:ok}}},Voe=a(e=>Object.prototype.toString.call(e)==="[object Object]","isPlainRecord"),MDr=a(e=>{if(e==null)return{bodyString:"",bodyObject:{},jsonValue:void 0};if(typeof e=="string")try{let t=JSON.parse(e);return Voe(t)?{bodyString:e,bodyObject:t,jsonValue:t}:{bodyString:e,bodyObject:{},jsonValue:t}}catch(t){return{bodyString:e,bodyObject:{},parseError:t}}return Buffer.isBuffer(e)?{bodyString:e.toString(),bodyObject:{},jsonValue:e.toString()}:e instanceof Uint8Array?{bodyString:Buffer.from(e).toString(),bodyObject:{},jsonValue:Buffer.from(e).toString()}:Voe(e)?{bodyString:JSON.stringify(e),bodyObject:e,jsonValue:e}:Array.isArray(e)?{bodyString:JSON.stringify(e),bodyObject:{},jsonValue:e}:{bodyString:JSON.stringify(e),bodyObject:{},jsonValue:void 0}},"normaliseBody"),Koe=class{constructor(t){this.headers={};this.startTimeMs=oq.performance.now();this.config=t}static{a(this,"RestIntegration")}async parseResponse(t,r){let n,i,o={},s,{contentType:u,contentDisposition:c}=XJe(t.headers,{downloadImages:this.config.downloadImages}),l=t.headers.get("content-length"),f=t.status>=200&&t.status<300;(c.includes("filename")||c.includes("attachment")||c.includes("form-data"))&&f&&(s=Zat.default.basename((0,Xat.parse)(c).parameters?.filename)||"");let p=!1,d;try{if(s)return IJe(t,s,this.startTimeMs);{d=t.text?await t.text():"",!l&&d&&(l=Buffer.byteLength(d,"utf8").toString());let y=l&&parseInt(l)>0||d.length>0;if(t.status===204)n=[],i="";else if(y&&u.includes("application/json"))p=!0,n=JSON.parse(d),i=d;else if(y&&u.includes("text/xml")||u.includes("application/xml")){p=!0;let b=await OJe(d);n=b.data,i=b.rawXml}else n=d,i=d}}catch(y){if(p)n=d,i=d;else throw new Error(`Failed to parse response body: ${y}`)}let h=rj(l||"0"),m=`${Math.round(oq.performance.now()-this.startTimeMs)}ms`;for(let[y,b]of t.headers.entries())o[y]=b;let g;return r?.responseParam&&(g=(0,Jat.default)(n,r.responseParam)),{data:n,info:{code:t.status,size:h,time:m},extra:{raw:i,headers:o},pagination:{cursor:g}}}getUrl(t,r,n,i){if(n?.location==="query"&&i){let{pageParam:u,sizeParam:c}=n,l=new Hoe.URLSearchParams;u&&i.page!=null&&l.append(u,i.page),c&&i.limit!=null&&l.append(c,String(i.limit));let f=l.toString();f&&(r=`${f}&${r}`)}if(r){let u=Goe.default.decode(r),c={};for(let[l,f]of Object.entries(u))f!==""&&f!=null&&(c[l]=f);Object.keys(c).length>0?r="?"+Goe.default.encode(c):r=""}let o=`${t}${r}`,s=o;return this.config.url&&!o.startsWith("http")&&(s=this.config.url?`${this.config.url}/${o}`:o),s.startsWith("http")||(s=`http://${s}`),s}addBody(t,r,n,i,o){if(n.headers||(n.headers={}),t==="none")return n;let s,u={},c="",l;if(r!=null){let{bodyString:p,bodyObject:d,parseError:h,jsonValue:m}=MDr(r);c=p,u=d,s=h,l=m}let f=a(p=>{i?.location==="body"&&(i?.pageParam&&o?.page!=null&&p(i.pageParam,o.page),i?.sizeParam&&o?.limit!=null&&p(i.sizeParam,o.limit))},"addPaginationToBody");switch(t){case"text":n.body=c;break;case"encoded":{let p=new Hoe.URLSearchParams;for(let[d,h]of Object.entries(u))p.append(d,String(h));f((d,h)=>{h!=null&&p.append(d,String(h))}),n.body=p;break}case"form":{let p=new xm.FormData,d=a((y,b)=>{if(b==null){p.append(y,"");return}if(typeof b=="string"){p.append(y,b);return}if(b instanceof Blob){p.append(y,b);return}if(Buffer.isBuffer(b)){p.append(y,Buffer.from(b).toString());return}if(b instanceof Uint8Array){p.append(y,Buffer.from(b).toString());return}p.append(y,String(b))},"appendFormValue");for(let[y,b]of Object.entries(u))d(y,b);f((y,b)=>{b!=null&&d(y,b)});let m=a(()=>n.headers?Array.isArray(n.headers)?n.headers.reduce((b,[v,w])=>(b[v]=w,b),{}):n.headers instanceof xm.Headers?Object.fromEntries(n.headers):n.headers:{},"ensureHeaderObject")(),g=Object.keys(m).find(y=>y.toLowerCase()==="content-type");g&&delete m[g],n.headers=m,n.body=p;break}case"xml":u!=null&&Object.keys(u).length&&(c=new eot.Builder().buildObject(u)),n.body=c,n.headers["Content-Type"]="application/xml";break;case"json":{if(s)throw"Invalid JSON for request body";let p;if(typeof l<"u")p=l;else if(c)try{p=JSON.parse(c)}catch{p=u}else p=u;if(i?.location==="body"&&Voe(p)){let d={...p};i.pageParam&&o?.page!=null&&(d[i.pageParam]=o.page),i.sizeParam&&o?.limit!=null&&(d[i.sizeParam]=o.limit),p=d}else if(i?.location==="body"){let d={...u};i.pageParam&&o?.page!=null&&(d[i.pageParam]=o.page),i.sizeParam&&o?.limit!=null&&(d[i.sizeParam]=o.limit),Object.keys(d).length>0&&(p=d)}n.body=typeof p=="string"?p:JSON.stringify(p),n.headers["Content-Type"]="application/json";break}}return n}async getAuthHeaders(t,r){if(!t)return{};if(r==="oauth2")return{Authorization:await G.oauth2.getToken(t)};if(!this.config.authConfigs)return{};let n={},i=this.config.authConfigs.filter(o=>o._id===t)[0];if(i){let{type:o,config:s}=i;switch(o){case"basic":n.Authorization=`Basic ${Buffer.from(`${s.username}:${s.password}`).toString("base64")}`;break;case"bearer":n.Authorization=`Bearer ${s.token}`;break;default:throw Ut.unreachable(o)}}return n}async _req(t,r=!0){let{path:n="",queryString:i="",headers:o={},method:s="GET",disabledHeaders:u,bodyType:c="none",requestBody:l,authConfigId:f,authConfigType:p,pagination:d,paginationValues:h}=t,m=await this.getAuthHeaders(f,p);if(this.headers={...this.config.defaultHeaders||{},...o,...m},u)for(let x of Object.keys(this.headers))u[x]&&delete this.headers[x];let g={method:s,headers:this.headers};g=this.addBody(c,l,g,d,h),this.config.legacyHttpParser&&(g.extraHttpOptions={insecureHTTPParser:!0}),this.startTimeMs=oq.performance.now();let y=this.getUrl(n,i,d,h);if(await GU.isBlacklisted(y))throw new Error("Cannot connect to URL.");let b=!!Oe.REST_REJECT_UNAUTHORIZED,v=pJe({rejectUnauthorized:b});if(v)console.log("[rest integration] Using proxy for request",{url:y,hasDispatcher:!0,isHttpsUrl:y.startsWith("https://"),rejectUnauthorized:b,configRejectUnauthorized:this.config.rejectUnauthorized,proxyUri:process.env.GLOBAL_AGENT_HTTPS_PROXY||process.env.GLOBAL_AGENT_HTTP_PROXY||process.env.HTTPS_PROXY||process.env.HTTP_PROXY}),g.dispatcher=v;else if(b){let x=new xm.Agent({connect:{rejectUnauthorized:!1}});g.dispatcher=x}let w;try{w=await(0,xm.fetch)(y,g)}catch(x){let T=x;throw console.log("[rest integration] Fetch error details",{url:y,error:T.message,cause:T.cause?.message,code:T.cause?.code,hasDispatcher:!!g.dispatcher,isHttpsUrl:y.startsWith("https://"),rejectUnauthorized:b}),T.cause?.code==="UNABLE_TO_VERIFY_LEAF_SIGNATURE"||T.cause?.code==="CERT_UNTRUSTED"||T.cause?.code==="SELF_SIGNED_CERT_IN_CHAIN"?new Error(`SSL certificate verification failed for ${y}. Consider setting rejectUnauthorized to false if using self-signed certificates. Original error: ${T.message}`):T.cause?.code==="ECONNREFUSED"&&g.dispatcher?new Error(`Connection refused when using proxy. Check proxy configuration and ensure the proxy server is accessible. Original error: ${T.message}`):T}return w.status===401&&p==="oauth2"&&r?(await G.oauth2.cleanStoredToken(f),await this._req(t,!1)):await this.parseResponse(w,d)}async create(t){return this._req({...t,method:"POST"})}async read(t){return this._req({...t,method:"GET"})}async update(t){return this._req({...t,method:"PUT"})}async patch(t){return this._req({...t,method:"PATCH"})}async delete(t){return this._req({...t,method:"DELETE"})}},Qoe={schema:UDr,integration:Koe};var tot=require("@google-cloud/firestore");var jDr={docs:"https://firebase.google.com/docs/firestore/quickstart",friendlyName:"Firestore",type:"Non-relational",description:"Cloud Firestore is a flexible, scalable database for mobile, web, and server development from Firebase and Google Cloud.",features:{connection:!0},datasource:{email:{type:"string",required:!0},privateKey:{type:"string",display:"Private Key",required:!0},projectId:{type:"string",display:"Project ID",required:!0},databaseId:{type:"string",display:"Database ID",required:!1,default:"(default)",placeholder:"(default)"}},query:{create:{type:"json"},read:{type:"json"},update:{type:"json"},delete:{type:"json"}},extra:{collection:{displayName:"Collection",type:"string",required:!0},filterField:{displayName:"Filter field",type:"string",required:!1},filter:{displayName:"Filter comparison",type:"list",required:!1,data:{read:["==","<","<=","!=",">=",">","array-contains","in","not-in","array-contains-any"]}},filterValue:{displayName:"Filter value",type:"string",required:!1}}},Yoe=class{static{a(this,"FirebaseIntegration")}constructor(t){this.config=t,this.client=new tot.Firestore({projectId:t.projectId,databaseId:t.databaseId||"(default)",credentials:{client_email:t.email,private_key:t.privateKey?.replace(/\\n/g,`
|
|
956
956
|
`)}})}async testConnection(){try{return await this.client.listCollections(),{connected:!0}}catch(t){return{connected:!1,error:t.message}}}async create(t){try{let r=this.client.collection(t.extra.collection).doc();return await r.set({...t.json,id:r.id}),(await r.get()).data()}catch(r){throw console.error("Error writing to Firestore",r),r}}async read(t){try{let r,n=this.client.collection(t.extra.collection);t.extra.filterField&&t.extra.filter&&t.extra.filterValue?r=await n.where(t.extra.filterField,t.extra.filter,t.extra.filterValue).get():r=await n.get();let i=[];return r.forEach(o=>i.push(o.data())),i}catch(r){throw console.error("Error querying Firestore",r),r}}async update(t){try{return await this.client.collection(t.extra.collection).doc(t.json.id).update(t.json),(await this.client.collection(t.extra.collection).doc(t.json.id).get()).data()}catch(r){throw console.error("Error writing to Firestore",r),r}}async delete(t){try{return await this.client.collection(t.extra.collection).doc(t.json.id).delete(),!0}catch(r){throw console.error("Error deleting from Firestore",r),r}}},Joe={schema:jDr,integration:Yoe};var rot=ie(require("ioredis"));var BDr={docs:"https://redis.io/docs/",description:"Redis is a caching tool, providing powerful key-value store capabilities.",friendlyName:"Redis",type:"Non-relational",features:{connection:!0},datasource:{host:{type:"string",required:!0,default:xo},port:{type:"number",required:!0,default:6379},username:{type:"string",required:!1},password:{type:"password",required:!1},db:{type:"number",required:!1,display:"DB",default:0}},query:{create:{type:"fields",fields:{key:{type:"string",required:!0},value:{type:"string",required:!0},ttl:{type:"number"}}},read:{readable:!0,type:"fields",fields:{key:{type:"string",required:!0}}},delete:{type:"fields",fields:{key:{type:"string",required:!0}}},command:{readable:!0,displayName:"Redis Command",type:"json"}}},Xoe=class{static{a(this,"RedisIntegration")}constructor(t){this.config=t,this.client=new rot.default({host:this.config.host,port:this.config.port,username:this.config.username,password:this.config.password,db:this.config.db})}async testConnection(){let t={connected:!1};try{await this.client.ping(),t.connected=!0}catch(r){t.error=r.message}finally{await this.disconnect()}return t}async disconnect(){return this.client.quit()}async redisContext(t){try{return await t()}catch(r){throw new Error(`Redis error: ${r}`)}finally{await this.disconnect()}}async create(t){return this.redisContext(async()=>{let r=await this.client.set(t.key,t.value);return t.ttl&&await this.client.expire(t.key,t.ttl),r})}async read(t){return this.redisContext(async()=>await this.client.get(t.key))}async delete(t){return this.redisContext(async()=>await this.client.del(t.key))}async command(t){return this.redisContext(async()=>{let r=t.json.trim().split(`
|
|
957
957
|
`),n=[],i;for(let u of r){let c=u.trim().match(/".*"/);c?.[0]?i=[...u.substring(0,u.indexOf(c[0])-1).trim().split(" "),c?.[0]]:i=u.trim().split(" "),i[0]=i[0].toLowerCase(),n.push(i)}return(await this.client.pipeline(n).exec())?.map(u=>{if(typeof u=="string")return u;if(Array.isArray(u))return u[1]})})}},Zoe={schema:BDr,integration:Xoe};var not=ie(require("snowflake-sdk")),iot=require("util");var qDr={docs:"https://developers.snowflake.com/",description:"Snowflake is a solution for data warehousing, data lakes, data engineering, data science, data application development, and securely sharing and consuming shared data.",friendlyName:"Snowflake",type:"Relational",features:{connection:!0},datasource:{account:{type:"string",required:!0},username:{type:"string",required:!0},password:{type:"password",required:!0},role:{type:"string"},warehouse:{type:"string",required:!0},database:{type:"string",required:!0},schema:{type:"string",required:!0}},query:{create:{type:"sql"},read:{type:"sql"},update:{type:"sql"},delete:{type:"sql"}}},ese=class{static{a(this,"SnowflakePromise")}constructor(t){this.config=t}async connect(){return this.client?.isUp()?void 0:(this.client=not.default.createConnection(this.config),(0,iot.promisify)(this.client.connect.bind(this.client))())}async execute(t){return new Promise((r,n)=>{if(!this.client)throw Error("No snowflake client present to execute query. Run connect() first to initialise.");this.client.execute({sqlText:t,complete:function(i,o,s){if(i)return n(i);r(s)}})})}},tse=class{static{a(this,"SnowflakeIntegration")}constructor(t){this.client=new ese(t)}async testConnection(){try{return await this.client.connect(),{connected:!0}}catch(t){return{connected:!1,error:t.message}}}async internalQuery(t){await this.client.connect();try{return await this.client.execute(t.sql)}catch(r){throw r?.message.split(":")[1]||r?.message}}async create(t){return this.internalQuery(t)}async read(t){return this.internalQuery(t)}async update(t){return this.internalQuery(t)}async delete(t){return this.internalQuery(t)}},rse={schema:qDr,integration:tse};var Tm=ie(require("oracledb"));var $Dr=Vt.Sql;Tm.default.outFormat=Tm.default.OUT_FORMAT_OBJECT;var zDr={docs:"https://github.com/oracle/node-oracledb",plus:!0,friendlyName:"Oracle",type:"Relational",description:"Oracle Database is an object-relational database management system developed by Oracle Corporation",features:{connection:!0,fetch_table_names:!0},datasource:{host:{type:"string",default:xo,required:!0},port:{type:"number",required:!0,default:1521},database:{type:"string",required:!0,display:"Service Name"},user:{type:"string",required:!0},password:{type:"password",required:!0}},query:{create:{type:"sql"},read:{type:"sql"},update:{type:"sql"},delete:{type:"sql"}}},WDr=["BLOB","NCLOB"],nse={PRIMARY:"P",NOT_NULL_OR_CHECK:"C",FOREIGN_KEY:"R",UNIQUE:"U"},ise=class e extends $Dr{constructor(r){super("oracledb");this.index=1;this.getConnection=async()=>{let r=`${this.config.host}:${this.config.port||1521}/${this.config.database}`,n={user:this.config.user,password:this.config.password,connectString:r},i=Intl.DateTimeFormat().resolvedOptions().timeZone,o=await Tm.default.getConnection(n);return await o.execute(`ALTER SESSION SET TIME_ZONE = '${i}'`),o};this.config=r}static{a(this,"OracleIntegration")}static{this.COLUMNS_SQL=`
|
|
958
958
|
SELECT
|