@budibase/server 3.31.0 → 3.31.1

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.
Files changed (114) hide show
  1. package/builder/assets/{easymde-HX3mUOM9.js → easymde-DrXpYQde.js} +1 -1
  2. package/builder/assets/{index-D61jmqaO.js → index-C-p9LCen.js} +163 -163
  3. package/builder/index.html +1 -1
  4. package/client/budibase-client.js +1 -1
  5. package/client/chunks/{Accordion-CDsauYE5.js → Accordion-D3ba3v-s.js} +1 -1
  6. package/client/chunks/{ApexChart-CDK7H0l9.js → ApexChart-N1VcsloD.js} +2 -2
  7. package/client/chunks/{AreaChart-D8KexJ6C.js → AreaChart-C0O1SneW.js} +2 -2
  8. package/client/chunks/{AttachmentField-Xe3q5ZNZ.js → AttachmentField-CgQ_-FH_.js} +2 -2
  9. package/client/chunks/{AttachmentSingleField-D21uZULQ.js → AttachmentSingleField-BxeoTcum.js} +2 -2
  10. package/client/chunks/{BBReferenceField-DbUadQLZ.js → BBReferenceField-BjfiAEqC.js} +3 -3
  11. package/client/chunks/{BBReferenceSingleField-DrL8Xo1h.js → BBReferenceSingleField-CXtfu1Q6.js} +2 -2
  12. package/client/chunks/{BackgroundImage-DlY4qNh6.js → BackgroundImage-kQ6jtjth.js} +1 -1
  13. package/client/chunks/{BarChart-BazJAOCO.js → BarChart-CBO7tIOl.js} +2 -2
  14. package/client/chunks/{BigIntField-B5-UxwgL.js → BigIntField-DEG89OPq.js} +2 -2
  15. package/client/chunks/{BooleanField--Prv9Rk2.js → BooleanField-D1PJD6_I.js} +2 -2
  16. package/client/chunks/{Button-Ga_b4bLj.js → Button-DvYRuMIO.js} +1 -1
  17. package/client/chunks/{ButtonGroup-L1mzgFRj.js → ButtonGroup-fN6iL-cY.js} +2 -2
  18. package/client/chunks/{Calendar-DOvXcY6J.js → Calendar-D4ocmsBe.js} +1 -1
  19. package/client/chunks/{CandleStickChart-wpN7SkV2.js → CandleStickChart-DUJo0ARy.js} +2 -2
  20. package/client/chunks/{Card-JWx7telc.js → Card-BIz7fvGG.js} +1 -1
  21. package/client/chunks/{CardHorizontal-cwTzcdPn.js → CardHorizontal-D3EmPAtQ.js} +1 -1
  22. package/client/chunks/{CardStat-deYURObr.js → CardStat-CuoSn04e.js} +1 -1
  23. package/client/chunks/{CardsBlock--9Z-6IMt.js → CardsBlock-DeaUMWfY.js} +2 -2
  24. package/client/chunks/{ChartBlock-CRxqYYd9.js → ChartBlock-Brf47HfL.js} +1 -1
  25. package/client/chunks/{CheckboxGroup-4LpY4td_.js → CheckboxGroup-CIhczifo.js} +1 -1
  26. package/client/chunks/{CodeGenerator-R2fjRGec.js → CodeGenerator-CKHTV59K.js} +1 -1
  27. package/client/chunks/{CodeScannerField-benqjZhx.js → CodeScannerField-2V9Pi7Qg.js} +4 -4
  28. package/client/chunks/{CollapsedButtonGroup-BoTDgJy7.js → CollapsedButtonGroup-CmDI60pS.js} +2 -2
  29. package/client/chunks/{Container-BLHBNH4u.js → Container-ChKd1xlm.js} +1 -1
  30. package/client/chunks/{DataProvider-B4TGdRLv.js → DataProvider-Boj6DT4w.js} +1 -1
  31. package/client/chunks/{DatePicker-CAAqntSX.js → DatePicker-B8SXjEDo.js} +1 -1
  32. package/client/chunks/{DatePicker-DNe5ygQ0.js → DatePicker-Ca0U8k8J.js} +2 -2
  33. package/client/chunks/{DateRangePicker-DiHCuHR1.js → DateRangePicker-Bnafreq0.js} +2 -2
  34. package/client/chunks/{DateTimeField-BTHd4_t6.js → DateTimeField-Cun68Ybm.js} +3 -3
  35. package/client/chunks/{Divider-Dh89GmX6.js → Divider-GM-wc5bB.js} +1 -1
  36. package/client/chunks/{DonutChart-I8WVw2UV.js → DonutChart-Cg-0lpsQ.js} +2 -2
  37. package/client/chunks/{DynamicFilter-DbuGT5JT.js → DynamicFilter-C0VNdDYM.js} +4 -4
  38. package/client/chunks/{Embed-C85Mp0yH.js → Embed-BAwInFom.js} +2 -2
  39. package/client/chunks/{EmbeddedMap-Dyhu1Tgb.js → EmbeddedMap-B-FsIVJZ.js} +2 -2
  40. package/client/chunks/{Field-B4o_-BR6.js → Field-CcYbBX-_.js} +3 -3
  41. package/client/chunks/{FieldGroup-DA1Jv8Xw.js → FieldGroup-CNP4TyLx.js} +2 -2
  42. package/client/chunks/{Filter-3ZEBO2Lp.js → Filter-BsrnHifv.js} +8 -8
  43. package/client/chunks/{Form-BE4b519U.js → Form-irwCjM7u.js} +2 -2
  44. package/client/chunks/{FormBlock-B_BCDQpG.js → FormBlock-CjRCJB3I.js} +3 -3
  45. package/client/chunks/{FormBlockComponent-B9xQd-gy.js → FormBlockComponent-hjB-GUS0.js} +1 -1
  46. package/client/chunks/{FormStep-R4t4MF9Q.js → FormStep-BYL8YQ4x.js} +2 -2
  47. package/client/chunks/{GaugeChart-PIhcjvst.js → GaugeChart-CaRoYGaf.js} +2 -2
  48. package/client/chunks/{GridBlock-BAxSc-RV.js → GridBlock-CflRLSwY.js} +5 -5
  49. package/client/chunks/{Heading-BbTjBJau.js → Heading-BoI_612T.js} +1 -1
  50. package/client/chunks/{HistogramChart-Cs-mWJxd.js → HistogramChart-B_e5BctQ.js} +2 -2
  51. package/client/chunks/{Icon-BvKwEOGP.js → Icon-B_t21rz1.js} +2 -2
  52. package/client/chunks/{IconV2-O5aE473M.js → IconV2-CdkhV8m-.js} +2 -2
  53. package/client/chunks/{Image-ejkyVfGY.js → Image-DOdWK-u8.js} +2 -2
  54. package/client/chunks/{InnerForm-D4Bpq9lo.js → InnerForm-COdjck6A.js} +1 -1
  55. package/client/chunks/{Item-BsX2I-7r.js → Item-U-_JnnkX.js} +1 -1
  56. package/client/chunks/{JSONField-CXOSPzce.js → JSONField-CUV254qp.js} +3 -3
  57. package/client/chunks/{Layout-BOn3e3Ka.js → Layout-Dp3aYfmU.js} +4 -4
  58. package/client/chunks/{LineChart-exNJZ38i.js → LineChart-DDdQJZZn.js} +2 -2
  59. package/client/chunks/{Link-BRkE6yZf.js → Link-28-Eb_iP.js} +1 -1
  60. package/client/chunks/{LongFormField-BcEPiWX4.js → LongFormField-DCHtQ00P.js} +4 -4
  61. package/client/chunks/{MarkdownViewer-D5t79DCS.js → MarkdownViewer-brTw7efm.js} +2 -2
  62. package/client/chunks/{Modal-Ct6pf9NJ.js → Modal-CP9be8p-.js} +1 -1
  63. package/client/chunks/{MultiFieldSelect-ByR-EmPO.js → MultiFieldSelect-BloW9ext.js} +4 -4
  64. package/client/chunks/{MultiStepFormblock-TedRgldR.js → MultiStepFormblock-DHAR0rKe.js} +2 -2
  65. package/client/chunks/{Multiselect-4d8zcV4J.js → Multiselect-CLE_BDz7.js} +1 -1
  66. package/client/chunks/{Navigation-B2px50Iw.js → Navigation-CqpkE6ma.js} +1 -1
  67. package/client/chunks/{NumberField-BZduQtLY.js → NumberField-BZEZmU98.js} +2 -2
  68. package/client/chunks/{OptionsField-CT_mxlV0.js → OptionsField-CKDTDhwP.js} +3 -3
  69. package/client/chunks/{PDF-D8aefJ4M.js → PDF-CrXxlLWi.js} +1 -1
  70. package/client/chunks/{PDFTable-CiL0tJ4-.js → PDFTable-DeruvdMe.js} +1 -1
  71. package/client/chunks/{PasswordField-DAvD70mq.js → PasswordField-CpUXt8l9.js} +2 -2
  72. package/client/chunks/{PieChart-C22Tq23O.js → PieChart-BLT1fgcq.js} +2 -2
  73. package/client/chunks/{Placeholder-CoW81fhd.js → Placeholder-2A7YZwfn.js} +1 -1
  74. package/client/chunks/{RadioGroup-CnrepG5i.js → RadioGroup-CDFQZ-uZ.js} +1 -1
  75. package/client/chunks/{RatingField-DFbAZOtE.js → RatingField-C-YvZpMR.js} +2 -2
  76. package/client/chunks/{RelationshipField-BAQ2QoCl.js → RelationshipField-i79iKWEw.js} +3 -3
  77. package/client/chunks/{Repeater-Da1LJpSK.js → Repeater-BTA04ru-.js} +3 -3
  78. package/client/chunks/{RepeaterBlock-7Q7hW09R.js → RepeaterBlock-EF8GQaOH.js} +2 -2
  79. package/client/chunks/{RowExplorer-fGHV4WHp.js → RowExplorer-DPZmp5sb.js} +1 -1
  80. package/client/chunks/{S3Upload-0Wo0l-f2.js → S3Upload-B9NLUiSu.js} +2 -2
  81. package/client/chunks/{ScreenSlot-vy7wQDd3.js → ScreenSlot-Dz5WYSpf.js} +1 -1
  82. package/client/chunks/{Section-BRjwlt5F.js → Section-lsVmHK1E.js} +2 -2
  83. package/client/chunks/{SidePanel-6b6ekrzw.js → SidePanel-DLnMfc_a.js} +1 -1
  84. package/client/chunks/{SignatureField-Dg2X6FjF.js → SignatureField-DPmt6huH.js} +2 -2
  85. package/client/chunks/{SingleRowProvider-DZAHpZKG.js → SingleRowProvider-CVLjDBRF.js} +1 -1
  86. package/client/chunks/{Slider-0_b_FNhB.js → Slider-DK_Dqu1J.js} +2 -2
  87. package/client/chunks/{SpectrumCard-BZiARzgy.js → SpectrumCard-DsY0HA-8.js} +1 -1
  88. package/client/chunks/{StackedList-ClWjhPVG.js → StackedList-DKdj7Lo7.js} +1 -1
  89. package/client/chunks/{StringField-DRO4EvNk.js → StringField-BMISwvgB.js} +2 -2
  90. package/client/chunks/{Table-D0pjAtoo.js → Table-B-0GhJVa.js} +2 -2
  91. package/client/chunks/{TableBlock-BOurH_Xu.js → TableBlock-DaDsm3G6.js} +2 -2
  92. package/client/chunks/{Tag-9aHGmXSZ.js → Tag-CeYM0FxK.js} +1 -1
  93. package/client/chunks/{Text-A5TjMODf.js → Text-DjpJtze9.js} +1 -1
  94. package/client/chunks/{Text-1eXBPEip.js → Text-SJ8FrCYx.js} +1 -1
  95. package/client/chunks/{TextArea-Yls3Qmqj.js → TextArea-CJDYyJ_p.js} +1 -1
  96. package/client/chunks/{UserAvatar-SjdjVn5H.js → UserAvatar-IHll9J4h.js} +2 -2
  97. package/client/chunks/{___vite-browser-external_commonjs-proxy-DNP6fjXO.js → ___vite-browser-external_commonjs-proxy-CPgup3aJ.js} +1 -1
  98. package/client/chunks/{apexcharts.common-DyXYiW9V.js → apexcharts.common-CWiBueiV.js} +1 -1
  99. package/client/chunks/{blocks-DBd_LXze.js → blocks-nRYD6VGF.js} +1 -1
  100. package/client/chunks/{easymde-BRDoSkCy.js → easymde-B-ioWj0G.js} +2 -2
  101. package/client/chunks/{index-CEpuplWv.js → index-DZn8pSGc.js} +1 -1
  102. package/client/chunks/{index-t7Npr3xL.js → index-ZFIGbmuW.js} +2859 -2845
  103. package/client/chunks/{table-DA8oKm0p.js → table-Hl644Fqg.js} +1 -1
  104. package/client/chunks/{users-Bl5byVbk.js → users-3AgsUWPe.js} +1 -1
  105. package/client/chunks/{utc-BK3hf4j0.js → utc-BPrnDrJd.js} +1 -1
  106. package/dist/automation.js +2 -2
  107. package/dist/automation.js.map +1 -1
  108. package/dist/index.js +3 -3
  109. package/dist/index.js.map +1 -1
  110. package/dist/query.js +2 -2
  111. package/dist/query.js.map +1 -1
  112. package/package.json +2 -2
  113. package/src/ai/tools/budibase/rows.ts +1 -1
  114. package/src/automations/utils.ts +1 -1
package/dist/query.js CHANGED
@@ -756,7 +756,7 @@ l2HXiAD1Q2rlHNW9wDaYyKb1F5f+v4RyqCAyzlkwRdksmkLeECTboojNnmRCrE3C
756
756
  d/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR
757
757
  mwIDAQAB
758
758
  -----END PUBLIC KEY-----
759
- `;function bv(e){return Zz.default.verify(e,PJt,{algorithms:["RS256"]})}o(bv,"verifyLicenseToken");function NJt(e,t){return Zz.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}o(NJt,"sign");var dL={};$(dL,{getOfflineFeatures:()=>e5});var LJt={free:[...sa.SELF_FREE_LICENSE.features],premium:["appBackups","branding","viewPermissions","pdf"],premium_plus:["appBackups","branding","syncAutomations","viewPermissions","triggerAutomationRun","viewReadonlyColumns","aiCustomConfigs","pdf","budibaseAI"],premium_plus_trial:["appBackups","branding","syncAutomations","viewPermissions","triggerAutomationRun","viewReadonlyColumns","aiCustomConfigs","pdf","budibaseAI"],pro:["userGroups","appBackups"],team:["userGroups","appBackups"],business:["userGroups","appBackups","environmentVariables","auditLogs","branding","syncAutomations","expandedPublicApi","viewPermissions","pdf","budibaseAI"],enterprise_basic:["userGroups","appBackups","environmentVariables","enforceableSSO","auditLogs","branding","syncAutomations","offline","expandedPublicApi","workspaceImportExport","viewPermissions","triggerAutomationRun","scim","viewReadonlyColumns","aiCustomConfigs","pwa","customAppScripts","pdf","budibaseAI","recaptcha","pkceOidc","translations"],enterprise_basic_trial:["userGroups","appBackups","environmentVariables","enforceableSSO","branding","syncAutomations","expandedPublicApi","workspaceImportExport","viewPermissions","triggerAutomationRun","scim","viewReadonlyColumns","aiCustomConfigs","pwa","customAppScripts","pdf","budibaseAI","recaptcha","pkceOidc","translations"],enterprise:["userGroups","appBackups","environmentVariables","enforceableSSO","auditLogs","branding","syncAutomations","offline","expandedPublicApi","workspaceImportExport","viewPermissions","triggerAutomationRun","scim","viewReadonlyColumns","aiCustomConfigs","pwa","customAppScripts","pdf","budibaseAI","recaptcha","pkceOidc","translations"]};function e5(e){function t(r){let n=r[e];if(!n)throw new Error(`Features do not exist for planType=${e}`);return n}return o(t,"readFeatures"),t(LJt)}o(e5,"getOfflineFeatures");var pL={};$(pL,{UNLIMITED:()=>X,getQuotas:()=>t5});var F=Of,eWe=sa,X=-1,ms=o(e=>e*1e6,"millions"),kJt={free:{...eWe.CLOUD_FREE_LICENSE.quotas},premium:{usage:{monthly:{...F.queries(X),...F.automations(1e3),...F.budibaseAICredits(0),...F.actions(X)},static:{...F.rows(1e4),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(0),...F.plugins(X),...F.customAIConfigurations(0)}},constant:{...F.automationLogRetentionDays(7),...F.appBackupRetentionDays(7)}},premium_plus:{usage:{monthly:{...F.queries(X),...F.automations(5e3),...F.budibaseAICredits(ms(2)),...F.actions(X)},static:{...F.rows(25e3),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(0),...F.plugins(X),...F.customAIConfigurations(1)}},constant:{...F.automationLogRetentionDays(30),...F.appBackupRetentionDays(30)}},premium_plus_trial:{usage:{monthly:{...F.queries(X),...F.automations(5e3),...F.budibaseAICredits(ms(2)),...F.actions(X)},static:{...F.rows(25e3),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(0),...F.plugins(X),...F.customAIConfigurations(1)}},constant:{...F.automationLogRetentionDays(30),...F.appBackupRetentionDays(30)}},pro:{usage:{monthly:{...F.queries(X),...F.automations(1e3),...F.budibaseAICredits(ms(2)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(5),...F.plugins(X),...F.customAIConfigurations(0)}},constant:{...F.automationLogRetentionDays(7),...F.appBackupRetentionDays(7)}},team:{usage:{monthly:{...F.queries(X),...F.automations(5e3),...F.budibaseAICredits(0),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(10),...F.plugins(X),...F.customAIConfigurations(0)}},constant:{...F.automationLogRetentionDays(30),...F.appBackupRetentionDays(90)}},business:{usage:{monthly:{...F.queries(X),...F.automations(1e4),...F.budibaseAICredits(ms(2)),...F.actions(X)},static:{...F.rows(5e4),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(50),...F.plugins(X),...F.customAIConfigurations(0)}},constant:{...F.automationLogRetentionDays(365),...F.appBackupRetentionDays(365)}},enterprise_basic:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ms(4)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(X),...F.plugins(X),...F.customAIConfigurations(X)}},constant:{...F.automationLogRetentionDays(X),...F.appBackupRetentionDays(X)}},enterprise_basic_trial:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ms(4)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(X),...F.plugins(X),...F.customAIConfigurations(X)}},constant:{...F.automationLogRetentionDays(15),...F.appBackupRetentionDays(15)}},enterprise:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ms(4)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(X),...F.plugins(X),...F.customAIConfigurations(X)}},constant:{...F.automationLogRetentionDays(X),...F.appBackupRetentionDays(X)}}},MJt={free:{...eWe.SELF_FREE_LICENSE.quotas},premium:void 0,premium_plus:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ms(2)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(0),...F.plugins(X),...F.customAIConfigurations(1)}},constant:{...F.automationLogRetentionDays(30),...F.appBackupRetentionDays(30)}},premium_plus_trial:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ms(2)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(0),...F.plugins(X),...F.customAIConfigurations(1)}},constant:{...F.automationLogRetentionDays(30),...F.appBackupRetentionDays(30)}},pro:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(0),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(5),...F.plugins(X),...F.customAIConfigurations(0)}},constant:{...F.automationLogRetentionDays(7),...F.appBackupRetentionDays(7)}},team:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(0),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(10),...F.plugins(X),...F.customAIConfigurations(0)}},constant:{...F.automationLogRetentionDays(30),...F.appBackupRetentionDays(90)}},business:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(0),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(50),...F.plugins(X),...F.customAIConfigurations(0)}},constant:{...F.automationLogRetentionDays(90),...F.appBackupRetentionDays(365)}},enterprise_basic:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ms(4)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(X),...F.plugins(X),...F.customAIConfigurations(X)}},constant:{...F.automationLogRetentionDays(X),...F.appBackupRetentionDays(X)}},enterprise_basic_trial:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ms(4)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(X),...F.plugins(X),...F.customAIConfigurations(X)}},constant:{...F.automationLogRetentionDays(15),...F.appBackupRetentionDays(15)}},enterprise:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ms(4)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(X),...F.plugins(X),...F.customAIConfigurations(X)}},constant:{...F.automationLogRetentionDays(X),...F.appBackupRetentionDays(X)}}};function t5(e,t){let r;function n(i){let s=i[t];if(!s)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return s}switch(o(n,"readQuotas"),e){case"self":r=n(MJt);break;case"cloud":r=n(kJt);break}return JSON.parse(JSON.stringify(r))}o(t5,"getQuotas");var r5={};$(r5,{encoding:()=>Qy,workspaceExists:()=>UJt});async function UJt(e){return(await U.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}o(UJt,"workspaceExists");var Qy={};$(Qy,{base64ToObject:()=>BJt,objectToBase64:()=>FJt});function FJt(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}o(FJt,"objectToBase64");function BJt(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}o(BJt,"base64ToObject");var tWe=B(require("lodash/union")),rWe=B(require("lodash/merge"));async function qJt(e){await ps.save({offlineLicenseToken:e}),await hh()}o(qJt,"activateOfflineLicenseToken");async function jJt(){await ps.save({offlineLicenseToken:void 0}),await hh()}o(jJt,"deleteOfflineLicenseToken");async function nWe(){return(await ps.get()).offlineLicenseToken}o(nWe,"getOfflineLicenseToken");async function n5(){let t=(await tf.getInstall()).installId,r=C.getTenantId(),n=await Le.identification.getUniqueTenantId(r);return{installId:t,tenantId:n}}o(n5,"getIdentifier");async function WJt(){let e=await n5();return Qy.objectToBase64(e)}o(WJt,"getIdentifierBase64");function $Jt(e){return Qy.base64ToObject(e)}o($Jt,"getIdentifierFromBase64");function iWe(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}o(iWe,"verifyExpiry");async function oWe(e){let t=await n5();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}o(oWe,"verifyInstallation");function sWe(e){let t=e.plan.type,r="self",n=e5(t),i=t5(r,t);return e.features=(0,tWe.default)(e.features,n),e.quotas=(0,rWe.default)(e.quotas,i),e}o(sWe,"enrichLicense");async function i5(){try{let e=await nWe();if(e){let t=await bv(e);return iWe(t),await oWe(t),sWe(t)}}catch(e){console.error("Error retrieving offline license",e)}}o(i5,"getOfflineLicense");var Ev={};$(Ev,{deleteDevLicense:()=>KJt,getOfflineLicense:()=>HJt,writeDevLicenseToDisk:()=>QJt});var s5=require("path"),aWe=require("os"),mh=B(require("fs"));var GJt=L.isTest()?".budibase-test":".budibase",o5=(0,s5.join)((0,aWe.tmpdir)(),GJt),VJt="dev_license.txt",wv=(0,s5.join)(o5,VJt);if(!mh.default.existsSync(o5))try{mh.default.mkdirSync(o5)}catch{}function HJt(){try{if(mh.default.existsSync(wv)){let e=mh.default.readFileSync(wv,{encoding:"utf-8"});return bv(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}o(HJt,"getOfflineLicense");function QJt(e){console.log(`Writing license to: ${wv}`),mh.default.writeFileSync(wv,e,{encoding:"utf-8"})}o(QJt,"writeDevLicenseToDisk");function KJt(){mh.default.rmSync(wv,{force:!0})}o(KJt,"deleteDevLicense");var uWe=require("dd-trace");var a5=o(async()=>await uWe.tracer.trace("getLicense",async e=>{if(L.OFFLINE_MODE)return e.addTags({offline:!0}),i5();let t=await Hy();return t||(e.addTags({offlineFallback:!0}),t=Ev.getOfflineLicense()),t}),"getLicense"),cWe=o(e=>Jz(e),"getLicenseFromKey"),u5=o(()=>L.SELF_HOSTED?sa.SELF_FREE_LICENSE:sa.CLOUD_FREE_LICENSE,"getFreeLicense");var l5={};$(l5,{activateLicenseKey:()=>zJt,deleteLicenseKey:()=>YJt,getLicenseKey:()=>mL});var c5=B(require("dd-trace"));async function zJt(e){await Xz(e),await ps.save({licenseKey:e}),await hh()}o(zJt,"activateLicenseKey");async function mL(){return await c5.default.trace("getLicenseKey",async e=>{let t=await ps.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}o(mL,"getLicenseKey");async function YJt(){return await c5.default.trace("deleteLicenseKey",async()=>{await ps.save({licenseKey:void 0}),await hh()})}o(YJt,"deleteLicenseKey");var Sv,XJt=o(async()=>{Sv=await Mn.init(Ka.utils.Databases.LICENSES)},"init"),ZJt=o(async()=>{Sv&&await Sv.finish()},"shutdown");process.on("exit",async()=>{await ZJt()});var gL=o(async()=>(Sv||await XJt(),Sv),"getClient");var d5=Wt.fromHours(1).toSeconds(),fWe=Wt.fromHours(1).toSeconds(),t7t=d5+fWe,hh=o(async()=>{await hWe(),await pWe()},"refresh"),lWe=o(async e=>{let{result:t}=await jn.doWithLock({type:"default",name:"sync_account_license",resource:e,ttl:Wt.fromSeconds(10).toMs()},async()=>{let r=await gL(),n=await r.get(e);if(n&&!dWe(n))return n;let i=await yL.default.trace("populateLicense",async()=>await a5());return i||(i=yL.default.trace("populateFreeLicense",()=>u5())),i.refreshedAt=new Date().toISOString(),await r.store(e,i,t7t),i});return t},"populateAndStoreLicense"),dWe=o(e=>{let t=e.refreshedAt?Date.parse(e.refreshedAt):0;return Date.now()-t>=d5*1e3},"shouldRefreshLicense"),f5=o(async()=>await yL.default.trace("getCachedLicense",async e=>{let t=C.getLicense();if(t)return e.addTags({foundInContext:!0,features:t.features,plan:t.plan,quotas:t.quotas}),t;let r=Ee.getTenantId(),i=await(await gL()).get(r);return e.addTags({tenantId:r,foundInCache:!!i}),i?(e.addTags({foundInCache:!0,refreshedAt:i.refreshedAt,features:i.features,plan:i.plan,quotas:i.quotas}),dWe(i)&&lWe(r).catch(()=>{}),i):(i=await fe.retry(()=>lWe(r)),e.addTags({refreshedAt:i.refreshedAt,features:i.features,plan:i.plan,quotas:i.quotas,expirySeconds:d5,staleGraceSeconds:fWe}),i)}),"_getCachedLicense");L.isJest()&&(f5=jest.fn().mockImplementation(f5));var pWe=f5,hWe=o(async()=>{let e=Ee.getTenantId();await(await gL()).delete(e)},"invalidate");async function _n(e,t){Array.isArray(e)||(e=[e]),t||(t=await aa.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}o(_n,"areFeaturesEnabled");async function p5(e,t){if(!await _n(e,t))throw new my(e)}o(p5,"checkFeature");async function mWe(e,t){if(!await _n(e,t)){let r=e.join(", ");throw new my(r)}}o(mWe,"checkFeatures");function Ri(e){return async(...t)=>(await p5("appBackups"),e(...t))}o(Ri,"checkBackups");async function h5(){return _n("appBackups")}o(h5,"isBackupsEnabled");async function m5(){return _n("branding")}o(m5,"isBrandingEnabled");async function gWe(){return _n("enforceableSSO")}o(gWe,"isEnforceableSSO");async function r7t(){return _n("syncAutomations")}o(r7t,"isSyncAutomationsEnabled");async function n7t(){return _n("triggerAutomationRun")}o(n7t,"isTriggerAutomationRunEnabled");async function bL(){return _n("auditLogs")}o(bL,"isAuditLogsEnabled");async function g5(){return _n("userGroups")}o(g5,"isUserGroupsEnabled");function i7t(){return _n("pwa")}o(i7t,"isPWAEnabled");function o7t(){return _n("recaptcha")}o(o7t,"isRecaptchaEnabled");var s7t=o(()=>_n("pkceOidc"),"isPkceOidcEnabled");async function a7t(){return _n("translations")}o(a7t,"isTranslationsEnabled");async function Ky(){return _n("expandedPublicApi")}o(Ky,"isExpandedPublicApiEnabled");async function u7t(){return _n("workspaceImportExport")}o(u7t,"isWorkspaceImportExportEnabled");async function _L(){return _n(["expandedPublicApi","workspaceImportExport"])}o(_L,"isWorkspaceImportExportPublicApiEnabled");async function c7t(e){if(L.ENABLE_SSO_MAINTENANCE_MODE||!await gWe())return!1;let r;return e?.config?r=e.config:r=await yn.getSettingsConfig(),!!r.isSSOEnforced}o(c7t,"isSSOEnforced");var yWe=o(async()=>{let e="scim",t=await _n(e),r=await yn.getSCIMConfig();if(!t||!r?.enabled)throw new my(e);return!0},"checkSCIM");async function l7t(){return _n("viewPermissions")}o(l7t,"isViewPermissionEnabled");async function f7t(){return _n("viewReadonlyColumns")}o(f7t,"isViewReadonlyColumnsEnabled");var d7t={faviconUrl:void 0,faviconUrlEtag:void 0,emailBrandingEnabled:!0,platformTitle:void 0,loginHeading:void 0,loginButton:void 0,metaDescription:void 0,metaImageUrl:void 0,metaTitle:void 0};async function p7t(e){return await m5()?{faviconUrl:e.faviconUrl,faviconUrlEtag:e.faviconUrlEtag,emailBrandingEnabled:e.emailBrandingEnabled,platformTitle:e.platformTitle,loginHeading:e.loginHeading,loginButton:e.loginButton,metaDescription:e.metaDescription,metaImageUrl:e.metaImageUrl,metaTitle:e.metaTitle}:d7t}o(p7t,"getBrandingConfig");var _5={};$(_5,{enrichAIConfig:()=>b5});var h7t="budibase_ai";async function b5(e){if(L.SELF_HOSTED)return e;for(let t of Object.values(e.config))if(t.provider==="BudibaseAI")return e;return e.config[h7t]={provider:"BudibaseAI",active:!0,isDefault:Object.keys(e.config).every(t=>!e.config[t].isDefault),defaultModel:process.env.BUDIBASE_AI_DEFAULT_MODEL||"gpt-5-mini",name:"Budibase AI"},e}o(b5,"enrichAIConfig");var It={};$(It,{addAction:()=>b7t,addApp:()=>_7t,addAutomation:()=>A7t,addGroup:()=>E5,addPlugin:()=>T5,addRow:()=>E7t,addRows:()=>T7t,addUsers:()=>EL,bustCache:()=>Uz,decrement:()=>Oc,decrementMany:()=>Tv,getCurrentUsageValues:()=>Tje,getLicensedQuota:()=>wL,getQuotaUsage:()=>dh,increment:()=>No,incrementBudibaseAICredits:()=>vL,incrementMany:()=>yh,removeApp:()=>w7t,removeGroup:()=>S5,removePlugin:()=>v5,removeRow:()=>S7t,removeRows:()=>v7t,removeUsers:()=>Yy,set:()=>vv,setAllUsage:()=>Bz,setAppUsageValue:()=>Fz,setBudibaseAICredits:()=>wWe,setUsage:()=>wje,setUsagePerApp:()=>Eje,throwIfBudibaseAICreditsExceeded:()=>AL,updatePluginCount:()=>A5,updateUsage:()=>zy,usageLimitIsExceeded:()=>w5,utils:()=>ZT});var gh=require("dd-trace");var No=o(async(e,t,r)=>await gh.tracer.trace("quotas.increment",async n=>(n.addTags({name:e,type:t}),await bWe({change:1,name:e,type:t,opts:r}))),"increment"),yh=o(e=>gh.tracer.trace("quotas.incrementMany",async()=>bWe(e)),"incrementMany"),bWe=o(async e=>await gh.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await zy(r.map(i=>({usageChange:i.change,name:i.name,type:i.type,opts:{dryRun:!0,suppressErrorLog:i.opts?.suppressErrorLog,id:i.opts?.id}})));let n=[];for(let i of r)await gh.tracer.trace("quotas.incrementMany.fn",async s=>{s.addTags({actionName:i.name,actionType:i.type,actionChange:i.change});let a=i.opts?.fn;a&&n.push(await a())});return await zy(r.map(i=>({usageChange:i.change,name:i.name,type:i.type,opts:{dryRun:!1,valueFn:i.opts?.valueFn,suppressErrorLog:i.opts?.suppressErrorLog,id:i.opts?.id}}))),n[0]}),"tryIncrement"),Oc=o((e,t,r={})=>zy({usageChange:-1,name:e,type:t,opts:r}),"decrement"),Tv=o(e=>{let t=Array.isArray(e)?e:[e];return zy(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),vv=o(async(e,t,r)=>oa.setUsage(r,e,t),"set"),m7t=o((e,t,r)=>{if(e=="static"){let n=r.usageQuota.triggers;return n?n[t]||{}:{}}else{let n=oa.utils.getCurrentMonthString(),i=r.monthly[n].triggers;return i?i[t]||{}:{}}},"getExistingTriggers"),g7t=o(async(e,t,r,n)=>{try{await jn.doWithLock({type:"try_once",name:"trigger_quota",resource:e,ttl:1e4},async()=>{let i={percentage:r,name:t.name};n&&(i.resetDate=n),await Cf.triggerQuota(i)})}catch(i){Ne.logAlert("Error triggering quota",i)}},"triggerQuota"),y7t=o(async(e,t,r,n)=>{let i=await dh(),s=e==="monthly"?i.quotaReset:void 0,a=await m7t(e,t,i),u=n.triggers,c=r/n.value*100;c>100&&(c=100);for(let[l,f]of u.entries())if(c>=f&&n.value!==Of.UNLIMITED){if(!a[f]){a[f]=new Date().toISOString();let p=u[l+1]||100;(!(c>=p)||c===f)&&await g7t(t,n,c,s)}}else a[f]=void 0;return a},"checkTriggers"),zy=o(async e=>{await gh.tracer.trace("quotas.updateUsage",async t=>{let r=Ee.getTenantId(),n=Array.isArray(e)?e:[e];t.addTags({numActions:n.length,tenantId:r});let i,s,a=[],u={},c={},l={},f={};for(let p of n)await gh.tracer.trace("quotas.updateUsage.action",async h=>{h.addTags({actionName:p.name,actionType:p.type,actionUsageChange:p.usageChange});try{i=C.getWorkspaceId()}catch{}if(Mh.includes(p.name)&&!i)throw new Error("App context required for quota update");try{s=await wL("usage",p.name,p.type),a.push(s);let{total:g,app:y,breakdown:b}=await oa.getCurrentUsageValues(p.type,p.name,p.opts?.id);g+=p.usageChange,y!=null&&(y+=p.usageChange),b!=null&&(b+=p.usageChange);let w={};if(p.opts?.dryRun||(w=await y7t(p.type,p.name,g,s),f={...f,[p.name]:w}),s.value!==Of.UNLIMITED&&g>s.value&&p.usageChange>0)throw new YD(`${p.name}`);if(g=Math.max(0,g),y&&(y=Math.max(0,y)),b&&(b=Math.max(0,b),l={...l,[p.name]:b}),!p.opts?.dryRun){let E=p.opts?.valueFn;E&&(g=await E(),y=g),u={...u,[p.name]:g},c={...c,[p.name]:y}}}catch(g){throw p.opts?.suppressErrorLog||console.error(`Error updating usage quotas for ${p.name}`,g),g}});let d=n.filter(p=>!p.opts?.dryRun).map(p=>({name:p.name,type:p.type,values:{total:u[p.name],app:c[p.name],breakdown:l[p.name],triggers:f[p.name]},opts:{...p.opts,tenantId:r}}));d.length>0&&await oa.setAllUsage(d)})},"updateUsage"),wL=o(async(e,t,r)=>{let n=await aa.getCachedLicense();if(!n){let i=Ee.getTenantId();throw new Error("License not found for tenant id "+i)}if(r&&hX(e,r,t))return n.quotas[e][r][t];if(r&&mX(e,r,t))return n.quotas[e][r][t];if(gX(e,t))return n.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),w5=o(async({name:e,type:t,usageChange:r})=>{try{return await zy({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(n){if(n.code==="usage_limit_exceeded")return!0;throw n}},"usageLimitIsExceeded");var b7t=o(async e=>No("actions","monthly",{fn:e}),"addAction");var _We=o(async()=>{let e=await U.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),_7t=o(async(e,{appId:t}={})=>No("apps","static",{fn:e,valueFn:_We,id:t}),"addApp"),w7t=o(async({appId:e}={})=>Oc("apps","static",{valueFn:_We,id:e}),"removeApp");var E7t=o(async(e,{tableId:t}={})=>No("rows","static",{fn:e,id:t}),"addRow"),S7t=o(async({tableId:e}={})=>Oc("rows","static",{id:e}),"removeRow"),T7t=o(async(e,t,{tableId:r}={})=>yh({change:e,name:"rows",type:"static",opts:{fn:t,id:r}}),"addRows"),v7t=o(async(e,{tableId:t}={})=>Tv({change:e,name:"rows",type:"static",opts:{id:t}}),"removeRows");var A7t=o(async(e,{automationId:t}={})=>No("automations","monthly",{fn:e,id:t}),"addAutomation");var E5=o(async e=>No("userGroups","static",{fn:e}),"addGroup"),S5=o(async()=>Oc("userGroups","static"),"removeGroup");var T5=o(async e=>No("plugins","static",{fn:e}),"addPlugin"),v5=o(async()=>Oc("plugins","static"),"removePlugin"),A5=o(async e=>vv("plugins","static",e),"updatePluginCount");var EL=o(async(e,t,r)=>{let n=[{change:e,name:"users",type:"static",opts:{fn:r,valueFn:tt.getUserCount}}];t>0&&n.push({change:t,name:"creators",type:"static",opts:{valueFn:tt.getCreatorCount}});let i=await yh(n);return await Hy(),i},"addUsers"),Yy=o(async(e,t)=>{let r=[{change:e,name:"users",type:"static",opts:{valueFn:tt.getUserCount}}];t>0&&r.push({change:t,name:"creators",type:"static",opts:{valueFn:tt.getCreatorCount}}),await Tv(r),await Hy()},"removeUsers");var SL=class extends V{static{o(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}},TL=class extends V{static{o(this,"AICreditsExhaustedError")}constructor(){super("You have reached your Budibase AI Credits limit for this billing cycle.",402),this.code="usage_limit_exceeded"}getPublicError(){return{quota:"budibaseAICredits"}}};var vL=o(async e=>{try{return await yh({change:e,name:"budibaseAICredits",type:"monthly"})}catch(t){throw t.code==="usage_limit_exceeded"&&await R7t().catch(()=>{}),t}},"incrementBudibaseAICredits"),R7t=o(async()=>{let e=await wL("usage","budibaseAICredits","monthly");e.value>=0&&await wWe(e.value)},"capBudibaseAICreditsAtLimit"),AL=o(async()=>{if(await w5({name:"budibaseAICredits",type:"monthly",usageChange:1}))throw new TL},"throwIfBudibaseAICreditsExceeded"),wWe=o(async e=>vv("budibaseAICredits","monthly",e),"setBudibaseAICredits");var I5={};$(I5,{db:()=>ua});var Kn={};$(Kn,{addUsers:()=>x7t,adjustGroupCreatorsQuotas:()=>L7t,cleanupApp:()=>N7t,enrichUserRolesFromGroups:()=>I7t,fetch:()=>O5,get:()=>AWe,getBulk:()=>RWe,getGroupBuilderAppIds:()=>vWe,getGroupRoleId:()=>O7t,remove:()=>C7t,removeUsers:()=>D7t,save:()=>OWe,updateGroupApps:()=>P7t});async function R5(e,t){try{let r=[];for(let u of e)if(u.roles){let c=u.roles[U.getProdWorkspaceID(t)];c&&r.push(c)}let n=await Promise.all(r.map(async u=>({[u]:await _t.roleToNumber(u)}))),i,s,a={};n.forEach(u=>{let[c,l]=Object.entries(u)[0];a[c]={roleId:c,roleNum:l}});for(let{roleId:u,roleNum:c}of Object.values(a))(s===void 0||c>s)&&(s=c,i=u);return i}catch(r){throw Ne.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}o(R5,"findHighestRole");async function TWe(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await Pr.getBulk(e,{enriched:!1}),t}o(TWe,"groupList");async function vWe(e,t){if(!e.userGroups)return[];let r=await TWe(e.userGroups,t?.groups),n=t?.appId?U.getProdWorkspaceID(t?.appId):null,i=[];for(let s of r){let a=s.builder?.apps;n&&a?.includes(n)?i.push(n):n||(i=i.concat(a||[]))}return[...new Set(i)]}o(vWe,"getGroupBuilderAppIds");async function O7t(e,t,r){if(!e.userGroups)return null;let n=await TWe(e.userGroups,r?.groups),i=U.getProdWorkspaceID(t);return e.roles?.[i]?e.roles[i]:(n=n.filter(u=>u?.roles?Object.keys(u.roles).includes(i):!1),C.getCurrentContext()?.appId===t?R5(n,t):await C.doInWorkspaceContext(t,async()=>R5(n,t)))}o(O7t,"getGroupRoleId");async function I7t(e){if(!e||!e.userGroups)return e;let t=await RWe(e.userGroups,{enriched:!1}),r=[];for(let i of t)i?.roles&&(r=r.concat(Object.keys(i.roles)));r=[...new Set(r)];for(let i of r)await C.doInWorkspaceContext(i,async()=>{if(e.roles[i])return;let s=await R5(t,i);s&&(e.roles[i]=s)});let n=await vWe(e,{groups:t});if(n.length&&!e.builder?.global){let i=e.builder?.apps||[];e.builder={...e.builder,apps:i.concat(n)}}return e}o(I7t,"enrichUserRolesFromGroups");async function O5(){return await Pr.fetch()}o(O5,"fetch");async function AWe(e){return await Pr.get(e)}o(AWe,"get");async function RWe(e,t={enriched:!0}){return Pr.getBulk(e,t)}o(RWe,"getBulk");async function EWe(e){if(await Pr.getByName(e))throw new SL(e)}o(EWe,"guardNameAvailability");async function SWe(e){let t=await Pr.getGroupUsers(e._id);if(!t.length)return 0;let n=await Ee.getGlobalDB().getMultiple(t.map(s=>s._id));return(await nf.creatorsInList(n)).filter(s=>s).length}o(SWe,"getCreatorsCountInGroup");async function OWe(e){let t=[],r=!e._id,n=0;if(!e._id)e._id=Pr.generateUserGroupID(),await EWe(e.name),t.push(Le.group.created(e));else{let u=await Pr.get(e._id);if(u.name!==e.name&&await EWe(e.name),t.push(Le.group.updated(e)),JSON.stringify(u.roles)!==JSON.stringify(e.roles)){let c=u.users?.length||0,l=0;c>0&&(l=await SWe(u)),Object.values(e.roles).includes("CREATOR")?n=c-l:n=-c,t.push(Le.group.permissionsEdited(e))}}await Promise.all(t);let{users:i,...s}=e,a=o(()=>Pr.save(s),"saveGroup");if(r)return await E5(a);{let u=await a();if(n>0)await EL(0,n);else if(n<0){let c=await SWe(e),l=Math.abs(n)-c;l>0&&await Yy(0,l)}return u}}o(OWe,"save");async function C7t(e,t){let r;try{r=await Pr.get(e)}catch{throw new Error("Group not found")}let n=Object.values(r.roles||{}).includes("CREATOR"),i=o(()=>{},"recalculateCreatorsQuotasFn");if(n){let a=Ee.getGlobalDB(),u=await Pr.getGroupUsers(e),l=(await Promise.all(u.map(h=>a.get(h._id)))).map(h=>({...h,userGroups:h.userGroups.filter(m=>m!==e)})),d=(await nf.creatorsInList(l)).filter(h=>h).length,p=u.length-d;p&&(i=o(()=>Yy(0,p),"recalculateCreatorsQuotasFn"))}let s=await Pr.destroy(e,t);return await Le.group.deleted(r),await S5(),await i(),s}o(C7t,"remove");async function x7t(e,t){let r=await Pr.get(e),n=await tt.bulkGetGlobalUsersById(t),i=[];for(let c of n)c.userGroups||(c.userGroups=[]),c.userGroups.includes(e)||i.push(c);if(!i.length)return i;let s=i.map(c=>({...c,userGroups:[...c?.userGroups||[],e]}));if(await tt.bulkUpdateGlobalUsers(s),Object.values(r.roles||{}).includes("CREATOR")){let l=(await nf.creatorsInList(i)).filter(d=>d).length,f=i.length-l;f&&await EL(0,f)}let u=[];for(let c of t)u.push(Ue.user.invalidateUser(c));return await Promise.all(u),await Le.group.usersAdded(s.length,r,t),s}o(x7t,"addUsers");async function D7t(e,t){let r=await Pr.get(e),n=await tt.bulkGetGlobalUsersById(t),i=[];for(let u of n){if(!u.userGroups||!u.userGroups.includes(e))continue;let c=u.userGroups.indexOf(e);u.userGroups.splice(c,1),i.push(u)}if(await tt.bulkUpdateGlobalUsers(i),Object.values(r.roles||{}).includes("CREATOR")){let c=(await nf.creatorsInList(i)).filter(f=>f).length,l=i.length-c;l&&await Yy(0,l)}let a=[];for(let u of t)a.push(Ue.user.invalidateUser(u));return await Promise.all(a),i.length&&await Le.group.usersDeleted(i.length,r,t),i}o(D7t,"removeUsers");async function P7t(e,t){let r=await AWe(e);if(r.roles||(r.roles={}),t.appsToAdd)for(let n of t.appsToAdd)r.roles[n.appId]=n.roleId;if(t.appsToRemove)for(let n of t.appsToRemove)delete r.roles[n.appId];return r.builder={apps:Object.entries(r.roles).filter(([n,i])=>i==="CREATOR").map(([n])=>n)},await OWe(r)}o(P7t,"updateGroupApps");async function N7t(e){let t=await O5(),r=[];for(let n of t)!n.roles||!n.roles[e]||(delete n.roles[e],r.push(n));return await Pr.bulkSave(r)}o(N7t,"cleanupApp");async function L7t(){if(!await g5()){let e=Ee.getGlobalDB(),r=(await O5()||[]).filter(n=>Object.values(n?.roles||{}).includes("CREATOR"));for(let n of r){let i=await Pr.getGroupUsers(n._id),a=(await Promise.all(i.map(f=>e.get(f._id)))).map(f=>({...f,userGroups:f.userGroups.filter(d=>d!==n._id)})),c=(await nf.creatorsInList(a)).filter(f=>f).length,l=i.length-c;await Pr.save({...n,roles:{}}),l&&await Yy(0,l)}}}o(L7t,"adjustGroupCreatorsQuotas");tt.UserDB.init(It,Kn,Xi);var ua=tt.UserDB;var Jy={};$(Jy,{logs:()=>k5});var k5={};$(k5,{logSearch:()=>$7t,oldestLogDate:()=>PWe,storeLog:()=>G7t});async function IWe(e,t){let r,n=5,i=!1,s,a=!0;for(;n>0;n--)try{a?s=await e():s=await exports.randomDelay(e),i=!0;break}catch(u){r=u}return i||Ne.logWarn(`Failed to backoff: ${t}`,r),s}o(IWe,"backOff");var{SEPARATOR:Ic,UNICODE_MAX:k7t,DocumentType:CWe,AutomationViewMode:C5,ViewName:M7t,getQueryIndex:U7t}=U,F7t=new Date(0).toISOString(),B7t=100,RL=10,x5=o(async()=>oL("automationLogRetentionDays"),"oldestLogDate");function xWe(e,t,{status:r,automationId:n}={},i={}){let s=n?`${n}${Ic}`:"",a=r?`${r}${Ic}`:"",u;return r&&n?u=`${C5.ALL}${Ic}${a}${s}`:r?u=`${C5.STATUS}${Ic}${a}`:n?u=`${C5.AUTOMATION}${Ic}${s}`:u=`${CWe.AUTOMATION_LOG}${Ic}`,{...i,descending:!0,startkey:`${u}${t}${k7t}`,endkey:`${u}${e}`}}o(xWe,"getAutomationLogParams");function q7t(e,t,r){return`${CWe.AUTOMATION_LOG}${Ic}${e}${Ic}${r}${Ic}${t}`}o(q7t,"generateAutomationLogID");async function D5(e,t,r={docs:!0}){let n=C.getProdWorkspaceDB();await n.exists()||(n=C.getDevWorkspaceDB());let i={status:r.status},s=r?.limit?r.limit:r?.paginate?RL+1:void 0,a=xWe(e,t,i,{include_docs:r.docs,limit:s});r?.page&&(a.startkey=r.page);let u=await n.allDocs(a),c=gv(u,{paginate:r?.paginate,pageSize:RL});return{...c,totalLogs:c.totalRows}}o(D5,"getAllLogs");async function P5(e,t,r={}){let n=C.getProdWorkspaceDB();await n.exists()||(n=C.getDevWorkspaceDB());let i;try{let a={automationId:r?.automationId,status:r?.status},u=xWe(e,t,a,{include_docs:!0,limit:RL+1});r?.page&&(u.startkey=r.page),i=await n.query(U7t(M7t.AUTOMATION_LOGS),u)}catch(a){if(a!=null&&(a.name==="not_found"||a.error==="not_found"))return await jje(),P5(e,t,r);throw a}let s=gv(i,{paginate:!0,pageSize:RL});return{...s,totalLogs:s.totalRows/3}}o(P5,"getLogsByView");async function DWe(e,t){let r=C.getProdWorkspaceDB(),n=e._id,i=e.name,s=new Date().toISOString(),a=q7t(s,t.status,n),u={...t,automationId:n,status:t.status,automationName:i,createdAt:s,_id:a};return await r.put(u),a}o(DWe,"writeLog");async function N5(e,{clearing:t}={clearing:!1}){let r=C.getProdWorkspaceDB();await IWe(async()=>{let n=await r.get(U.DocumentType.WORKSPACE_METADATA);for(let i of e){let s=i.split(U.SEPARATOR),a=`${s[s.length-3]}${U.SEPARATOR}${s[s.length-2]}`,u={};n.automationErrors&&(u=n.automationErrors),Array.isArray(u[a])||(u[a]=[]);let c=u[a].indexOf(i);t&&c!==-1?u[a].splice(c,1):u[a].push(i),u[a].length===0&&delete u[a],n.automationErrors=u}await r.put(n),await Ue.workspace.invalidateWorkspaceMetadata(n.appId,n)},"Failed to update app metadata with automation log error")}o(N5,"updateAppMetadataWithErrors");async function j7t(){let e=await x5();try{return await D5(F7t,e,{docs:!1,paginate:!1,limit:B7t})}catch{return{data:[],hasNextPage:!1,totalLogs:0}}}o(j7t,"getExpiredLogs");async function L5(){let e=C.getProdWorkspaceDB();try{let t=await j7t();if(!t.data||t.data.length===0)return;let r=t.data.map(i=>({_id:i.id,_rev:i.value.rev,_deleted:!0})),n=t.data.filter(i=>{let s=i.id.split(U.SEPARATOR);return s[s.length-1]==="error"}).map(i=>i.id);await e.bulkDocs(r),n.length&&await N5(n,{clearing:!0})}catch(t){Ne.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}o(L5,"clearOldHistory");var PWe=x5;async function W7t(e,t,r,n){let i,s=new Date().toISOString(),a=await PWe();return(!e||e<a)&&(e=a),r||t?i=await P5(e,s,{automationId:r,status:t,page:n}):i=await D5(e,s,{status:t,page:n,docs:!0,paginate:!0}),i}o(W7t,"getLogs");async function $7t(e){return await L5(),await W7t(e.startDate,e.status,e.automationId,e.page)}o($7t,"logSearch");async function G7t(e,t){if(!U.isProdWorkspaceID(C.getWorkspaceId()))return;let r=await DWe(e,t);t.status==="error"&&await N5([r]),await L5()}o(G7t,"storeLog");var M5={};$(M5,{checkPluginQuotas:()=>Q7t,deletePlugin:()=>H7t,storePlugin:()=>V7t});var NWe=B(require("fs")),LWe=require("path");function kWe(e,t){return NWe.default.readFileSync((0,LWe.join)(e,t),"utf8")}o(kWe,"loadJSFile");async function V7t(metadata,directory,source,origin){let db=Ee.getGlobalDB(),version=metadata.package.version,name=metadata.package.name,description=metadata.package.description,hash=metadata.schema.hash,bucketPath=ge.getPluginS3Dir(name),files=await ge.uploadDirectory(ge.ObjectStoreBuckets.PLUGINS,directory,bucketPath),jsFile=files.find(e=>e.name.endsWith(".js")),iconFile=files.find(e=>e.name.endsWith(".svg"));if(!jsFile)throw new Error("Plugin missing .js file.");if(metadata.schema.type==="datasource"){let js=kWe(directory,jsFile.name);try{eval(js)}catch(e){let t=e?.message?e.message:JSON.stringify(e);throw new Error(`JS invalid: ${t}`)}}let iconFileName=iconFile?iconFile.name:null,pluginId=U.generatePluginID(name),rev;try{rev=(await db.get(pluginId))._rev}catch(e){rev=void 0}let doc={_id:pluginId,_rev:rev,...metadata,name,version,hash,description,source};iconFileName&&(doc.iconFileName=iconFileName),source&&(doc={...doc,source}),origin&&origin.source==="github"&&(doc.origin=origin);let write=o(async()=>{let e=await db.put(doc);return await Le.plugin.imported(doc),{...doc,_rev:e.rev}},"write");return rev?await write():await T5(write)}o(V7t,"storePlugin");async function H7t(e){let t=Ee.getGlobalDB();try{let r=await t.get(e),n=ge.getPluginS3Dir(r.name);await ge.deleteFolder(ge.ObjectStoreBuckets.PLUGINS,n),await t.remove(e,r._rev),await Le.plugin.deleted(r),await v5()}catch(r){let n=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${n}`)}}o(H7t,"deletePlugin");async function Q7t(){let e=Ee.getGlobalDB();try{let r=(await e.allDocs(U.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await A5(r)}catch(t){Ne.logAlert("Unable to retrieve plugins for quota check",t)}}o(Q7t,"checkPluginQuotas");var Rv={};$(Rv,{fetch:()=>Y7t,fetchValues:()=>J7t,isEncryptionKeyAvailable:()=>z7t,isValid:()=>UWe,remove:()=>Z7t,update:()=>X7t});function z7t(){return!!L.ENCRYPTION_KEY}o(z7t,"isEncryptionKeyAvailable");async function Y7t(){let e=await ph.get();return Object.keys(e.variables)}o(Y7t,"fetch");async function J7t(e){let r=(await ph.get()).variables,n={};for(let[i,s]of Object.entries(r))switch(e){case"development":n[i]=s.development;break;case"production":default:n[i]=s.production;break}return n}o(J7t,"fetchValues");async function MWe(e){if(!(await Ji.cache.getCachedLicense()).features.includes("environmentVariables"))throw new Error("User does not have access to environment variables feature.");let r=await ph.get();r.variables=e(r.variables),await ph.update(r)}o(MWe,"changeValues");async function X7t(e,t){if(UWe(e))await MWe(n=>(n[e]=t,n));else throw new Error("Variable name has characters that are not allowed")}o(X7t,"update");async function Z7t(e){await MWe(t=>(delete t[e],t))}o(Z7t,"remove");function UWe(e){return/^[a-zA-Z0-9-_]+$/.test(e)}o(UWe,"isValid");var j5={};$(j5,{definitions:()=>l9t,download:()=>c9t,fetch:()=>u9t,write:()=>s9t});var FWe=require("memorystream"),BWe=new He.Sql("sqlite3");async function e9t(e,t,r){let n={operation:"READ",table:mv.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:"descending",type:"string"}}},i=BWe._query(n);if(Array.isArray(i))throw new Error("Cannot execute multiple queries for audit log search");return{sql:i.sql,bindings:i.bindings}}o(e9t,"getAuditLogSqlQuery");function t9t(e){return`al${ue}${e}${ue}${Je.newid()}`}o(t9t,"generateAuditLogID");async function qWe(e){e._id||(e._id=t9t(e.timestamp)),e.type||(e.type=jf);try{let r=await C.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){Ne.logAlert("Failed to write audit log",t)}}o(qWe,"save");async function U5(e,t,r){t||(t=1);let n=C.getAuditLogsDB();try{let i=9+1,s=await e9t(e,t,i),a=mv.searchTable(),u=BWe.convertJsonStringColumns(a,await n.sql(s.sql,s.bindings)),c;u.length>i&&(c=u.pop());let l={rows:u,hasNextPage:!!c};return l.hasNextPage&&(l.bookmark=t+1),l}catch(i){if(i.status===404&&!r?.isRetry)return await r9t(),await vje(),await U5(e,t,{isRetry:!0});throw i}}o(U5,"searchSQL");async function r9t(){let e=C.getAuditLogsDB(),r=(await e.allDocs(U.getDocParams("al",null,{include_docs:!0}))).rows.map(n=>n.doc).filter(n=>n&&!n.type).map(n=>({...n,type:jf}));await e.bulkDocs(r)}o(r9t,"migrate");function jWe(e){let t=C.getAuditLogsDB(),r=new FWe,n=t.dump(r,{filter:s=>{let a=s;if(!a._id?.startsWith("al"))return!1;let u=!0,c=o((l,f)=>{!l||l.length===0||(u=!!(u&&f&&l.includes(f)))},"matcher");if(c(e.userIds,a.userId),c(e.appIds,a.appId),c(e.events,a.event),(e.startDate||e.endDate)&&(u=u&&a.timestamp>=e.startDate&&a.timestamp<=e.endDate),e.fullSearch){let l=JSON.stringify(s);u=u&&l.includes(e.fullSearch)}return u}}),i=new FWe;return r.on("data",s=>{let a=JSON.parse(Buffer.from(s).toString());if(Array.isArray(a.docs)){let u="";for(let c of a.docs)u+=JSON.stringify(c)+`
759
+ `;function bv(e){return Zz.default.verify(e,PJt,{algorithms:["RS256"]})}o(bv,"verifyLicenseToken");function NJt(e,t){return Zz.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}o(NJt,"sign");var dL={};$(dL,{getOfflineFeatures:()=>e5});var LJt={free:[...sa.SELF_FREE_LICENSE.features],premium:["appBackups","branding","viewPermissions","pdf"],premium_plus:["appBackups","branding","syncAutomations","viewPermissions","triggerAutomationRun","viewReadonlyColumns","aiCustomConfigs","pdf","budibaseAI"],premium_plus_trial:["appBackups","branding","syncAutomations","viewPermissions","triggerAutomationRun","viewReadonlyColumns","aiCustomConfigs","pdf","budibaseAI"],pro:["userGroups","appBackups"],team:["userGroups","appBackups"],business:["userGroups","appBackups","environmentVariables","auditLogs","branding","syncAutomations","expandedPublicApi","viewPermissions","pdf","budibaseAI"],enterprise_basic:["userGroups","appBackups","environmentVariables","enforceableSSO","auditLogs","branding","syncAutomations","offline","expandedPublicApi","workspaceImportExport","viewPermissions","triggerAutomationRun","scim","viewReadonlyColumns","aiCustomConfigs","pwa","customAppScripts","pdf","budibaseAI","recaptcha","pkceOidc","translations"],enterprise_basic_trial:["userGroups","appBackups","environmentVariables","enforceableSSO","branding","syncAutomations","expandedPublicApi","workspaceImportExport","viewPermissions","triggerAutomationRun","scim","viewReadonlyColumns","aiCustomConfigs","pwa","customAppScripts","pdf","budibaseAI","recaptcha","pkceOidc","translations"],enterprise:["userGroups","appBackups","environmentVariables","enforceableSSO","auditLogs","branding","syncAutomations","offline","expandedPublicApi","workspaceImportExport","viewPermissions","triggerAutomationRun","scim","viewReadonlyColumns","aiCustomConfigs","pwa","customAppScripts","pdf","budibaseAI","recaptcha","pkceOidc","translations"]};function e5(e){function t(r){let n=r[e];if(!n)throw new Error(`Features do not exist for planType=${e}`);return n}return o(t,"readFeatures"),t(LJt)}o(e5,"getOfflineFeatures");var pL={};$(pL,{UNLIMITED:()=>X,getQuotas:()=>t5});var F=Of,eWe=sa,X=-1,ms=o(e=>e*1e6,"millions"),kJt={free:{...eWe.CLOUD_FREE_LICENSE.quotas},premium:{usage:{monthly:{...F.queries(X),...F.automations(1e3),...F.budibaseAICredits(0),...F.actions(X)},static:{...F.rows(1e4),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(0),...F.plugins(X),...F.customAIConfigurations(0)}},constant:{...F.automationLogRetentionDays(7),...F.appBackupRetentionDays(7)}},premium_plus:{usage:{monthly:{...F.queries(X),...F.automations(5e3),...F.budibaseAICredits(ms(2)),...F.actions(X)},static:{...F.rows(25e3),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(0),...F.plugins(X),...F.customAIConfigurations(1)}},constant:{...F.automationLogRetentionDays(30),...F.appBackupRetentionDays(30)}},premium_plus_trial:{usage:{monthly:{...F.queries(X),...F.automations(5e3),...F.budibaseAICredits(ms(2)),...F.actions(X)},static:{...F.rows(25e3),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(0),...F.plugins(X),...F.customAIConfigurations(1)}},constant:{...F.automationLogRetentionDays(30),...F.appBackupRetentionDays(30)}},pro:{usage:{monthly:{...F.queries(X),...F.automations(1e3),...F.budibaseAICredits(ms(2)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(5),...F.plugins(X),...F.customAIConfigurations(0)}},constant:{...F.automationLogRetentionDays(7),...F.appBackupRetentionDays(7)}},team:{usage:{monthly:{...F.queries(X),...F.automations(5e3),...F.budibaseAICredits(0),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(10),...F.plugins(X),...F.customAIConfigurations(0)}},constant:{...F.automationLogRetentionDays(30),...F.appBackupRetentionDays(90)}},business:{usage:{monthly:{...F.queries(X),...F.automations(1e4),...F.budibaseAICredits(ms(2)),...F.actions(X)},static:{...F.rows(5e4),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(50),...F.plugins(X),...F.customAIConfigurations(0)}},constant:{...F.automationLogRetentionDays(365),...F.appBackupRetentionDays(365)}},enterprise_basic:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ms(4)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(X),...F.plugins(X),...F.customAIConfigurations(X)}},constant:{...F.automationLogRetentionDays(X),...F.appBackupRetentionDays(X)}},enterprise_basic_trial:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ms(4)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(X),...F.plugins(X),...F.customAIConfigurations(X)}},constant:{...F.automationLogRetentionDays(15),...F.appBackupRetentionDays(15)}},enterprise:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ms(4)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(X),...F.plugins(X),...F.customAIConfigurations(X)}},constant:{...F.automationLogRetentionDays(X),...F.appBackupRetentionDays(X)}}},MJt={free:{...eWe.SELF_FREE_LICENSE.quotas},premium:void 0,premium_plus:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ms(2)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(0),...F.plugins(X),...F.customAIConfigurations(1)}},constant:{...F.automationLogRetentionDays(30),...F.appBackupRetentionDays(30)}},premium_plus_trial:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ms(2)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(0),...F.plugins(X),...F.customAIConfigurations(1)}},constant:{...F.automationLogRetentionDays(30),...F.appBackupRetentionDays(30)}},pro:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(0),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(5),...F.plugins(X),...F.customAIConfigurations(0)}},constant:{...F.automationLogRetentionDays(7),...F.appBackupRetentionDays(7)}},team:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(0),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(10),...F.plugins(X),...F.customAIConfigurations(0)}},constant:{...F.automationLogRetentionDays(30),...F.appBackupRetentionDays(90)}},business:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(0),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(50),...F.plugins(X),...F.customAIConfigurations(0)}},constant:{...F.automationLogRetentionDays(90),...F.appBackupRetentionDays(365)}},enterprise_basic:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ms(4)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(X),...F.plugins(X),...F.customAIConfigurations(X)}},constant:{...F.automationLogRetentionDays(X),...F.appBackupRetentionDays(X)}},enterprise_basic_trial:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ms(4)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(X),...F.plugins(X),...F.customAIConfigurations(X)}},constant:{...F.automationLogRetentionDays(15),...F.appBackupRetentionDays(15)}},enterprise:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ms(4)),...F.actions(X)},static:{...F.rows(X),...F.apps(X),...F.users(X),...F.creators(X),...F.userGroups(X),...F.plugins(X),...F.customAIConfigurations(X)}},constant:{...F.automationLogRetentionDays(X),...F.appBackupRetentionDays(X)}}};function t5(e,t){let r;function n(i){let s=i[t];if(!s)throw new Error(`Quotas do not exist for planType=${t} and hosting=${e}`);return s}switch(o(n,"readQuotas"),e){case"self":r=n(MJt);break;case"cloud":r=n(kJt);break}return JSON.parse(JSON.stringify(r))}o(t5,"getQuotas");var r5={};$(r5,{encoding:()=>Qy,workspaceExists:()=>UJt});async function UJt(e){return(await U.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}o(UJt,"workspaceExists");var Qy={};$(Qy,{base64ToObject:()=>BJt,objectToBase64:()=>FJt});function FJt(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}o(FJt,"objectToBase64");function BJt(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}o(BJt,"base64ToObject");var tWe=B(require("lodash/union")),rWe=B(require("lodash/merge"));async function qJt(e){await ps.save({offlineLicenseToken:e}),await hh()}o(qJt,"activateOfflineLicenseToken");async function jJt(){await ps.save({offlineLicenseToken:void 0}),await hh()}o(jJt,"deleteOfflineLicenseToken");async function nWe(){return(await ps.get()).offlineLicenseToken}o(nWe,"getOfflineLicenseToken");async function n5(){let t=(await tf.getInstall()).installId,r=C.getTenantId(),n=await Le.identification.getUniqueTenantId(r);return{installId:t,tenantId:n}}o(n5,"getIdentifier");async function WJt(){let e=await n5();return Qy.objectToBase64(e)}o(WJt,"getIdentifierBase64");function $Jt(e){return Qy.base64ToObject(e)}o($Jt,"getIdentifierFromBase64");function iWe(e){let t=Date.now(),r=new Date(e.expireAt).getTime();if(t>r)throw new Error(`Offline license has expired. expireAt=${e.expireAt}`)}o(iWe,"verifyExpiry");async function oWe(e){let t=await n5();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}o(oWe,"verifyInstallation");function sWe(e){let t=e.plan.type,r="self",n=e5(t),i=t5(r,t);return e.features=(0,tWe.default)(e.features,n),e.quotas=(0,rWe.default)(e.quotas,i),e}o(sWe,"enrichLicense");async function i5(){try{let e=await nWe();if(e){let t=await bv(e);return iWe(t),await oWe(t),sWe(t)}}catch(e){console.error("Error retrieving offline license",e)}}o(i5,"getOfflineLicense");var Ev={};$(Ev,{deleteDevLicense:()=>KJt,getOfflineLicense:()=>HJt,writeDevLicenseToDisk:()=>QJt});var s5=require("path"),aWe=require("os"),mh=B(require("fs"));var GJt=L.isTest()?".budibase-test":".budibase",o5=(0,s5.join)((0,aWe.tmpdir)(),GJt),VJt="dev_license.txt",wv=(0,s5.join)(o5,VJt);if(!mh.default.existsSync(o5))try{mh.default.mkdirSync(o5)}catch{}function HJt(){try{if(mh.default.existsSync(wv)){let e=mh.default.readFileSync(wv,{encoding:"utf-8"});return bv(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}o(HJt,"getOfflineLicense");function QJt(e){console.log(`Writing license to: ${wv}`),mh.default.writeFileSync(wv,e,{encoding:"utf-8"})}o(QJt,"writeDevLicenseToDisk");function KJt(){mh.default.rmSync(wv,{force:!0})}o(KJt,"deleteDevLicense");var uWe=require("dd-trace");var a5=o(async()=>await uWe.tracer.trace("getLicense",async e=>{if(L.OFFLINE_MODE)return e.addTags({offline:!0}),i5();let t=await Hy();return t||(e.addTags({offlineFallback:!0}),t=Ev.getOfflineLicense()),t}),"getLicense"),cWe=o(e=>Jz(e),"getLicenseFromKey"),u5=o(()=>L.SELF_HOSTED?sa.SELF_FREE_LICENSE:sa.CLOUD_FREE_LICENSE,"getFreeLicense");var l5={};$(l5,{activateLicenseKey:()=>zJt,deleteLicenseKey:()=>YJt,getLicenseKey:()=>mL});var c5=B(require("dd-trace"));async function zJt(e){await Xz(e),await ps.save({licenseKey:e}),await hh()}o(zJt,"activateLicenseKey");async function mL(){return await c5.default.trace("getLicenseKey",async e=>{let t=await ps.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}o(mL,"getLicenseKey");async function YJt(){return await c5.default.trace("deleteLicenseKey",async()=>{await ps.save({licenseKey:void 0}),await hh()})}o(YJt,"deleteLicenseKey");var Sv,XJt=o(async()=>{Sv=await Mn.init(Ka.utils.Databases.LICENSES)},"init"),ZJt=o(async()=>{Sv&&await Sv.finish()},"shutdown");process.on("exit",async()=>{await ZJt()});var gL=o(async()=>(Sv||await XJt(),Sv),"getClient");var d5=Wt.fromHours(1).toSeconds(),fWe=Wt.fromHours(1).toSeconds(),t7t=d5+fWe,hh=o(async()=>{await hWe(),await pWe()},"refresh"),lWe=o(async e=>{let{result:t}=await jn.doWithLock({type:"default",name:"sync_account_license",resource:e,ttl:Wt.fromSeconds(10).toMs()},async()=>{let r=await gL(),n=await r.get(e);if(n&&!dWe(n))return n;let i=await yL.default.trace("populateLicense",async()=>await a5());return i||(i=yL.default.trace("populateFreeLicense",()=>u5())),i.refreshedAt=new Date().toISOString(),await r.store(e,i,t7t),i});return t},"populateAndStoreLicense"),dWe=o(e=>{let t=e.refreshedAt?Date.parse(e.refreshedAt):0;return Date.now()-t>=d5*1e3},"shouldRefreshLicense"),f5=o(async()=>await yL.default.trace("getCachedLicense",async e=>{let t=C.getLicense();if(t)return e.addTags({foundInContext:!0,features:t.features,plan:t.plan,quotas:t.quotas}),t;let r=Ee.getTenantId(),i=await(await gL()).get(r);return e.addTags({tenantId:r,foundInCache:!!i}),i?(e.addTags({foundInCache:!0,refreshedAt:i.refreshedAt,features:i.features,plan:i.plan,quotas:i.quotas}),dWe(i)&&lWe(r).catch(()=>{}),i):(i=await fe.retry(()=>lWe(r)),e.addTags({refreshedAt:i.refreshedAt,features:i.features,plan:i.plan,quotas:i.quotas,expirySeconds:d5,staleGraceSeconds:fWe}),i)}),"_getCachedLicense");L.isJest()&&(f5=jest.fn().mockImplementation(f5));var pWe=f5,hWe=o(async()=>{let e=Ee.getTenantId();await(await gL()).delete(e)},"invalidate");async function _n(e,t){Array.isArray(e)||(e=[e]),t||(t=await aa.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}o(_n,"areFeaturesEnabled");async function p5(e,t){if(!await _n(e,t))throw new my(e)}o(p5,"checkFeature");async function mWe(e,t){if(!await _n(e,t)){let r=e.join(", ");throw new my(r)}}o(mWe,"checkFeatures");function Ri(e){return async(...t)=>(await p5("appBackups"),e(...t))}o(Ri,"checkBackups");async function h5(){return _n("appBackups")}o(h5,"isBackupsEnabled");async function m5(){return _n("branding")}o(m5,"isBrandingEnabled");async function gWe(){return _n("enforceableSSO")}o(gWe,"isEnforceableSSO");async function r7t(){return _n("syncAutomations")}o(r7t,"isSyncAutomationsEnabled");async function n7t(){return _n("triggerAutomationRun")}o(n7t,"isTriggerAutomationRunEnabled");async function bL(){return _n("auditLogs")}o(bL,"isAuditLogsEnabled");async function g5(){return _n("userGroups")}o(g5,"isUserGroupsEnabled");function i7t(){return _n("pwa")}o(i7t,"isPWAEnabled");function o7t(){return _n("recaptcha")}o(o7t,"isRecaptchaEnabled");var s7t=o(()=>_n("pkceOidc"),"isPkceOidcEnabled");async function a7t(){return _n("translations")}o(a7t,"isTranslationsEnabled");async function Ky(){return _n("expandedPublicApi")}o(Ky,"isExpandedPublicApiEnabled");async function u7t(){return _n("workspaceImportExport")}o(u7t,"isWorkspaceImportExportEnabled");async function _L(){return _n(["expandedPublicApi","workspaceImportExport"])}o(_L,"isWorkspaceImportExportPublicApiEnabled");async function c7t(e){if(L.ENABLE_SSO_MAINTENANCE_MODE||!await gWe())return!1;let r;return e?.config?r=e.config:r=await yn.getSettingsConfig(),!!r.isSSOEnforced}o(c7t,"isSSOEnforced");var yWe=o(async()=>{let e="scim",t=await _n(e),r=await yn.getSCIMConfig();if(!t||!r?.enabled)throw new my(e);return!0},"checkSCIM");async function l7t(){return _n("viewPermissions")}o(l7t,"isViewPermissionEnabled");async function f7t(){return _n("viewReadonlyColumns")}o(f7t,"isViewReadonlyColumnsEnabled");var d7t={faviconUrl:void 0,faviconUrlEtag:void 0,emailBrandingEnabled:!0,platformTitle:void 0,loginHeading:void 0,loginButton:void 0,metaDescription:void 0,metaImageUrl:void 0,metaTitle:void 0};async function p7t(e){return await m5()?{faviconUrl:e.faviconUrl,faviconUrlEtag:e.faviconUrlEtag,emailBrandingEnabled:e.emailBrandingEnabled,platformTitle:e.platformTitle,loginHeading:e.loginHeading,loginButton:e.loginButton,metaDescription:e.metaDescription,metaImageUrl:e.metaImageUrl,metaTitle:e.metaTitle}:d7t}o(p7t,"getBrandingConfig");var _5={};$(_5,{enrichAIConfig:()=>b5});var h7t="budibase_ai";async function b5(e){if(L.SELF_HOSTED)return e;for(let t of Object.values(e.config))if(t.provider==="BudibaseAI")return e;return e.config[h7t]={provider:"BudibaseAI",active:!0,isDefault:Object.keys(e.config).every(t=>!e.config[t].isDefault),defaultModel:process.env.BUDIBASE_AI_DEFAULT_MODEL||"gpt-5-mini",name:"Budibase AI"},e}o(b5,"enrichAIConfig");var It={};$(It,{addAction:()=>b7t,addApp:()=>_7t,addAutomation:()=>A7t,addGroup:()=>E5,addPlugin:()=>T5,addRow:()=>E7t,addRows:()=>T7t,addUsers:()=>EL,bustCache:()=>Uz,decrement:()=>Oc,decrementMany:()=>Tv,getCurrentUsageValues:()=>Tje,getLicensedQuota:()=>wL,getQuotaUsage:()=>dh,increment:()=>No,incrementBudibaseAICredits:()=>vL,incrementMany:()=>yh,removeApp:()=>w7t,removeGroup:()=>S5,removePlugin:()=>v5,removeRow:()=>S7t,removeRows:()=>v7t,removeUsers:()=>Yy,set:()=>vv,setAllUsage:()=>Bz,setAppUsageValue:()=>Fz,setBudibaseAICredits:()=>wWe,setUsage:()=>wje,setUsagePerApp:()=>Eje,throwIfBudibaseAICreditsExceeded:()=>AL,updatePluginCount:()=>A5,updateUsage:()=>zy,usageLimitIsExceeded:()=>w5,utils:()=>ZT});var gh=require("dd-trace");var No=o(async(e,t,r)=>await gh.tracer.trace("quotas.increment",async n=>(n.addTags({name:e,type:t}),await bWe({change:1,name:e,type:t,opts:r}))),"increment"),yh=o(e=>gh.tracer.trace("quotas.incrementMany",async()=>bWe(e)),"incrementMany"),bWe=o(async e=>await gh.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await zy(r.map(i=>({usageChange:i.change,name:i.name,type:i.type,opts:{dryRun:!0,suppressErrorLog:i.opts?.suppressErrorLog,id:i.opts?.id}})));let n=[];for(let i of r)await gh.tracer.trace("quotas.incrementMany.fn",async s=>{s.addTags({actionName:i.name,actionType:i.type,actionChange:i.change});let a=i.opts?.fn;a&&n.push(await a())});return await zy(r.map(i=>({usageChange:i.change,name:i.name,type:i.type,opts:{dryRun:!1,valueFn:i.opts?.valueFn,suppressErrorLog:i.opts?.suppressErrorLog,id:i.opts?.id}}))),n[0]}),"tryIncrement"),Oc=o((e,t,r={})=>zy({usageChange:-1,name:e,type:t,opts:r}),"decrement"),Tv=o(e=>{let t=Array.isArray(e)?e:[e];return zy(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),vv=o(async(e,t,r)=>oa.setUsage(r,e,t),"set"),m7t=o((e,t,r)=>{if(e=="static"){let n=r.usageQuota.triggers;return n?n[t]||{}:{}}else{let n=oa.utils.getCurrentMonthString(),i=r.monthly[n].triggers;return i?i[t]||{}:{}}},"getExistingTriggers"),g7t=o(async(e,t,r,n)=>{try{await jn.doWithLock({type:"try_once",name:"trigger_quota",resource:e,ttl:1e4},async()=>{let i={percentage:r,name:t.name};n&&(i.resetDate=n),await Cf.triggerQuota(i)})}catch(i){Ne.logAlert("Error triggering quota",i)}},"triggerQuota"),y7t=o(async(e,t,r,n)=>{let i=await dh(),s=e==="monthly"?i.quotaReset:void 0,a=await m7t(e,t,i),u=n.triggers,c=r/n.value*100;c>100&&(c=100);for(let[l,f]of u.entries())if(c>=f&&n.value!==Of.UNLIMITED){if(!a[f]){a[f]=new Date().toISOString();let p=u[l+1]||100;(!(c>=p)||c===f)&&await g7t(t,n,c,s)}}else a[f]=void 0;return a},"checkTriggers"),zy=o(async e=>{await gh.tracer.trace("quotas.updateUsage",async t=>{let r=Ee.getTenantId(),n=Array.isArray(e)?e:[e];t.addTags({numActions:n.length,tenantId:r});let i,s,a=[],u={},c={},l={},f={};for(let p of n)await gh.tracer.trace("quotas.updateUsage.action",async h=>{h.addTags({actionName:p.name,actionType:p.type,actionUsageChange:p.usageChange});try{i=C.getWorkspaceId()}catch{}if(Mh.includes(p.name)&&!i)throw new Error("App context required for quota update");try{s=await wL("usage",p.name,p.type),a.push(s);let{total:g,app:y,breakdown:b}=await oa.getCurrentUsageValues(p.type,p.name,p.opts?.id);g+=p.usageChange,y!=null&&(y+=p.usageChange),b!=null&&(b+=p.usageChange);let w={};if(p.opts?.dryRun||(w=await y7t(p.type,p.name,g,s),f={...f,[p.name]:w}),s.value!==Of.UNLIMITED&&g>s.value&&p.usageChange>0)throw new YD(`${p.name}`);if(g=Math.max(0,g),y&&(y=Math.max(0,y)),b&&(b=Math.max(0,b),l={...l,[p.name]:b}),!p.opts?.dryRun){let E=p.opts?.valueFn;E&&(g=await E(),y=g),u={...u,[p.name]:g},c={...c,[p.name]:y}}}catch(g){throw p.opts?.suppressErrorLog||console.warn(`Error updating usage quotas for ${p.name}`,g),g}});let d=n.filter(p=>!p.opts?.dryRun).map(p=>({name:p.name,type:p.type,values:{total:u[p.name],app:c[p.name],breakdown:l[p.name],triggers:f[p.name]},opts:{...p.opts,tenantId:r}}));d.length>0&&await oa.setAllUsage(d)})},"updateUsage"),wL=o(async(e,t,r)=>{let n=await aa.getCachedLicense();if(!n){let i=Ee.getTenantId();throw new Error("License not found for tenant id "+i)}if(r&&hX(e,r,t))return n.quotas[e][r][t];if(r&&mX(e,r,t))return n.quotas[e][r][t];if(gX(e,t))return n.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),w5=o(async({name:e,type:t,usageChange:r})=>{try{return await zy({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(n){if(n.code==="usage_limit_exceeded")return!0;throw n}},"usageLimitIsExceeded");var b7t=o(async e=>No("actions","monthly",{fn:e}),"addAction");var _We=o(async()=>{let e=await U.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),_7t=o(async(e,{appId:t}={})=>No("apps","static",{fn:e,valueFn:_We,id:t}),"addApp"),w7t=o(async({appId:e}={})=>Oc("apps","static",{valueFn:_We,id:e}),"removeApp");var E7t=o(async(e,{tableId:t}={})=>No("rows","static",{fn:e,id:t}),"addRow"),S7t=o(async({tableId:e}={})=>Oc("rows","static",{id:e}),"removeRow"),T7t=o(async(e,t,{tableId:r}={})=>yh({change:e,name:"rows",type:"static",opts:{fn:t,id:r}}),"addRows"),v7t=o(async(e,{tableId:t}={})=>Tv({change:e,name:"rows",type:"static",opts:{id:t}}),"removeRows");var A7t=o(async(e,{automationId:t}={})=>No("automations","monthly",{fn:e,id:t}),"addAutomation");var E5=o(async e=>No("userGroups","static",{fn:e}),"addGroup"),S5=o(async()=>Oc("userGroups","static"),"removeGroup");var T5=o(async e=>No("plugins","static",{fn:e}),"addPlugin"),v5=o(async()=>Oc("plugins","static"),"removePlugin"),A5=o(async e=>vv("plugins","static",e),"updatePluginCount");var EL=o(async(e,t,r)=>{let n=[{change:e,name:"users",type:"static",opts:{fn:r,valueFn:tt.getUserCount}}];t>0&&n.push({change:t,name:"creators",type:"static",opts:{valueFn:tt.getCreatorCount}});let i=await yh(n);return await Hy(),i},"addUsers"),Yy=o(async(e,t)=>{let r=[{change:e,name:"users",type:"static",opts:{valueFn:tt.getUserCount}}];t>0&&r.push({change:t,name:"creators",type:"static",opts:{valueFn:tt.getCreatorCount}}),await Tv(r),await Hy()},"removeUsers");var SL=class extends V{static{o(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}},TL=class extends V{static{o(this,"AICreditsExhaustedError")}constructor(){super("You have reached your Budibase AI Credits limit for this billing cycle.",402),this.code="usage_limit_exceeded"}getPublicError(){return{quota:"budibaseAICredits"}}};var vL=o(async e=>{try{return await yh({change:e,name:"budibaseAICredits",type:"monthly"})}catch(t){throw t.code==="usage_limit_exceeded"&&await R7t().catch(()=>{}),t}},"incrementBudibaseAICredits"),R7t=o(async()=>{let e=await wL("usage","budibaseAICredits","monthly");e.value>=0&&await wWe(e.value)},"capBudibaseAICreditsAtLimit"),AL=o(async()=>{if(await w5({name:"budibaseAICredits",type:"monthly",usageChange:1}))throw new TL},"throwIfBudibaseAICreditsExceeded"),wWe=o(async e=>vv("budibaseAICredits","monthly",e),"setBudibaseAICredits");var I5={};$(I5,{db:()=>ua});var Kn={};$(Kn,{addUsers:()=>x7t,adjustGroupCreatorsQuotas:()=>L7t,cleanupApp:()=>N7t,enrichUserRolesFromGroups:()=>I7t,fetch:()=>O5,get:()=>AWe,getBulk:()=>RWe,getGroupBuilderAppIds:()=>vWe,getGroupRoleId:()=>O7t,remove:()=>C7t,removeUsers:()=>D7t,save:()=>OWe,updateGroupApps:()=>P7t});async function R5(e,t){try{let r=[];for(let u of e)if(u.roles){let c=u.roles[U.getProdWorkspaceID(t)];c&&r.push(c)}let n=await Promise.all(r.map(async u=>({[u]:await _t.roleToNumber(u)}))),i,s,a={};n.forEach(u=>{let[c,l]=Object.entries(u)[0];a[c]={roleId:c,roleNum:l}});for(let{roleId:u,roleNum:c}of Object.values(a))(s===void 0||c>s)&&(s=c,i=u);return i}catch(r){throw Ne.logAlert(`Error finding higest role for ${e.length} on app ${t}`,r),r}}o(R5,"findHighestRole");async function TWe(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await Pr.getBulk(e,{enriched:!1}),t}o(TWe,"groupList");async function vWe(e,t){if(!e.userGroups)return[];let r=await TWe(e.userGroups,t?.groups),n=t?.appId?U.getProdWorkspaceID(t?.appId):null,i=[];for(let s of r){let a=s.builder?.apps;n&&a?.includes(n)?i.push(n):n||(i=i.concat(a||[]))}return[...new Set(i)]}o(vWe,"getGroupBuilderAppIds");async function O7t(e,t,r){if(!e.userGroups)return null;let n=await TWe(e.userGroups,r?.groups),i=U.getProdWorkspaceID(t);return e.roles?.[i]?e.roles[i]:(n=n.filter(u=>u?.roles?Object.keys(u.roles).includes(i):!1),C.getCurrentContext()?.appId===t?R5(n,t):await C.doInWorkspaceContext(t,async()=>R5(n,t)))}o(O7t,"getGroupRoleId");async function I7t(e){if(!e||!e.userGroups)return e;let t=await RWe(e.userGroups,{enriched:!1}),r=[];for(let i of t)i?.roles&&(r=r.concat(Object.keys(i.roles)));r=[...new Set(r)];for(let i of r)await C.doInWorkspaceContext(i,async()=>{if(e.roles[i])return;let s=await R5(t,i);s&&(e.roles[i]=s)});let n=await vWe(e,{groups:t});if(n.length&&!e.builder?.global){let i=e.builder?.apps||[];e.builder={...e.builder,apps:i.concat(n)}}return e}o(I7t,"enrichUserRolesFromGroups");async function O5(){return await Pr.fetch()}o(O5,"fetch");async function AWe(e){return await Pr.get(e)}o(AWe,"get");async function RWe(e,t={enriched:!0}){return Pr.getBulk(e,t)}o(RWe,"getBulk");async function EWe(e){if(await Pr.getByName(e))throw new SL(e)}o(EWe,"guardNameAvailability");async function SWe(e){let t=await Pr.getGroupUsers(e._id);if(!t.length)return 0;let n=await Ee.getGlobalDB().getMultiple(t.map(s=>s._id));return(await nf.creatorsInList(n)).filter(s=>s).length}o(SWe,"getCreatorsCountInGroup");async function OWe(e){let t=[],r=!e._id,n=0;if(!e._id)e._id=Pr.generateUserGroupID(),await EWe(e.name),t.push(Le.group.created(e));else{let u=await Pr.get(e._id);if(u.name!==e.name&&await EWe(e.name),t.push(Le.group.updated(e)),JSON.stringify(u.roles)!==JSON.stringify(e.roles)){let c=u.users?.length||0,l=0;c>0&&(l=await SWe(u)),Object.values(e.roles).includes("CREATOR")?n=c-l:n=-c,t.push(Le.group.permissionsEdited(e))}}await Promise.all(t);let{users:i,...s}=e,a=o(()=>Pr.save(s),"saveGroup");if(r)return await E5(a);{let u=await a();if(n>0)await EL(0,n);else if(n<0){let c=await SWe(e),l=Math.abs(n)-c;l>0&&await Yy(0,l)}return u}}o(OWe,"save");async function C7t(e,t){let r;try{r=await Pr.get(e)}catch{throw new Error("Group not found")}let n=Object.values(r.roles||{}).includes("CREATOR"),i=o(()=>{},"recalculateCreatorsQuotasFn");if(n){let a=Ee.getGlobalDB(),u=await Pr.getGroupUsers(e),l=(await Promise.all(u.map(h=>a.get(h._id)))).map(h=>({...h,userGroups:h.userGroups.filter(m=>m!==e)})),d=(await nf.creatorsInList(l)).filter(h=>h).length,p=u.length-d;p&&(i=o(()=>Yy(0,p),"recalculateCreatorsQuotasFn"))}let s=await Pr.destroy(e,t);return await Le.group.deleted(r),await S5(),await i(),s}o(C7t,"remove");async function x7t(e,t){let r=await Pr.get(e),n=await tt.bulkGetGlobalUsersById(t),i=[];for(let c of n)c.userGroups||(c.userGroups=[]),c.userGroups.includes(e)||i.push(c);if(!i.length)return i;let s=i.map(c=>({...c,userGroups:[...c?.userGroups||[],e]}));if(await tt.bulkUpdateGlobalUsers(s),Object.values(r.roles||{}).includes("CREATOR")){let l=(await nf.creatorsInList(i)).filter(d=>d).length,f=i.length-l;f&&await EL(0,f)}let u=[];for(let c of t)u.push(Ue.user.invalidateUser(c));return await Promise.all(u),await Le.group.usersAdded(s.length,r,t),s}o(x7t,"addUsers");async function D7t(e,t){let r=await Pr.get(e),n=await tt.bulkGetGlobalUsersById(t),i=[];for(let u of n){if(!u.userGroups||!u.userGroups.includes(e))continue;let c=u.userGroups.indexOf(e);u.userGroups.splice(c,1),i.push(u)}if(await tt.bulkUpdateGlobalUsers(i),Object.values(r.roles||{}).includes("CREATOR")){let c=(await nf.creatorsInList(i)).filter(f=>f).length,l=i.length-c;l&&await Yy(0,l)}let a=[];for(let u of t)a.push(Ue.user.invalidateUser(u));return await Promise.all(a),i.length&&await Le.group.usersDeleted(i.length,r,t),i}o(D7t,"removeUsers");async function P7t(e,t){let r=await AWe(e);if(r.roles||(r.roles={}),t.appsToAdd)for(let n of t.appsToAdd)r.roles[n.appId]=n.roleId;if(t.appsToRemove)for(let n of t.appsToRemove)delete r.roles[n.appId];return r.builder={apps:Object.entries(r.roles).filter(([n,i])=>i==="CREATOR").map(([n])=>n)},await OWe(r)}o(P7t,"updateGroupApps");async function N7t(e){let t=await O5(),r=[];for(let n of t)!n.roles||!n.roles[e]||(delete n.roles[e],r.push(n));return await Pr.bulkSave(r)}o(N7t,"cleanupApp");async function L7t(){if(!await g5()){let e=Ee.getGlobalDB(),r=(await O5()||[]).filter(n=>Object.values(n?.roles||{}).includes("CREATOR"));for(let n of r){let i=await Pr.getGroupUsers(n._id),a=(await Promise.all(i.map(f=>e.get(f._id)))).map(f=>({...f,userGroups:f.userGroups.filter(d=>d!==n._id)})),c=(await nf.creatorsInList(a)).filter(f=>f).length,l=i.length-c;await Pr.save({...n,roles:{}}),l&&await Yy(0,l)}}}o(L7t,"adjustGroupCreatorsQuotas");tt.UserDB.init(It,Kn,Xi);var ua=tt.UserDB;var Jy={};$(Jy,{logs:()=>k5});var k5={};$(k5,{logSearch:()=>$7t,oldestLogDate:()=>PWe,storeLog:()=>G7t});async function IWe(e,t){let r,n=5,i=!1,s,a=!0;for(;n>0;n--)try{a?s=await e():s=await exports.randomDelay(e),i=!0;break}catch(u){r=u}return i||Ne.logWarn(`Failed to backoff: ${t}`,r),s}o(IWe,"backOff");var{SEPARATOR:Ic,UNICODE_MAX:k7t,DocumentType:CWe,AutomationViewMode:C5,ViewName:M7t,getQueryIndex:U7t}=U,F7t=new Date(0).toISOString(),B7t=100,RL=10,x5=o(async()=>oL("automationLogRetentionDays"),"oldestLogDate");function xWe(e,t,{status:r,automationId:n}={},i={}){let s=n?`${n}${Ic}`:"",a=r?`${r}${Ic}`:"",u;return r&&n?u=`${C5.ALL}${Ic}${a}${s}`:r?u=`${C5.STATUS}${Ic}${a}`:n?u=`${C5.AUTOMATION}${Ic}${s}`:u=`${CWe.AUTOMATION_LOG}${Ic}`,{...i,descending:!0,startkey:`${u}${t}${k7t}`,endkey:`${u}${e}`}}o(xWe,"getAutomationLogParams");function q7t(e,t,r){return`${CWe.AUTOMATION_LOG}${Ic}${e}${Ic}${r}${Ic}${t}`}o(q7t,"generateAutomationLogID");async function D5(e,t,r={docs:!0}){let n=C.getProdWorkspaceDB();await n.exists()||(n=C.getDevWorkspaceDB());let i={status:r.status},s=r?.limit?r.limit:r?.paginate?RL+1:void 0,a=xWe(e,t,i,{include_docs:r.docs,limit:s});r?.page&&(a.startkey=r.page);let u=await n.allDocs(a),c=gv(u,{paginate:r?.paginate,pageSize:RL});return{...c,totalLogs:c.totalRows}}o(D5,"getAllLogs");async function P5(e,t,r={}){let n=C.getProdWorkspaceDB();await n.exists()||(n=C.getDevWorkspaceDB());let i;try{let a={automationId:r?.automationId,status:r?.status},u=xWe(e,t,a,{include_docs:!0,limit:RL+1});r?.page&&(u.startkey=r.page),i=await n.query(U7t(M7t.AUTOMATION_LOGS),u)}catch(a){if(a!=null&&(a.name==="not_found"||a.error==="not_found"))return await jje(),P5(e,t,r);throw a}let s=gv(i,{paginate:!0,pageSize:RL});return{...s,totalLogs:s.totalRows/3}}o(P5,"getLogsByView");async function DWe(e,t){let r=C.getProdWorkspaceDB(),n=e._id,i=e.name,s=new Date().toISOString(),a=q7t(s,t.status,n),u={...t,automationId:n,status:t.status,automationName:i,createdAt:s,_id:a};return await r.put(u),a}o(DWe,"writeLog");async function N5(e,{clearing:t}={clearing:!1}){let r=C.getProdWorkspaceDB();await IWe(async()=>{let n=await r.get(U.DocumentType.WORKSPACE_METADATA);for(let i of e){let s=i.split(U.SEPARATOR),a=`${s[s.length-3]}${U.SEPARATOR}${s[s.length-2]}`,u={};n.automationErrors&&(u=n.automationErrors),Array.isArray(u[a])||(u[a]=[]);let c=u[a].indexOf(i);t&&c!==-1?u[a].splice(c,1):u[a].push(i),u[a].length===0&&delete u[a],n.automationErrors=u}await r.put(n),await Ue.workspace.invalidateWorkspaceMetadata(n.appId,n)},"Failed to update app metadata with automation log error")}o(N5,"updateAppMetadataWithErrors");async function j7t(){let e=await x5();try{return await D5(F7t,e,{docs:!1,paginate:!1,limit:B7t})}catch{return{data:[],hasNextPage:!1,totalLogs:0}}}o(j7t,"getExpiredLogs");async function L5(){let e=C.getProdWorkspaceDB();try{let t=await j7t();if(!t.data||t.data.length===0)return;let r=t.data.map(i=>({_id:i.id,_rev:i.value.rev,_deleted:!0})),n=t.data.filter(i=>{let s=i.id.split(U.SEPARATOR);return s[s.length-1]==="error"}).map(i=>i.id);await e.bulkDocs(r),n.length&&await N5(n,{clearing:!0})}catch(t){Ne.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}o(L5,"clearOldHistory");var PWe=x5;async function W7t(e,t,r,n){let i,s=new Date().toISOString(),a=await PWe();return(!e||e<a)&&(e=a),r||t?i=await P5(e,s,{automationId:r,status:t,page:n}):i=await D5(e,s,{status:t,page:n,docs:!0,paginate:!0}),i}o(W7t,"getLogs");async function $7t(e){return await L5(),await W7t(e.startDate,e.status,e.automationId,e.page)}o($7t,"logSearch");async function G7t(e,t){if(!U.isProdWorkspaceID(C.getWorkspaceId()))return;let r=await DWe(e,t);t.status==="error"&&await N5([r]),await L5()}o(G7t,"storeLog");var M5={};$(M5,{checkPluginQuotas:()=>Q7t,deletePlugin:()=>H7t,storePlugin:()=>V7t});var NWe=B(require("fs")),LWe=require("path");function kWe(e,t){return NWe.default.readFileSync((0,LWe.join)(e,t),"utf8")}o(kWe,"loadJSFile");async function V7t(metadata,directory,source,origin){let db=Ee.getGlobalDB(),version=metadata.package.version,name=metadata.package.name,description=metadata.package.description,hash=metadata.schema.hash,bucketPath=ge.getPluginS3Dir(name),files=await ge.uploadDirectory(ge.ObjectStoreBuckets.PLUGINS,directory,bucketPath),jsFile=files.find(e=>e.name.endsWith(".js")),iconFile=files.find(e=>e.name.endsWith(".svg"));if(!jsFile)throw new Error("Plugin missing .js file.");if(metadata.schema.type==="datasource"){let js=kWe(directory,jsFile.name);try{eval(js)}catch(e){let t=e?.message?e.message:JSON.stringify(e);throw new Error(`JS invalid: ${t}`)}}let iconFileName=iconFile?iconFile.name:null,pluginId=U.generatePluginID(name),rev;try{rev=(await db.get(pluginId))._rev}catch(e){rev=void 0}let doc={_id:pluginId,_rev:rev,...metadata,name,version,hash,description,source};iconFileName&&(doc.iconFileName=iconFileName),source&&(doc={...doc,source}),origin&&origin.source==="github"&&(doc.origin=origin);let write=o(async()=>{let e=await db.put(doc);return await Le.plugin.imported(doc),{...doc,_rev:e.rev}},"write");return rev?await write():await T5(write)}o(V7t,"storePlugin");async function H7t(e){let t=Ee.getGlobalDB();try{let r=await t.get(e),n=ge.getPluginS3Dir(r.name);await ge.deleteFolder(ge.ObjectStoreBuckets.PLUGINS,n),await t.remove(e,r._rev),await Le.plugin.deleted(r),await v5()}catch(r){let n=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${n}`)}}o(H7t,"deletePlugin");async function Q7t(){let e=Ee.getGlobalDB();try{let r=(await e.allDocs(U.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await A5(r)}catch(t){Ne.logAlert("Unable to retrieve plugins for quota check",t)}}o(Q7t,"checkPluginQuotas");var Rv={};$(Rv,{fetch:()=>Y7t,fetchValues:()=>J7t,isEncryptionKeyAvailable:()=>z7t,isValid:()=>UWe,remove:()=>Z7t,update:()=>X7t});function z7t(){return!!L.ENCRYPTION_KEY}o(z7t,"isEncryptionKeyAvailable");async function Y7t(){let e=await ph.get();return Object.keys(e.variables)}o(Y7t,"fetch");async function J7t(e){let r=(await ph.get()).variables,n={};for(let[i,s]of Object.entries(r))switch(e){case"development":n[i]=s.development;break;case"production":default:n[i]=s.production;break}return n}o(J7t,"fetchValues");async function MWe(e){if(!(await Ji.cache.getCachedLicense()).features.includes("environmentVariables"))throw new Error("User does not have access to environment variables feature.");let r=await ph.get();r.variables=e(r.variables),await ph.update(r)}o(MWe,"changeValues");async function X7t(e,t){if(UWe(e))await MWe(n=>(n[e]=t,n));else throw new Error("Variable name has characters that are not allowed")}o(X7t,"update");async function Z7t(e){await MWe(t=>(delete t[e],t))}o(Z7t,"remove");function UWe(e){return/^[a-zA-Z0-9-_]+$/.test(e)}o(UWe,"isValid");var j5={};$(j5,{definitions:()=>l9t,download:()=>c9t,fetch:()=>u9t,write:()=>s9t});var FWe=require("memorystream"),BWe=new He.Sql("sqlite3");async function e9t(e,t,r){let n={operation:"READ",table:mv.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:"descending",type:"string"}}},i=BWe._query(n);if(Array.isArray(i))throw new Error("Cannot execute multiple queries for audit log search");return{sql:i.sql,bindings:i.bindings}}o(e9t,"getAuditLogSqlQuery");function t9t(e){return`al${ue}${e}${ue}${Je.newid()}`}o(t9t,"generateAuditLogID");async function qWe(e){e._id||(e._id=t9t(e.timestamp)),e.type||(e.type=jf);try{let r=await C.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){Ne.logAlert("Failed to write audit log",t)}}o(qWe,"save");async function U5(e,t,r){t||(t=1);let n=C.getAuditLogsDB();try{let i=9+1,s=await e9t(e,t,i),a=mv.searchTable(),u=BWe.convertJsonStringColumns(a,await n.sql(s.sql,s.bindings)),c;u.length>i&&(c=u.pop());let l={rows:u,hasNextPage:!!c};return l.hasNextPage&&(l.bookmark=t+1),l}catch(i){if(i.status===404&&!r?.isRetry)return await r9t(),await vje(),await U5(e,t,{isRetry:!0});throw i}}o(U5,"searchSQL");async function r9t(){let e=C.getAuditLogsDB(),r=(await e.allDocs(U.getDocParams("al",null,{include_docs:!0}))).rows.map(n=>n.doc).filter(n=>n&&!n.type).map(n=>({...n,type:jf}));await e.bulkDocs(r)}o(r9t,"migrate");function jWe(e){let t=C.getAuditLogsDB(),r=new FWe,n=t.dump(r,{filter:s=>{let a=s;if(!a._id?.startsWith("al"))return!1;let u=!0,c=o((l,f)=>{!l||l.length===0||(u=!!(u&&f&&l.includes(f)))},"matcher");if(c(e.userIds,a.userId),c(e.appIds,a.appId),c(e.events,a.event),(e.startDate||e.endDate)&&(u=u&&a.timestamp>=e.startDate&&a.timestamp<=e.endDate),e.fullSearch){let l=JSON.stringify(s);u=u&&l.includes(e.fullSearch)}return u}}),i=new FWe;return r.on("data",s=>{let a=JSON.parse(Buffer.from(s).toString());if(Array.isArray(a.docs)){let u="";for(let c of a.docs)u+=JSON.stringify(c)+`
760
760
  `;i.write(u)}}),r.on("end",()=>{i.end()}),{promise:n,stream:i}}o(jWe,"dump");var i9t=at.MIN_VALID_DATE.toISOString(),o9t=at.MAX_VALID_DATE.toISOString();function F5(e){return(e.startDate||e.endDate)&&(e.startDate=e.startDate||i9t,e.endDate=e.endDate||o9t),e}o(F5,"fillDates");async function WWe(e){Array.isArray(e.appIds)&&(e.appIds=e.appIds.map(n=>U.getProdWorkspaceID(n)));let t={};function r(n,i){i?.length&&(t.oneOf={...t.oneOf,[n]:i})}return o(r,"addStringParams"),r("userId",e.userIds),r("appId",e.appIds),r("event",e.events),e.fullSearch&&(t.fuzzyOr=!0,t.fuzzy={name:e.fullSearch,fallback:e.fullSearch}),(e.startDate||e.endDate)&&(e=F5(e),t.range={timestamp:{high:e.endDate,low:e.startDate}}),Object.keys(t).length===0&&(t.notEmpty={event:!0}),t}o(WWe,"getSearchFilters");function B5(e,t,r){let n={_id:e,status:"deleted"};switch(t){case"app":n.name=r?.appName;break;case"user":n.email=r?.email;break}return n}o(B5,"deleted");function q5(e){let t=Ai(e);for(let r of t){let n=` "${r}"`;e=e.replace(e.includes(n)?n:` ${r}`,""),e=nr(e,{})}return e}o(q5,"removeTemplateStrings");function $We(e,t){let r=Nh[e];if(!r)throw new Error("No friendly name found.");let n=nr(r,t);return n.includes('""')&&(n=q5(r)),n}o($We,"getEventFriendlyName");async function s9t(e,t,r){if(!await bL()||!Je.isAudited(e))return;let n=$We(e,t),i=new Date;r?.timestamp&&(i=new Date(r.timestamp));let s={timestamp:i.toISOString(),event:e,name:n,userId:r?.userId||TX,metadata:{...t,...r?.hostInfo}},a={};try{if(r?.appId){s.appId=U.getProdWorkspaceID(r.appId);let u=await Ue.workspace.getWorkspaceMetadata(r.appId);"name"in u&&(a.appName=u.name)}if(r?.userId){let u=await tt.getById(r?.userId);a.email=u.email}}catch(u){Ne.logAlert("Failed to retrieve fallback information for audit log",u)}return s.fallback=a,await qWe(s)}o(s9t,"write");async function a9t(e){let t=e.map(u=>u.userId),n=e.filter(u=>u.appId).map(u=>U.getDevWorkspaceID(u.appId)),i=await tt.bulkGetGlobalUsersById([...new Set(t)],{cleanup:!0}),s=await U.getWorkspacesByIDs([...new Set(n)]),a=[];for(let u of e){let c=i.find(d=>d?._id===u.userId),l=s.find(d=>U.isSameWorkspaceID(d?.appId,u.appId)),f={event:u.event,timestamp:u.timestamp,name:u.name,metadata:u.metadata,user:c||B5(u.userId,"user",u.fallback)};u.appId&&(f.app=l||B5(u.appId,"app",u.fallback)),a.push(f)}return a}o(a9t,"enrich");async function u9t(e){if(!await bL())throw new Error("Audit logs not available - license required.");let t=await WWe(e);if(typeof e.bookmark=="string")throw new Error("String based bookmark not supported.");let r=await U5(t,e.bookmark);return{hasNextPage:r.hasNextPage,bookmark:r.bookmark,data:await a9t(r.rows)}}o(u9t,"fetch");function c9t(e){return e=F5(e),jWe(e)}o(c9t,"download");function l9t(){let e=Object.entries(Nh).filter(r=>r[1]!=null),t={};for(let r of e)t[r[0]]=q5(r[1]);return t}o(l9t,"definitions");var V5={};$(V5,{applications:()=>G5,roles:()=>$5,users:()=>W5});var W5={};$(W5,{roleCheck:()=>d9t});function f9t(e,t){let r=e.request.body;return r.builder&&(r.builder=t?.builder||void 0),r.admin&&(r.admin=t?.admin||void 0),r.roles&&(r.roles=t?.roles||{}),e.request.body=r,e}o(f9t,"removeRoles");async function d9t(e,t){return await Ky()||f9t(e,t),e}o(d9t,"roleCheck");var $5={};$($5,{assign:()=>p9t,unAssign:()=>h9t});async function p9t(e,t){if(!await Ky())throw new Error("Unable to assign roles - license required.");let r=await ua.bulkGet(e);for(let n of r){if(t.role&&t.role.roleId){let i=U.getProdWorkspaceID(t.role.appId);n.roles[i]=t.role.roleId}if(t.appBuilder){let i=U.getProdWorkspaceID(t.appBuilder.appId),s=n.builder?.apps||[];n.builder={apps:s.concat([i])}}t.builder&&(n.builder={global:!0}),t.admin&&(n.admin={global:!0}),n.roles}await ua.bulkUpdate(r)}o(p9t,"assign");async function h9t(e,t){if(!await Ky())throw new Error("Unable to un-assign roles - license required.");let r=await ua.bulkGet(e);for(let n of r){if(t.role){let i=U.getProdWorkspaceID(t.role?.appId);n.roles[i]===t.role.roleId&&delete n.roles[i]}if(t.appBuilder&&n.builder?.apps){let i=U.getProdWorkspaceID(t.appBuilder.appId);n.builder.apps=n.builder.apps.filter(s=>s!==i)}t.builder&&n.builder&&delete n.builder,t.admin&&n.admin&&delete n.admin}await ua.bulkUpdate(r)}o(h9t,"unAssign");var G5={};$(G5,{buildExportFn:()=>y9t,buildImportFn:()=>g9t});var m9t=o(e=>{if(e){if(e.appExport)return e.appExport;if(e.file)return e.file}},"ensureAppExportFile");function g9t(e){return async(t,r)=>{await _L()||t.throw(403,"Endpoint unavailable, enterprise license required."),m9t(t.request.files)||t.throw(400,"Must provide app export file for import."),await C.doInWorkspaceContext(t.params.appId,async()=>{await e(t),t.body=void 0,t.status=204,await r()})}}o(g9t,"buildImportFn");function y9t(e){return async(t,r)=>{await _L()||t.throw(403,"Endpoint unavailable, enterprise license required.");let{encryptPassword:n,excludeRows:i}=t.request.body;await C.doInWorkspaceContext(t.params.appId,async()=>{t.request.body={encryptPassword:n,excludeRows:i},t.query.appId=t.params.appId,await e(t),await r()})}}o(y9t,"buildExportFn");var QWe=B(require("fs")),KWe=require("path");var GWe;function VWe(){GWe=new Xr.BudibaseQueue(Xr.JobQueue.APP_BACKUP,{maxStalledCount:3,jobOptions:{attempts:3,removeOnFail:!0,removeOnComplete:!0}})}o(VWe,"init");function bh(){return GWe}o(bh,"getBackupQueue");async function H5(e,t={}){return hs.storeAppBackupMetadata(e,t)}o(H5,"storeAppBackupMetadata");function zWe(e){let t=new Date().toISOString();switch(e){case"complete":case"failed":return{timestamp:t,finishedAt:t};case"started":return{timestamp:t,startedAt:t};case"pending":return{timestamp:t,createdAt:t}}}o(zWe,"getTimestamps");async function w9t(e,t,r,n){let i=await OL(e);return await hs.storeAppBackupMetadata({...i,...zWe(t),contents:r,status:t,type:"backup"},{filename:n,docId:e})}o(w9t,"updateBackupStatus");async function E9t(e,t,r){let n=await OL(e);return await hs.storeAppBackupMetadata({...n,...zWe(r),status:r,type:"restore",trigger:"manual"},{docId:e,docRev:t})}o(E9t,"updateRestoreStatus");async function OL(e){return hs.getAppBackupMetadata(e)}o(OL,"getAppBackup");async function S9t(e,t){return hs.updateAppBackupMetadata(e,t)}o(S9t,"updateAppBackup");async function YWe(e){let t=await hs.getAppBackupMetadata(e);return t.filename&&await ge.deleteFile(ge.ObjectStoreBuckets.BACKUPS,t.filename),hs.deleteAppBackupMetadata(e)}o(YWe,"deleteAppBackup");async function T9t(e){let t=[];for(let r of e)try{await YWe(r),t.push({backupId:r,success:!0})}catch(n){t.push({backupId:r,success:!1,error:n instanceof Error?n.message:"Unknown error"})}return t}o(T9t,"deleteAppBackups");async function v9t(e,t){return hs.fetchAppBackups(e,t)}o(v9t,"fetchAppBackups");async function JWe(e){let t=await hs.getAppBackupMetadata(e);if(!t.filename)throw new Error("Backup incomplete - cannot download.");let{stream:r}=await ge.getReadStream(ge.ObjectStoreBuckets.BACKUPS,t.filename);return{metadata:t,stream:r}}o(JWe,"getBackupDownloadStream");async function A9t(e){let{stream:t}=await JWe(e),r=(0,KWe.join)(ge.budibaseTempDir(),Je.newid()),n=QWe.default.createWriteStream(r);return new Promise((i,s)=>{t.on("error",s),n.on("error",s),t.pipe(n).on("close",()=>i(r))})}o(A9t,"downloadAppBackup");async function R9t(e,t,r={}){let n;try{n=await H5({appId:e,trigger:t,timestamp:new Date().toISOString(),status:"pending",type:"backup",...r})}catch(i){if(i.status===409)return;throw i}return await bh().add({docId:n.id,docRev:n.rev,appId:e,export:{trigger:t,...r}}),await Le.backup.appBackupTriggered(e,n.id,"backup",t,r?.name),n.id}o(R9t,"triggerAppBackup");async function O9t(e,t,r,n){let i=await OL(t),s;try{s=await H5({appId:e,timestamp:new Date().toISOString(),status:"pending",type:"restore",createdBy:n})}catch(a){if(a?.status===409)return;throw a}return await bh().add({appId:e,docId:s.id,docRev:s.rev,import:{nameForBackup:r,backupId:t,createdBy:n}}),{restoreId:s.id,metadata:i}}o(O9t,"triggerAppRestore");async function I9t(e,t,r){let n=U.getProdWorkspaceID(e);await C.doInWorkspaceContext(n,async()=>{let i=C.getProdWorkspaceDB();if(!await i.exists())return;let a=await i.tryGet("app_metadata");a&&(a.backupErrors||(a.backupErrors={}),a.backupErrors[t]||(a.backupErrors[t]=[]),a.backupErrors[t].push(r),await i.put(a),await Ue.workspace.invalidateWorkspaceMetadata(a.appId,a))})}o(I9t,"trackBackupError");var C9t={isEnabled:h5,triggerAppRestore:Ri(O9t),triggerAppBackup:Ri(R9t),getBackupDownloadStream:Ri(JWe),downloadAppBackup:Ri(A9t),fetchAppBackups:Ri(v9t),storeAppBackupMetadata:Ri(H5),updateBackupStatus:Ri(w9t),updateRestoreStatus:Ri(E9t),getAppBackup:Ri(OL),updateAppBackup:Ri(S9t),deleteAppBackup:Ri(YWe),deleteAppBackups:Ri(T9t),trackBackupError:Ri(I9t)},gs=C9t;var K5={};$(K5,{init:()=>Q5});var Xy=B(require("fs"));async function Q5(e){bh().process(async t=>{let r=t.data;try{if(r.export)return console.log("Exporting app backup:",r.appId,r.export.trigger),P9t(t,e);if(r.import)return console.log("Importing app backup:",r.appId,r.import.backupId),D9t(t,e)}catch(n){Ne.logAlert(`Failed to perform backup for app ID: ${r.appId}`,n)}})}o(Q5,"init");async function x9t(e){await U.getDB(e,{skip_setup:!0}).destroy()}o(x9t,"removeExistingApp");async function XWe(e,t,r,n){let i=U.getDevWorkspaceID(r),s=U.getProdWorkspaceID(r),a=new Date().toISOString(),u=o(async(c,l)=>{n?.doc?await gs.updateBackupStatus(n.doc.id,c,l?.contents,l?.filename):await gs.storeAppBackupMetadata({appId:s,timestamp:a,trigger:e,status:c,name:n?.name,type:"backup",contents:l?.contents,createdBy:n?.createdBy},{filename:l?.filename})},"updateMetadata");try{let c=await n.processing.exportAppFn(i,{tar:!0}),l=await n.processing.statsFn(i),f=`${s}/backup-${a}.tar.gz`,d=ge.ObjectStoreBuckets.BACKUPS,p=Xy.default.createReadStream(c);await ge.streamUpload({bucket:d,filename:f,stream:p,extra:{type:"application/gzip",metadata:{name:n?.name,trigger:e,timestamp:a,appId:s}}}),await u("complete",{filename:f,contents:l}),Xy.default.existsSync(c)&&Xy.default.rmSync(c)}catch(c){Ne.logAlert("App backup error",c),await u("failed");let l=n?.doc?.id||`backup-${a}`,f=c instanceof Error?c.message:String(c);await gs.trackBackupError(s,l,`Backup export failed: ${f}`)}}o(XWe,"runBackup");async function D9t(e,t){let r=e.data,n=r.appId,i=r.import.backupId,s=r.import.nameForBackup,a=r.import.createdBy,u=Ee.getTenantIDFromWorkspaceID(n);return Ee.doInTenant(u,async()=>{let c=U.getDevWorkspaceID(n),l=`${c}_temp_${Date.now()}`,{rev:f}=await gs.updateRestoreStatus(r.docId,r.docRev,"started");await XWe("restoring",u,n,{processing:t,createdBy:a,name:s});let d=await gs.downloadAppBackup(i),p="complete";try{await t.importAppFn(l,U.getDB(l),{file:{type:"application/gzip",path:d},key:d}),await x9t(c),await new U.Replication({source:l,target:c}).replicate()}catch(h){Ne.logAlert("App restore error",h),p="failed";let m=h instanceof Error?h.message:String(h);await gs.trackBackupError(n,i,`Backup restore failed: ${m}`)}finally{try{await U.getDB(l,{skip_setup:!0}).destroy()}catch{}}await gs.updateRestoreStatus(r.docId,f,p),Xy.default.existsSync(d)&&Xy.default.rmSync(d,{force:!0})})}o(D9t,"importProcessor");async function P9t(e,t){let r=e.data,n=r.appId,i=r.export.trigger,s=r.export.name,a=Ee.getTenantIDFromWorkspaceID(n);await Ee.doInTenant(a,async()=>{try{let{rev:u}=await gs.updateBackupStatus(r.docId,"started");return XWe(i,a,n,{processing:t,doc:{id:r.docId,rev:u},name:s})}catch(u){Ne.logAlert("App backup error",u);let c=u instanceof Error?u.message:String(u);await gs.trackBackupError(n,r.docId,`Backup export failed: ${c}`)}})}o(P9t,"exportProcessor");var N9t=o(async e=>{VWe(),await Q5(e.processing)},"init"),Zy={...gs,processing:K5,init:N9t,getBackupQueue:bh};var L9t=o(async e=>{e.backups&&await Zy.init(e.backups)},"init");var z5={};$(z5,{create:()=>U9t,find:()=>M9t,get:()=>k9t,remove:()=>B9t,update:()=>F9t});var ZWe=B(require("lodash/fp/merge"));async function k9t(e){let t=Ee.getGlobalDB(),r=new U.QueryBuilder(t.name,"user");r.setIndexBuilder(U.searchIndexes.createUserIndex),r.setLimit(e.pageSize),r.addEqual("scimInfo.isSync",!0);for(let[i,s]of Object.entries(e.filters?.equal??{}))r.addEqual(i,s);r.setSort("_id"),r.setSkip(e.skip);let n=await r.run();return{users:n.rows,total:n.totalRows}}o(k9t,"get");async function M9t(e){return await tt.getById(e)}o(M9t,"find");async function U9t(e){let t=await ua.getUserByEmail(e.email);if(t){if(t.scimInfo?.isSync)throw new V("User is already synched",409);e={...t,scimInfo:(0,ZWe.default)(t.scimInfo,e.scimInfo),password:void 0,firstName:e.firstName,lastName:e.lastName,updatedAt:e.updatedAt}}return await ua.save(e,{requirePassword:!1})}o(U9t,"create");async function F9t(e,t){return await ua.save(e,{requirePassword:!1,allowChangingEmail:t?.allowChangingEmail})}o(F9t,"update");async function B9t(e){return await ua.destroy(e)}o(B9t,"remove");var Y5={};$(Y5,{create:()=>q9t});var e$e=B(require("lodash/fp/merge"));async function q9t(e){let t=await jz(e.name),r;if(!t)r=(await Kn.save(e)).id;else{if(t.scimInfo?.isSync)throw new V("Group is already synched",409);r=t._id,t.users.length&&await Kn.removeUsers(r,t.users.map(i=>i._id)),t.scimInfo=(0,e$e.default)(t.scimInfo,e.scimInfo),await Kn.save(t)}return await Kn.get(r)}o(q9t,"create");var IL={};$(IL,{logRequest:()=>$9t,logResponse:()=>G9t});var t$e=B(require("dayjs"));var{DocWritethrough:j9t}=Ue.docWritethrough;function W9t(){return`${U.DocumentType.SCIM_LOG}${U.SEPARATOR}${(0,t$e.default)().format("YYYYMMDD")}`}o(W9t,"getLogDocId");var r$e=o(()=>{let e=C.getScimDBName();return new j9t(U.getDB(e),W9t())},"getDB");async function $9t(e){Ne.logWarn("SCIM request log",e);let t=Date.now().toString();return await r$e().patch({[`${t}_request`]:{ts:new Date().toISOString(),...e}}),t}o($9t,"logRequest");async function G9t(e,t){Ne.logWarn("SCIM response",t),await r$e().patch({[`${e}_response`]:{ts:new Date().toISOString(),...t}})}o(G9t,"logResponse");var H9t=require("dd-trace");var oXt=B(f$e());var{unreachable:Rsn}=We;var Mt={};$(Mt,{LLM:()=>uu,LLMRequest:()=>wn,TableGeneration:()=>gY,agentHistoryTitleSystemPrompt:()=>OXt,agentSystemPrompt:()=>RXt,aiColumnSchemas:()=>hY,aiTableResponseToTableSchema:()=>lY,appendAIColumns:()=>fY,classifyText:()=>yXt,cleanData:()=>bXt,composeAutomationAgentSystemPrompt:()=>vXt,composeAutomationAgentToolGuidelines:()=>AXt,extractFileData:()=>mXt,generateAIColumns:()=>uY,generateCronExpression:()=>_Xt,generateData:()=>cY,generateJs:()=>TXt,generateTables:()=>aY,generationStructure:()=>pY,getLLM:()=>sY,getLLMConfig:()=>oY,getLLMOrThrow:()=>m$e,normalizeContentType:()=>eY,parseResponseFormat:()=>rY,sanitiseToolName:()=>cXt,searchWeb:()=>SXt,sentimentAnalysis:()=>EXt,summarizeText:()=>tY,tableDataStructuredOutput:()=>mY,translate:()=>wXt});function cXt(e){if(e.length>64)throw new Error("Tool name must be under 64 characters long");return e.replace(/[^a-zA-Z0-9_-]/g,"_")}o(cXt,"sanitiseToolName");function eY(e){return e?e.includes("/")?e:{pdf:"application/pdf",jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png"}[e.toLowerCase()]||"application/octet-stream":"application/octet-stream"}o(eY,"normalizeContentType");var xv=require("dd-trace"),p$e=require("zod");var LL=B(require("openai"));var Iv=B(require("dd-trace"));var uu=class{static{o(this,"LLM")}constructor({model:t,apiKey:r,maxTokens:n}){this._model=t,this._apiKey=r,this._maxTokens=n??parseInt(process.env.BUDIBASE_AI_MAX_PROMPT_TOKENS||"1000")}get model(){return this._model}get apiKey(){return this._apiKey}get maxTokens(){return this._maxTokens}async prompt(t){return await Iv.default.trace("prompt",async()=>{let r=typeof t=="string"?new wn().addUserMessage(t):t,{messages:n,tokensUsed:i}=await Iv.default.trace("chatCompletion",()=>this.chatCompletion(r));return!n||n.length===0?{message:"",tokensUsed:i}:{message:n[n.length-1].content||"",tokensUsed:i}})}async chat(t){return await Iv.default.trace("chat",async()=>await this.chatCompletion(t))}async summarizeText(t){return Iv.default.trace("summarizeText",()=>this.prompt(tY(t)))}};var Cv=(n=>(n.GPT_5_MINI="gpt-5-mini",n.GPT_5="gpt-5",n.GPT_5_NANO="gpt-5-nano",n))(Cv||{});function rY(e){if(e)return e==="text"?{type:"text"}:e==="json"?{type:"json_object"}:e}o(rY,"parseResponseFormat");function lXt(e){if(!e)return 0;let t=e.prompt_tokens;return e.completion_tokens*3+t}o(lXt,"calculateBudibaseAICredits");var ca=class extends uu{constructor(r){super(r);this.supportsFiles=!0;this.client=this.getClient(r)}static{o(this,"OpenAI")}getVerbosityForModel(){if(Object.values(Cv).includes(this.model))return"low"}getClient(r){if(!r.apiKey)throw new Error("No OpenAI API key found");return new LL.default({apiKey:r.apiKey})}async uploadFile(r,n,i){let s=eY(i);if(CA.includes(s.toLowerCase())){let c;if(Buffer.isBuffer(r))c=r;else{let f=[];for await(let d of r)f.push(new Uint8Array(d));c=Buffer.concat(f)}let l=c.toString("base64");return`data:${s};base64,${l}`}let a=await(0,LL.toFile)(r,n);return(await this.client.files.create({file:a,purpose:"assistants"})).id}async chatCompletion(r){let n={model:this.model,messages:r.messages,max_completion_tokens:this._maxTokens,response_format:rY(r.format)};if(Object.values(Cv).includes(this.model)){let a=this.getVerbosityForModel();a&&(n.verbosity=a),n.reasoning_effort="minimal"}let i=await this.client.chat.completions.create(n),s=i?.choices?.[0]?.message;if(s?.content)return{messages:[...r.messages,{role:s.role,content:s.content}],tokensUsed:lXt(i.usage)};throw new Error("No response found")}};var nY=B(require("@anthropic-ai/sdk"));function fXt(e){if(!e)return 0;let t=e.input_tokens;return e.output_tokens*3+t}o(fXt,"calculateBudibaseAICredits");var kL=class extends uu{constructor(r){super(r);this.supportsFiles=!1;this.client=new nY.default({apiKey:r.apiKey})}static{o(this,"Anthropic")}firstTextBlock(r){for(let n of r.content)if(n.type==="text")return n.text}async uploadFile(r,n,i){throw new Error("File upload not supported for this LLM provider")}async chatCompletion(r){try{let n=await this.client.messages.create({model:this.model,messages:r.messages.map(({content:s})=>{if(s==null)return{role:"user",content:""};if(typeof s=="string")return{role:"user",content:s};let a="";for(let u of s)u.type==="text"?a+=u.text:["image_url","input_audio","file"].includes(u.type);return{role:"user",content:a}}),max_tokens:this.maxTokens}),i=this.firstTextBlock(n)||"";return{messages:[...r.messages,{role:"assistant",content:i}],tokensUsed:fXt(n.usage)}}catch(n){throw n instanceof nY.default.APIError&&console.error(`Anthropic Prompt failed with error ${n.name} and status: ${n.status}`),n}}};var d$e=require("openai");var ML=class extends ca{constructor(){super(...arguments);this.supportsFiles=!1}static{o(this,"AzureOpenAI")}getClient(r){if(!r.apiKey)throw new Error("No Azure OpenAI API key found");if(!r.model)throw new Error("No Azure OpenAI model specified");return new d$e.AzureOpenAI({apiKey:r.apiKey,apiVersion:"2024-10-01-preview",baseURL:r.baseUrl})}getVerbosityForModel(){return Object.values(Cv).includes(this.model)?"medium":void 0}};var iY=require("dd-trace");var UL=class extends uu{constructor(){super(...arguments);this.supportsFiles=!0}static{o(this,"BudibaseAI")}async prompt(r){await AL();let n=await super.prompt(r);return n.tokensUsed&&await vL(n.tokensUsed),n}async chat(r){await AL();let n=await super.chat(r);return n.tokensUsed&&await vL(n.tokensUsed),n}async uploadFile(r,n,i){return L.SELF_HOSTED?this.uploadFileSelfHost(r,n,i):this.uploadFileCloud(r,n,i)}async uploadFileCloud(r,n,i){return new ca({apiKey:L.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).uploadFile(r,n,i)}async uploadFileSelfHost(r,n,i){let s;if(Buffer.isBuffer(r))s=r;else{let d=[];for await(let p of r)d.push(new Uint8Array(p));s=Buffer.concat(d)}let a=s.toString("base64");if(i&&CA.includes(i.toLowerCase()))return`data:image/jpeg;base64,${a}`;if(!L.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(!this._apiKey){let d=await mL();if(!d)throw new Error("No license key found");this._apiKey=d}let u=`${L.BUDICLOUD_URL}/api/ai/upload-file`,c={method:"POST",headers:{"Content-Type":"application/json",[at.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify({data:a,filename:n,contentType:i})};console.debug("[BudibaseAI] uploadFileSelfHost - Making network call",{url:u,method:c.method,headers:c.headers,bodyKeys:["data","filename","contentType"],filename:n,contentType:i});let l=await XN(u,c);if(console.debug("[BudibaseAI] uploadFileSelfHost - Network response",{url:u,status:l.status,statusText:l.statusText,ok:l.ok}),!l.ok)throw await V.fromResponse(l);return(await l.json()).file}async chatCompletion(r){return L.SELF_HOSTED?this.chatCompletionSelfHost(r):this.chatCompletionCloud(r)}async chatCompletionCloud(r){return await iY.tracer.trace("chatCompletionCloud",async()=>await new ca({apiKey:L.OPENAI_API_KEY,model:this.model,max_completion_tokens:this.maxTokens}).chatCompletion(r))}async chatCompletionSelfHost(r){return await iY.tracer.trace("chatCompletionSelfHost",async n=>{if(!L.BUDICLOUD_URL)throw new Error("No Budibase URL found");if(n.addTags({budicloudUrl:L.BUDICLOUD_URL}),!this._apiKey){let l=await mL();if(!l)throw new Error("No license key found");this._apiKey=l}let i={messages:r.messages,format:r.format},s=`${L.BUDICLOUD_URL}/api/ai/chat`,a={method:"POST",headers:{"Content-Type":"application/json",[at.Header.LICENSE_KEY]:this._apiKey},body:JSON.stringify(i)};console.debug("[BudibaseAI] chatCompletionSelfHost - Making network call",{url:s,method:a.method,headers:a.headers,bodyKeys:Object.keys(i),messagesCount:r.messages.length,format:i.format});let u=await XN(s,a);if(console.debug("[BudibaseAI] chatCompletionSelfHost - Network response",{url:s,status:u.status,statusText:u.statusText,ok:u.ok}),!u.ok)throw await V.fromResponse(u);let c=await u.json();return console.debug("[BudibaseAI] chatCompletionSelfHost - Response data",{url:s,tokensUsed:c.tokensUsed,messagesCount:c.messages?.length}),c})}};var h$e={OpenAI:"gpt-5-mini",TogetherAI:"gpt-5-mini",AzureOpenAI:"gpt-4.1",Custom:"gpt-5-mini",Anthropic:"claude-3-5-sonnet-20240620",BudibaseAI:"gpt-5-mini"},dXt={OpenAI:ca,TogetherAI:ca,AzureOpenAI:ML,Custom:ca,Anthropic:kL,BudibaseAI:UL};async function pXt(){return await xv.tracer.trace("getAIConfig",async e=>{let t={type:"ai",config:{}};if(!C.isSelfHostUsingCloud()){let n=await yn.getAIConfig();n&&(t=n)}await b5(t);let r=Object.values(t.config).find(n=>n.active&&n.isDefault);if(!r){e.addTags({enabled:!1,reason:"no provider found"});return}return e.addTags({enabled:!0}),{provider:r.provider,model:r.defaultModel||h$e[r.provider],apiKey:r.apiKey,baseUrl:r.baseUrl}})}o(pXt,"getAIConfig");async function hXt(){return xv.tracer.trace("getSelfHostOpenAIKeyConfig",e=>{if(!L.SELF_HOSTED){e.addTags({enabled:!1,reason:"not self host"});return}if(!L.OPENAI_API_KEY){e.addTags({enabled:!1,reason:"no OPENAI_API_KEY"});return}return e.addTags({enabled:!0}),{provider:"OpenAI",model:h$e.OpenAI,apiKey:L.OPENAI_API_KEY}})}o(hXt,"getSelfHostOpenAIKeyConfig");async function oY(){return xv.tracer.trace("getLLMConfig",async()=>await pXt()||await hXt())}o(oY,"getLLMConfig");async function sY(e){return await xv.tracer.trace("getLLM",async t=>{let{model:r,maxTokens:n}=e||{},i=await oY();if(!i){t.addTags({enabled:!1,reason:"no config found"});return}r&&(i.model=r),n&&(i.maxTokens=n);let s=dXt[i.provider];if(!s){t.addTags({enabled:!1,reason:"no provider found",provider:i.provider});return}return new s(i)})}o(sY,"getLLM");async function m$e(){let e=await sY();if(!e)throw new V("No available LLM configurations",500);return e}o(m$e,"getLLMOrThrow");var wn=class e{constructor(){this.messages=[]}static{o(this,"LLMRequest")}withFormat(t){return t instanceof p$e.z.ZodType?this.format={type:"json_schema",json_schema:{name:"response",strict:!1,schema:t.toJSONSchema({target:"draft-7"})}}:this.format=t,this}addMessage(t){return this.messages.push(t),this}addMessages(t){return this.messages.push(...t),this}addUserMessage(t){return this.messages.push({role:"user",content:t}),this}addSystemMessage(t){return this.messages.push({role:"system",content:t}),this}static fromRequest(t){let r=new e;return t.messages&&r.addMessages(t.messages),t.format&&r.withFormat(t.format),r}};var Cc=require("zod");function tY(e,t){let r=`Summarize this text:
761
761
  ${e}`,n="";if(t)switch(t){case"short":n="In 1-2 concise sentences, ";break;case"medium":n="In 2-3 paragraphs, ";break;case"long":n="In multiple detailed paragraphs, ";break}return new wn().addUserMessage(`${n}${r}.
762
762
  Only return the summary.`)}o(tY,"summarizeText");function mXt(e,t,r){if(typeof t!="string"||!t.trim())throw new Error("Invalid file reference returned from uploadFile");let n=["You are a data extraction assistant.","Extract data from the attached document/image that matches the provided schema.","The schema defines the structure where values like 'string', 'number', 'boolean' indicate the expected data types.","Extract all items that match the schema from the document.","Return the data in json format. This array should never have more than 1 element.","If no matching data is found, return an empty data array."].join(`
@@ -994,7 +994,7 @@ Example: return $("Score") + $("Weight")
994
994
 
995
995
  Instructions: ${e.instructions}
996
996
 
997
- Generate the content based on these instructions. Format appropriately for a ${e.contentType}.`),i=(await mu(r.messages))?.trim();return i?{response:i,success:!0}:{success:!1,response:"Generate Text AI Step Failed: AI did not return any content."}}catch(t){return{success:!1,response:Ye(t)}}}o(j3e,"run");function Eir(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 We.unreachable(e)}}o(Eir,"getContentTypePrompt");var W3e=B(require("node-fetch"));var vb=5,Tir=100;function vir(e){return new Promise(t=>setTimeout(t,e))}o(vir,"sleep");async function Air(e,t,r){let n=await(0,W3e.default)(e);if(!n.ok)throw new Error(`Failed to fetch file from URL: ${n.statusText}`);let i=n.body,s=n.headers.get("content-type")||t,a=`document.${t}`;return await r.uploadFile(i,a,s)}o(Air,"processUrlFile");async function Rir(e,t){let r=ge.ObjectStoreBuckets.APPS,{stream:n}=await ge.getReadStream(r,e.key),i=e.name||"document";return await t.uploadFile(n,i,e.extension)}o(Rir,"processAttachmentFile");async function Oir(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.")}}o(Oir,"parseAIResponse");async function $3e({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 Mt.getLLMOrThrow(),r;if(e.source==="URL"&&typeof e.file=="string")r=await Air(e.file,e.fileType,t);else if(e.source==="Attachment"&&typeof e.file!="string")r=await Rir(e.file,t);else throw new Error("Invalid file input \u2013 source and file type do not match");let n=Mt.extractFileData(e.schema,r,t.supportsFiles),i=[],s;for(let a=1;a<=vb;a++){try{let u=await t.prompt(n);if(i=await Oir(u),!(Array.isArray(i)&&i.length===0)||a===vb)break;console.warn(`[Extract AI] Empty extraction result on attempt ${a}/${vb}, retrying...`)}catch(u){if(s=u,a===vb)throw console.error(`[Extract AI] Final extraction attempt ${a}/${vb} failed:`,u),u;console.warn(`[Extract AI] Extraction attempt ${a}/${vb} failed, retrying...`,u)}await vir(Tir)}if(s&&Array.isArray(i)&&i.length===0)throw s;return{data:i,success:!0}}catch(t){return console.error("Document extraction error:",t),{success:!1,data:{},response:Ye(t)}}}o($3e,"run");var to=require("ai"),G3e=require("uuid");var Mc=B(require("dd-trace"));async function V3e({inputs:e,appId:t}){let{agentId:r,prompt:n,useStructuredOutput:i,outputSchema:s}=e;if(!r)return{success:!1,response:"Agent step failed: No agent selected"};if(!n)return{success:!1,response:"Agent step failed: No prompt provided"};let a=(0,G3e.v4)();return Mc.default.llmobs.trace({kind:"agent",name:"automation.agent",sessionId:a},async u=>{try{let c=await x.ai.agents.getOrThrow(r);if(Mc.default.llmobs.annotate(u,{inputData:n,metadata:{agentId:r,agentName:c.name,appId:t,isForkedProcess:ne.isInThread(),forkedProcessName:process.env.FORKED_PROCESS_NAME||"main"}}),t&&_f(t)&&c.live!==!0)return Mc.default.llmobs.annotate(u,{outputData:"Agent is paused",tags:{error:"agent_paused"}}),{success:!1,response:"Agent is paused. Set it live to use it in published automations."};let{systemPrompt:l,tools:f}=await x.ai.agents.buildPromptAndTools(c);Mc.default.llmobs.annotate(u,{metadata:{toolCount:Object.keys(f).length}});let{chat:d,providerOptions:p}=await x.ai.llm.createLLM(c.aiconfig,a,u),h;if(i&&s&&Object.keys(s).length>0){let P=fe.structuredOutput.normalizeSchemaForStructuredOutput(s);h=to.Output.object({schema:(0,to.jsonSchema)(P)})}let m=new Set,g=Object.keys(f).length>0,b=await new to.ToolLoopAgent({model:(0,to.wrapLanguageModel)({model:d,middleware:(0,to.extractReasoningMiddleware)({tagName:"think"})}),instructions:l||void 0,tools:g?f:void 0,toolChoice:g?"auto":"none",stopWhen:(0,to.stepCountIs)(30),providerOptions:p?.(g),output:h,onStepFinish({content:P,toolCalls:D,toolResults:q}){M7(m,D,q);for(let N of P)N.type==="tool-error"&&m.delete(N.toolCallId)}}).stream({prompt:n}),w,E;for await(let P of(0,to.readUIMessageStream)({stream:b.toUIMessageStream({sendReasoning:!0,onError:D=>{let q=t3(D);return E=q,q}})}))w=P;let S=w?k7([w]):[];if(m.size>0||S.length>0){let P=U7(S);return Mc.default.llmobs.annotate(u,{outputData:P,tags:{error:"1","error.type":"IncompleteToolCall"}}),{success:!1,response:P,message:w}}let T,R;try{T=await b.text}catch(P){R=t3(P)}let A=E||R;if(A&&!T)return Mc.default.llmobs.annotate(u,{outputData:A,tags:{error:"1","error.type":"StreamingError"}}),{success:!1,response:A,message:w};let O=await b.usage,I=h?await b.output:void 0;return Mc.default.llmobs.annotate(u,{outputData:T,metadata:{stepCount:w?.parts?.length??0}}),{success:!0,response:T,usage:O,message:w,output:I}}catch(c){let l=Ye(c);return Mc.default.llmobs.annotate(u,{outputData:l,tags:{error:"1","error.type":c?.name||"UnknownError"}}),console.error("Agent step failed",{agentId:r,appId:t,liteLLMUrl:ne.LITELLM_URL,errorName:c?.name,errorMessage:l}),{success:!1,response:l}}})}o(V3e,"run");async function H3e({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:nr(e.value,t,{noThrow:!1})}}catch(n){return{success:!1,response:Ye(n)}}}o(H3e,"run");var B7={SEND_EMAIL_SMTP:cHe,CREATE_ROW:yHe,GET_ROW:C3e,UPDATE_ROW:bHe,DELETE_ROW:_He,QUERY_ROWS:I3e,OUTGOING_WEBHOOK:e3e,EXECUTE_SCRIPT:AHe,EXECUTE_SCRIPT_V2:RHe,EXECUTE_QUERY:JHe,API_REQUEST:XHe,SERVER_LOG:t3e,DELAY:p3e,FILTER:d3e,COLLECT:x3e,TRIGGER_AUTOMATION_RUN:D3e,OPENAI:N3e,CLASSIFY_CONTENT:U3e,PROMPT_LLM:F3e,TRANSLATE:B3e,SUMMARISE:q3e,GENERATE_TEXT:j3e,EXTRACT_FILE_DATA:$3e,AGENT:V3e,EXTRACT_STATE:H3e,discord:n3e,slack:o3e,zapier:a3e,integromat:f3e,n8n:c3e},F7={SEND_EMAIL_SMTP:Ge.steps.sendSmtpEmail.definition,CREATE_ROW:Ge.steps.createRow.definition,GET_ROW:Ge.steps.getRow.definition,UPDATE_ROW:Ge.steps.updateRow.definition,DELETE_ROW:Ge.steps.deleteRow.definition,QUERY_ROWS:Ge.steps.queryRows.definition,OUTGOING_WEBHOOK:Ge.steps.outgoingWebhook.definition,EXECUTE_SCRIPT:Ge.steps.executeScript.definition,EXECUTE_SCRIPT_V2:Ge.steps.executeScriptV2.definition,EXECUTE_QUERY:Ge.steps.executeQuery.definition,API_REQUEST:Ge.steps.apiRequest.definition,SERVER_LOG:Ge.steps.serverLog.definition,DELAY:Ge.steps.delay.definition,FILTER:Ge.steps.filter.definition,LOOP:Ge.steps.loop.definition,COLLECT:Ge.steps.collect.definition,TRIGGER_AUTOMATION_RUN:Ge.steps.triggerAutomationRun.definition,BRANCH:Ge.steps.branch.definition,CLASSIFY_CONTENT:Ge.steps.classifyText.definition,PROMPT_LLM:Ge.steps.promptLLM.definition,TRANSLATE:Ge.steps.translate.definition,SUMMARISE:Ge.steps.summarise.definition,GENERATE_TEXT:Ge.steps.generate.definition,EXTRACT_FILE_DATA:Ge.steps.extract.definition,EXTRACT_STATE:Ge.steps.extractState.definition,LOOP_V2:Ge.steps.loopV2.definition,discord:Ge.steps.discord.definition,slack:Ge.steps.slack.definition,zapier:Ge.steps.zapier.definition,integromat:Ge.steps.make.definition,n8n:Ge.steps.n8n.definition};ne.SELF_HOSTED&&(B7.EXECUTE_BASH=k3e,F7.EXECUTE_BASH=Ge.steps.bash.definition,ne.isTest()&&(F7.OPENAI=Ge.steps.openai.definition,F7.AGENT=Ge.steps.agent.definition));async function Q3e(e){if(B7[e]!=null)return B7[e];if(ne.SELF_HOSTED){let r=(await x.plugins.fetch("automation")).find(n=>n.schema.schema.stepId===e);if(!r)throw new Error(`Unable to find action implementation for "${e}"`);return(await nje(r)).action}}o(Q3e,"getAction");var K3e=B(require("object-sizeof"));var Pir=1024*1024;function Nir(e,t){let r=`[removed] - max results size of ${t}MB exceeded`;for(let n of e.steps)n.inputs={message:r},n.outputs={message:r,success:n.outputs.success}}o(Nir,"sanitiseResults");async function z3e(e,t){if(ne.DISABLE_AUTOMATION_LOGS)return;let r=ne.AUTOMATION_MAX_LOG_SIZE_MB;(0,K3e.default)(t)/Pir>r&&Nir(t,r);try{await Jy.logs.storeLog(e,t)}catch(i){i.status===413&&i.request?.data&&(delete i.request.data,i.request.data={message:"removed due to large size"}),Ne.logAlert("Error writing automation log",i)}}o(z3e,"storeLog");async function Y3e(e){let t=await Jy.logs.oldestLogDate();for(let r of e)if(r.automationErrors)for(let[n,i]of Object.entries(r.automationErrors)){let s=[];for(let a of i){if(!a)continue;a.split(U.SEPARATOR)[2]>t&&s.push(a)}r.automationErrors[n]=s}return e}o(Y3e,"checkAppMetadata");var J3e=5,q7=class{static{o(this,"AutomationEmitter")}constructor(t){this.chainCount=t,this.metadata={automationChainCount:t}}async getMaxAutomationChain(){let n=(await C.getWorkspaceDB().get("app_metadata"))?.automations?.chainAutomations;return n===!0?J3e:ne.isTest()?0:n===void 0&&ne.SELF_HOSTED?J3e:0}async emitRow({eventName:t,appId:r,row:n,table:i,oldRow:s,user:a}){let u=await this.getMaxAutomationChain();this.chainCount>=u||rk({emitter:Ah,eventName:t,appId:r,row:n,table:i,oldRow:s,metadata:this.metadata,user:a})}async emitTable(t,r,n){let i=await this.getMaxAutomationChain();this.chainCount>=i||nk({emitter:Ah,eventName:t,appId:r,table:n,metadata:this.metadata})}},X3e=q7;process.env.DD_APM_ENABLED&&(e4e(),SA(Lir));Lc.threadSetup();var kir=Ge.triggers.definitions.CRON.stepId,Mir={success:!0,status:"stopped"};function Vk(e,t,r){if(e.isLegacyLoop){t.items=cJ(t.items);let n=e?.inputs?.children?.[0],i=n?.id||e.id,s=n?.stepId||e.stepId,a=r||n?.inputs||e.inputs;return{id:i,stepId:s,inputs:a,outputs:{success:!0,...t}}}return{id:e.id,stepId:e.stepId,inputs:r||e.inputs,outputs:{success:!0,...t}}}o(Vk,"stepSuccess");function Ab(e,t,r){if(e.isLegacyLoop){t.items=cJ(t.items);let n=e?.inputs?.children?.[0],i=n?.id||e.id,s=n?.stepId||e.stepId,a=r||n?.inputs||e.inputs;return{id:i,stepId:s,inputs:a,outputs:{success:!1,...t}}}return{id:e.id,stepId:e.stepId,inputs:r||e.inputs,outputs:{success:!1,...t}}}o(Ab,"stepFailure");function Uir(e){return{id:e.id,stepId:e.stepId,inputs:e.inputs,outputs:Mir}}o(Uir,"stepStopped");async function Fir(e,t){if(!o(a=>!a||typeof a!="object"?!1:Object.entries(a).some(([u,c])=>{if(u==="onEmptyFilter"||c===void 0||c===null)return!1;if(u==="$and"||u==="$or"){let l=c;return Array.isArray(l?.conditions)&&l.conditions.length>0}return typeof c=="object"?Object.keys(c).length>0:!0}),"requiresEvaluation")(t.condition))return!0;let n={},i=o(a=>{let u=(0,pA.cloneDeep)(a);for(let c of Object.values(u))if(c)if(wX(c))c.conditions=c.conditions.map(i);else for(let[l,f]of Object.entries(c))n[l]=nr(l,e),typeof f=="string"&&Ai(f).length>0&&(c[l]=nr(f,e));return u},"evaluateBindings");return Et.runQuery([n],i(t.condition)).length>0}o(Fir,"branchMatches");async function Bir(e){e.env=await Nc();try{let{config:t}=await yn.getSettingsConfigDoc();e.settings={url:t.platformUrl,logo:t.logoUrl,company:t.company}}catch{e.settings={}}}o(Bir,"enrichBaseContext");function qir(e,t){e.trigger.outputs={...e.trigger.outputs,...t},e.steps[0]=e.trigger}o(qir,"setTriggerOutput");async function jir(e){let t=e.data.automation?.definition?.trigger;if(!t||!gM(t)&&!jc(t))return;let r=e.data.event.appId,n=e.data.automation._id;if(!r)throw new Error("Unable to execute, event doesn't contain app ID.");if(!n)throw new Error("Unable to execute, event doesn't contain automation ID.");e.data.automation=await x.automations.get(n)}o(jir,"reloadAutomation");var Hk=class{static{o(this,"Orchestrator")}constructor(t,r={}){this.job=t,this.stopped=!1,this.onProgress=r.onProgress,this.job.data.automation=KGe(t.data.automation);let n=t.data.event.metadata?.automationChainCount||0;this.emitter=new X3e(n+1)}get automation(){return this.job.data.automation}get appId(){return this.job.data.event.appId}isCron(){return this.automation.definition.trigger.stepId===kir}async stopCron(t,r){if(!this.isCron())return;let n=`CRON disabled reason=${t} - ${this.appId}/${this.automation._id}`;Ne.logWarn(n),await R3e(this.job.id);let{result:i}=r||{};i&&(qir(i,{success:!1,status:"stopped_error"}),i.status="stopped_error",await this.logResult(i))}async logResult(t){await z3e(this.automation,t)}async getMetadata(){let t=tqe(this.automation._id);return await C.getWorkspaceDB().tryGet(t)||{_id:t,errorCount:0}}async incrementErrorCount(){let t=C.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(s){r=s,await fe.wait(1e3+Math.random()*1e3)}}Ne.logAlertWithInfo("Failed to update error count in automation metadata",t.name,this.automation._id,r)}isProd(){return _f(this.appId)}hasErrored(t){return t._error===!0}reportStepProgress(t,r,n,i){if(!this.onProgress)return;let s=i?._loopIteration;this.onProgress({automationId:this.automation._id,appId:this.appId,blockId:t.id,stepId:t.stepId,status:r,occurredAt:Date.now(),result:n,...s?{loop:s}:{}})}async execute(){return await Mf.default.trace("execute",async t=>{t.addTags({appId:this.appId,automationId:this.automation._id});let r=(0,pA.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"};this.onProgress?.({automationId:this.automation._id,appId:this.appId,blockId:r.automation.definition.trigger.id,stepId:r.automation.definition.trigger.stepId,status:"running",occurredAt:Date.now()});let s={trigger:n.outputs,steps:{0:n.outputs},stepsByName:{},stepsById:{},user:n.outputs.user,state:{},_error:!1,_stepIndex:1,_stepResults:[]};await Bir(s);let a=this.job.data.event.timeout||ne.AUTOMATION_THREAD_TIMEOUT,u=[];try{u=await fe.withTimeout(a,()=>this.executeSteps(s,r.automation.definition.steps)),this.stopped?i.status="stopped":this.hasErrored(s)&&(i.status="error")}catch(f){if(f.errno==="ETIME")t.addTags({timeout:!0}),i.status="timed_out",u=s._stepResults;else throw f}i.steps.push(...u);let c=0;this.isProd()&&this.isCron()&&this.hasErrored(s)&&(c=await this.incrementErrorCount()||0),c>=cqe?(await this.stopCron("errors",{result:i}),t?.addTags({shouldStop:!0})):await this.logResult(i),Object.keys(s?.state||{}).length>0&&(i.state=s.state);let l={success:"success",error:"error",stopped:"stopped"};return this.onProgress?.({automationId:this.automation._id,appId:this.appId,blockId:n.id,stepId:n.stepId,status:l[i.status]||"error",occurredAt:Date.now(),result:n}),i})}async executeSteps(t,r){return await Mf.default.trace("executeSteps",async()=>{let n=0,i=[],s=o(u=>u.outputs.success===!1?"error":u.outputs.status==="stopped"?"stopped":"success","progressStatus");function a(u,c,l=!1){u.stepId==="EXTRACT_STATE"&&!l&&(t.state??={},t.state[c.inputs.key]=c.outputs.value),t.steps[u.id]=c.outputs,t.steps[u.name||u.id]=c.outputs,t.stepsById[u.id]=c.outputs,t.stepsByName[u.name||u.id]=c.outputs,t.previous=c.outputs,t._stepIndex||=0,t.steps[t._stepIndex]=c.outputs,t._stepIndex++,c.outputs.success===!1&&(t._error=!0),t._stepResults.push(c),i.push(c)}for(o(a,"addToContext");n<r.length&&!this.stopped;){let u=r[n];switch(u.stepId){case"BRANCH":{let c=await this.executeBranchStep(t,u);t._stepResults.push(...c),i.push(...c),c[0]&&this.reportStepProgress(u,s(c[0]),c[0],t),n++;break}case"LOOP_V2":{this.reportStepProgress(u,"running",void 0,t);let c=await this.executeLoopStep(t,u);if(u.isLegacyLoop){let l=u.inputs.children?.[0];l&&a(l,c,!0)}else a(u,c,!0);if(this.reportStepProgress(u,s(c),c,t),c.outputs.success===!1&&c.outputs.status==null)return i;n++;break}default:{this.reportStepProgress(u,"running",void 0,t),a(u,await It.addAction(async()=>{let l=await this.executeStep(t,u);return u.stepId==="EXTRACT_STATE"&&(t.state??={},t.state[l.inputs.key]=l.outputs.value),Le.action.automationStepExecuted({stepId:u.stepId}),l}));let c=i.at(-1);if(c&&(this.reportStepProgress(u,s(c),c,t),u.stepId==="TRIGGER_AUTOMATION_RUN"&&c.outputs.success===!1&&(c.outputs.status==="error"||c.outputs.status==="stopped_error")))return i;n++;break}}}return i})}async executeLoopStep(t,r){return await Mf.default.trace("executeLoopStep",async n=>{let i=(0,pA.cloneDeep)(r.inputs.children)||[],s=r.inputs;await UN(s,t);let a=GGe(r),u=(t._loopDepth||0)+1;t._loopDepth=u;try{let c=0,l=[];try{l=$Ge(r)}catch{return n.addTags({status:"INCORRECT_TYPE",iterations:c}),Ab(r,{status:"INCORRECT_TYPE"})}let d=r.isLegacyLoop?Number.MAX_SAFE_INTEGER:VGe(r),p=HGe(i,d),h=Math.min(l.length,a);for(;c<l.length;c++){let g=l[c];if(c===a)return n.addTags({status:"max_iterations_reached",iterations:c}),Ab(r,sb(p,"max_iterations_reached",c));if(WGe(r,g))return n.addTags({status:"FAILURE_CONDITION_MET",iterations:c}),Ab(r,sb(p,"FAILURE_CONDITION_MET",c));let y=t.loop,b=t._loopIteration;t.loop={currentItem:g},t._loopIteration={current:c+1,total:h};try{let w=t._stepIndex,E=await this.executeSteps(t,i);t._stepIndex=w;for(let T of E)i.some(A=>A.id===T.id)&&QGe(p,T,c);if(E.some(T=>T.outputs.success===!1))return Ab(r,sb(p,void 0,void 0,!0));if(this.stopped){let T=sb(p,void 0,c+1);return T.status="stopped",n.addTags({status:"stopped",iterations:c+1}),Vk(r,T)}}finally{t.loop=y,t._loopIteration=b}}let m=c===0?"no_iterations":void 0;return Vk(r,sb(p,m,c))}finally{t._loopDepth=u-1}})}async executeBranchStep(t,r){return await Mf.default.trace("executeBranchStep",async n=>{let{branches:i,children:s}=r.inputs;for(let a of i)if(await Fir(t,a)){n.addTags({branchName:a.name,branchId:a.id});let u=Vk(r,{branchName:a.name,status:`${a.name} branch taken`,branchId:`${a.id}`});this.reportStepProgress(r,"running",u,t);let c=await this.executeSteps(t,s?.[a.id]||[]);return[u,...c]}return n.addTags({status:"No branch condition met"}),[Ab(r,{status:"No branch condition met"})]})}async executeStep(t,r){return await Mf.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}),Uir(r);let i=await Q3e(r.stepId);if(i==null)throw new Error(`Cannot find automation step by name ${r.stepId}`);let s=(0,pA.cloneDeep)(r.inputs);r.stepId!=="EXECUTE_SCRIPT_V2"&&r.stepId!=="EXTRACT_STATE"&&(s=await UN(s,t)),s=uJ(s,r.schema.inputs.properties);let a;try{a=await Mf.default.trace("fn",()=>i({inputs:s,appId:this.appId,emitter:this.emitter,context:t}))}catch(u){return Ab(r,{status:"error",error:Ye(u)})}return r.stepId==="FILTER"&&"result"in a&&a.result===!1&&(this.stopped=!0,a.status="stopped"),r.stepId==="TRIGGER_AUTOMATION_RUN"&&"status"in a&&a.status==="stopped"&&(this.stopped=!0),n.addTags({outputsKeys:Object.keys(a)}),Vk(r,a,s)})}};async function t4e(e,t={}){let r=e.data.event.appId;if(!r)throw new Error("Unable to execute, event doesn't contain workspace ID.");return await Mf.default.trace("automation.executeInThread",async n=>(n.addTags({workspaceId:r,automationId:e.data.automation?._id}),await C.doInWorkspaceContext(r,async()=>{await jir(e),await C.ensureSnippetContext();let i=await Nc();return await C.doInEnvironmentContext(i,async()=>new Hk(e,t).execute())})))}o(t4e,"executeInThread");var v3e=o(async e=>{let t=e.data.event.appId;if(!t)throw new Error("Unable to execute, event doesn't contain app ID.");await C.doInWorkspaceContext(t,async()=>{await new Hk(e).stopCron("stalled")})},"removeStalled");var QNn=Ge.triggers.definitions,r4e={removeOnComplete:!0,removeOnFail:!0};async function Wir(){return(await C.getWorkspaceDB().allDocs(Ac(null,{include_docs:!0}))).rows.map(r=>r.doc)}o(Wir,"getAllAutomations");async function $ir(e,t){let r=e.row.tableId;if(e.appId==null)throw`No appId specified for ${t} - check event emitters.`;!r||!await ZJ(r)||await C.doInWorkspaceContext(e.appId,async()=>{let n=await Wir();n=n.filter(i=>{let s=i.definition.trigger,a=s?.inputs;return s&&s.event===t&&!i.disabled&&a?.tableId===e.row.tableId});for(let i of n){if(!ne.ALLOW_DEV_AUTOMATIONS&&j8(e.appId)&&!await Cz(i._id))continue;if(await n4e(i,{row:e.row,oldRow:e.oldRow}))try{await Tb.add({automation:i,event:e},r4e)}catch(a){Ne.logAlert("Failed to queue automation",a)}}})}o($ir,"queueRelevantRowAutomations");async function j7(e,t){try{await $ir(e,t)}catch(r){Ne.logWarn("Unable to process row event",r)}}o(j7,"queueRowAutomations");Ah.on("row:save",async function(e){!e||!e.row||!e.row.tableId||await j7(e,"row:save")});Ah.on("row:update",async function(e){!e||!e.row||!e.row.tableId||await j7(e,"row:update")});Ah.on("row:delete",async function(e){!e||!e.row||!e.row.tableId||await j7(e,"row:delete")});function Gir(e,t){return Et.runQuery([e],t).length>0}o(Gir,"rowPassesFilters");function $k(e){return e!==null&&"steps"in e&&Array.isArray(e.steps)}o($k,"isAutomationResults");async function kc(e,t,{getResponses:r,onProgress:n}={}){if(e.disabled)throw new Error("Automation is disabled");if(sn.automations.isAppAction(e)&&!await Cz(e._id)){t.fields==null&&(t.fields={});let a={},u=e.definition.trigger.inputs||{},c="fields"in u?u.fields:{};for(let l of Object.keys(c||{}))a[l]=Sh(t.fields[l],c[l]);t.fields=a}else(sn.automations.isRowAction(e)||sn.automations.isWebhookAction(e))&&(t={...t,...t.fields,fields:{}});let i={automation:e,event:t};return await n4e(e,{row:i.event?.row??{},oldRow:i.event?.oldRow??{}})?r?(i.event={...i.event,appId:C.getWorkspaceId(),automation:e},t4e({data:i},{onProgress:n})):Tb.add(i,r4e):{outputs:{success:!1,status:"stopped"},message:"Automation did not run. Filter conditions in trigger were not met."}}o(kc,"externalTrigger");async function n4e(e,t){let r=e.definition.trigger,n=r.inputs,i=n?.filters,s=n?.tableId;if(!i)return!0;if(r.stepId===Ge.triggers.definitions.ROW_UPDATED.stepId||r.stepId===Ge.triggers.definitions.ROW_SAVED.stepId){let a=await ob(s,t.row);return Gir(a,i)}return!0}o(n4e,"checkTriggerFilters");var i4e="Trigger this automation (APP triggers only). Returns all step outputs.",o4e="Fields map: key/value pairs. Values must be string, number, boolean, or array (no nested objects).",Vir=o(e=>{let r=e.definition?.trigger?.inputs?.fields;return!r||Object.keys(r).length===0?"":Object.entries(r).map(([n,i])=>`${n} (${i})`).join(", ")},"getAutomationFieldsSummary"),Hir=o(async({automationId:e,fields:t})=>{let r=t??{},i=await C.getWorkspaceDB().tryGet(e);if(!i)return{error:`Automation with ID ${e} not found`};let s=i.definition?.trigger?.stepId;if(s!=="APP")return{error:`Cannot trigger automation '${i.name}'. Only APP trigger type supported. This automation has: ${s}`};let a=await kc(i,{fields:r},{getResponses:!0});return $k(a)?{success:a.status==="success",status:a.status,steps:a.steps}:{success:!1,error:a.message||"Automation did not trigger"}},"triggerAutomationById"),Qir=[{name:"list_automations",sourceType:"AUTOMATION",sourceLabel:"Budibase",description:"List all automations in the current app",tool:(0,Qk.tool)({description:"List all automations in the current app",inputSchema:ko.z.object({}),execute:async()=>({automations:await x.automations.fetch()})})},{name:"get_automation",sourceType:"AUTOMATION",sourceLabel:"Budibase",description:"Get details about a specific automation by ID",tool:(0,Qk.tool)({description:"Get details about a specific automation by ID",inputSchema:ko.z.object({automationId:ko.z.string().describe("The ID of the automation to retrieve")}),execute:async e=>{let{automationId:t}=e;return{automation:await x.automations.get(t)}}})}],Kir=o((e=[])=>{let t=e.filter(r=>r._id&&r.definition?.trigger?.stepId==="APP").map(r=>{let n=r.name||r._id,s=`${r._id.replace(/[^A-Za-z0-9_-]/g,"_")}_trigger`.substring(0,64),a=Vir(r),u=a?`${o4e} Available fields: ${a}.`:o4e,c=a?`Trigger "${n}" automation. ${i4e} Fields: ${a}.`:`Trigger "${n}" automation. ${i4e}`;return{name:s,readableName:`${n}.trigger`,sourceType:"AUTOMATION",sourceLabel:"Budibase",description:c,tool:(0,Qk.tool)({description:c,inputSchema:ko.z.object({fields:ko.z.record(ko.z.string(),ko.z.union([ko.z.string(),ko.z.number(),ko.z.boolean(),ko.z.array(ko.z.unknown())])).nullish().describe(u)}),execute:async l=>{let{fields:f}=l;return Hir({automationId:r._id,fields:f})}})}});return[...Qir,...t]},"createAutomationTools"),s4e=Kir;var W7=require("ai"),hA=require("zod");var zir=[{name:"list_tables",sourceType:"INTERNAL_TABLE",sourceLabel:"Budibase",description:"List all tables in the current app",tool:(0,W7.tool)({description:"List all tables in the current app",inputSchema:hA.z.object({showSchema:hA.z.boolean().describe("Whether to show the schema of the tables. This can be extemely large. Default to false to save on tokens.").default(!1)}),execute:async e=>{let{showSchema:t}=e,r=await x.tables.getAllTables();return t?{tables:r}:{tables:r.map(n=>({id:n._id,tableName:n.name}))}}})},{name:"get_table",sourceType:"INTERNAL_TABLE",sourceLabel:"Budibase",description:"Get details about a specific table by ID",tool:(0,W7.tool)({description:"Get details about a specific table by ID",inputSchema:hA.z.object({tableId:hA.z.string().describe("The ID of the table to retrieve")}),execute:async e=>{let{tableId:t}=e;return{table:await x.tables.getTable(t)}}})}],a4e=zir;var c4e=require("ai"),Ve=require("zod");var u4e="CRITICAL: Use plain text values only. Do NOT include HTML tags, markdown formatting, or content containing quotes, backslashes, or special characters - these break JSON parsing. Summarize or strip complex content. Max 500 characters per field.",Kk='Row data as a JSON object. Example: {"name": "John", "age": 30}. Do NOT nest this inside a string; pass the object directly. Values must be plain text - no HTML, markdown, or special characters.',$7='Query filters object. Structure: { operator: { fieldName: value } }. CRITICAL: fieldName must match an existing column in the table schema exactly (case-sensitive). Valid operators: "equal", "notEqual", "empty", "notEmpty", "fuzzy", "string", "contains", "notContains", "containsAny", "oneOf", "range". IMPORTANT: Do NOT use "and", "or", or nested $and/$or conditions. All operators must be top-level keys in a single flat object. Operators oneOf and containsAny require array values (e.g. {"oneOf": {"status": ["active", "pending"]}}). To combine multiple filters, include multiple operator keys: {"fuzzy": {"name": "John", "city": "London"}, "equal": {"status": "active"}}. Examples: Find where status equals "active": {"equal": {"status": "active"}}. Find where status is "active" OR "pending": {"oneOf": {"status": ["active", "pending"]}}. Find where tags contains any of "urgent", "review": {"containsAny": {"tags": ["urgent", "review"]}}. Find where name is not empty: {"notEmpty": {"name": true}}. Find where price is within the range of 10 to 100: {"range": {"price": {"low": 10, "high": 100}}}. Combine fuzzy name with exact status: {"fuzzy": {"name": "John"}, "equal": {"status": "active"}}.',Yir=30,Jir=o(e=>new Set(e==="external"?no:Hr),"getProtectedColumns"),Xir=o(e=>e.type==="formula"||e.type==="auto"||e.type==="ai"||e.autocolumn===!0,"isReadOnlyField"),l4e=o(e=>{switch(e.type){case"string":return"string";case"longform":return"longform";case"options":return"options";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"datetime":return"datetime";case"attachment":return"attachments";case"attachment_single":return"attachment";case"link":return"link";case"json":return"json";case"bb_reference":return"bb_reference";case"bb_reference_single":return"bb_reference_single";case"bigint":return"bigint";case"barcodeqr":return"barcode";case"signature_single":return"signature";default:return e.type}},"formatFieldType"),Zir=o(({name:e,schema:t})=>{let r=`${e} (${l4e(t)})`,n=t.constraints?.inclusion;return(t.type==="options"||t.type==="array")&&Array.isArray(n)&&n.length>0&&(r+=` options: ${n.join(" | ")}`),t.type==="link"&&"tableId"in t&&t.tableId&&(r+=` -> ${t.tableId}`),r},"formatFieldSummary"),eor=o((e,t)=>{let r=Jir(t);return Object.entries(e).filter(([n,i])=>!(r.has(n)||Xir(i))).map(([n,i])=>({name:n,schema:i}))},"getWritableFields"),tor=o(e=>{if(e.length===0)return"";let t=e.map(Zir),r=t.slice(0,Yir),n=t.length-r.length;return n>0&&r.push(`... +${n} more (use get_table for full schema)`),r.join(", ")},"buildSchemaSummary"),ror=o(e=>e?`${Kk} Available fields: ${e}.`:Kk,"buildDataFieldDescription"),nor=o((e,t)=>{if(e.length===0)return Ve.z.record(Ve.z.string(),Ve.z.any()).describe(Kk);let r={};for(let n of e){let i=l4e(n.schema),s=n.schema.constraints?.inclusion,a=Array.isArray(s)&&s.length>0?` Options: ${s.join(" | ")}.`:"";r[n.name]=Ve.z.any().describe(`Field type: ${i}.${a}`)}return Ve.z.object(r).partial().loose().describe(ror(t))},"buildRowDataSchema"),ior=o(e=>e?`${$7} Available fields: ${e}.`:$7,"buildSearchQueryDescription"),oor=o(e=>Ve.z.object({query:Ve.z.union([Ve.z.record(Ve.z.string(),Ve.z.any()),Ve.z.string()]).nullish().describe(ior(e)),sort:Ve.z.object({column:Ve.z.string().describe("Column to sort by"),order:Ve.z.enum(["ascending","descending"]).describe("Sort order")}).nullish().describe("Sort configuration"),limit:Ve.z.number().nullish().describe("Maximum number of results")}),"buildSearchInputSchema"),sor={list_rows:{description:"List rows in a given table with optional pagination",inputSchema:Ve.z.object({limit:Ve.z.number().nullish().describe("Maximum number of rows to return"),bookmark:Ve.z.union([Ve.z.string(),Ve.z.number()]).nullish().describe("Bookmark for pagination (returned from previous request)")}),execute:async(e,{limit:t,bookmark:r})=>{let n={tableId:e,query:{},limit:t??void 0,bookmark:r??void 0},i=await x.rows.search(n);return{rows:i.rows,hasNextPage:i.hasNextPage,bookmark:i.bookmark}}},get_row:{description:"Get a specific row by ID",inputSchema:Ve.z.object({rowId:Ve.z.string().describe("The ID of the row to retrieve")}),execute:async(e,{rowId:t})=>({row:await x.rows.find(e,t)})},create_row:{description:`Create a new row. Only include fields that match the table schema. ${u4e}`,inputSchema:Ve.z.object({data:Ve.z.record(Ve.z.string(),Ve.z.any()).describe(Kk)}),execute:async(e,{data:t})=>{let{row:r}=await x.rows.save(e,t,void 0);return{row:r}}},update_row:{description:`Update an existing row. ${u4e}`,inputSchema:Ve.z.object({rowId:Ve.z.string().describe("The ID of the row to update"),rowRev:Ve.z.string().describe("The current _rev of the row (if known)"),data:Ve.z.record(Ve.z.string(),Ve.z.any()).describe('The updated data as a JSON object. Example: {"name": "Jane"}. Do NOT nest this inside a string; pass the object directly. Values must be plain text - no HTML, markdown, or special characters.')}),execute:async(e,{rowId:t,rowRev:r,data:n})=>{let s={...await x.rows.find(e,t),...n,_id:t,_rev:r},{row:a}=await x.rows.save(e,s,void 0);return{row:a}}},search_rows:{description:"Search for rows in a table based on criteria. IMPORTANT: You can ONLY filter on fields that exist in the table schema. Use get_table or list_tables first to see available field names. Searching on non-existent fields will fail.",inputSchema:Ve.z.object({query:Ve.z.union([Ve.z.record(Ve.z.string(),Ve.z.any()),Ve.z.string()]).nullish().describe($7),sort:Ve.z.object({column:Ve.z.string().describe("Column to sort by"),order:Ve.z.enum(["ascending","descending"]).describe("Sort order")}).nullish().describe("Sort configuration"),limit:Ve.z.number().nullish().describe("Maximum number of results")}),execute:async(e,{query:t,sort:r,limit:n})=>{let i=t;if(typeof i=="string")try{i=JSON.parse(i)}catch(u){return{error:`Invalid JSON in query parameter: ${u}`}}let s={tableId:e,query:i||{},limit:n??void 0};return r&&(s.sort=r.column,s.sortOrder=r.order==="ascending"?"ascending":"descending"),{rows:(await x.rows.search(s)).rows}}}},aor=o(e=>e.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" "),"formatActionLabel"),f4e=o(({tableId:e,tableName:t,tableSourceType:r,tableSchema:n,sourceLabel:i,sourceIconType:s})=>{let a=r==="external",u=a?"EXTERNAL_TABLE":"INTERNAL_TABLE",c=i||(a?"External":"Budibase"),l=eor(n,r),f=tor(l),d=nor(l,f),p=oor(f);return Object.entries(sor).map(([h,m])=>{let g=`${aor(h)} in "${t}". ${m.description}`,b=`${e.replace(/[^A-Za-z0-9_-]/g,"_")}_${h}`.substring(0,64),w=m.inputSchema;return h==="create_row"?w=Ve.z.object({data:d}):h==="update_row"?w=Ve.z.object({rowId:Ve.z.string().describe("The ID of the row to update"),rowRev:Ve.z.string().describe("The current _rev of the row (if known)"),data:d}):h==="search_rows"&&(w=p),{name:b,readableName:`${t}.${h}`,sourceType:u,sourceLabel:c,sourceIconType:s,description:g,tool:(0,c4e.tool)({description:g,inputSchema:w,execute:async E=>m.execute(e,E)})}})},"createRowTools");var d4e=o((e=[],t={},r={},n=[])=>{let i=[...s4e(n),...a4e],s=e.filter(a=>a._id).flatMap(a=>{let u=a.sourceType==="external";return f4e({tableId:a._id,tableName:a.name||a._id,tableSourceType:a.sourceType,tableSchema:a.schema,sourceLabel:u?t[a.sourceId]||"External":"Budibase",sourceIconType:u?r[a.sourceId]:void 0})});return[...i,...s]},"getBudibaseTools");var Yk=require("ai");var h4e=require("ai"),G7=require("zod");var p4e=o((e,t)=>e.toLowerCase().replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"").substring(0,t),"sanitiseNameSegment"),uor=o((e,t,r)=>{let n=p4e(t||"datasource",20)||"datasource",i=p4e(e.name||"query",24)||"query";return`${r}_${n}_${i}`},"buildScopedToolName"),cor=o(e=>{let t={};for(let r of e.parameters||[])t[r.name]=G7.z.string().optional().describe(`Parameter: ${r.name}`);return G7.z.object(t)},"buildParametersSchema"),m4e=o(({query:e,sourceType:t,sourceLabel:r,sourceIconType:n,description:i,namePrefix:s})=>{let a=uor(e,r,s),u=cor(e);return{name:a,readableName:e.name,description:i,sourceType:t,sourceLabel:r,sourceIconType:n,tool:(0,h4e.tool)({description:i,inputSchema:u,execute:async c=>{let l=C.getWorkspaceId();if(!l)return{success:!1,error:"No app context available"};let f=Wr(l,null,{body:{parameters:c},params:{queryId:e._id}});try{await Sb(f);let{data:d,...p}=f.body||{};return{success:!0,data:d,info:p}}catch(d){return{success:!1,error:(d instanceof Error?d.message:String(d))||"Query execution failed"}}}})}},"createQueryTool"),g4e=o((e,t)=>{let r=e.restTemplateMetadata?.description?`${e.name}: ${e.restTemplateMetadata.description}`:`Execute REST query: ${e.name}`;return m4e({query:e,description:r,sourceType:"REST_QUERY",sourceLabel:t||"API",namePrefix:"rest"})},"createRestQueryTool"),y4e=o((e,t,r)=>m4e({query:e,description:`Execute datasource query: ${e.name}`,sourceType:"DATASOURCE_QUERY",sourceLabel:t||"Datasource",sourceIconType:r,namePrefix:"ds"}),"createDatasourceQueryTool");var lor=o(e=>{if(!e||typeof e!="object"||!("error"in e))return;let{error:t}=e;if(!(t==null||t===!1))return t instanceof Error?t.message||"Tool execution failed":String(t)},"getToolFailure"),dor=o(e=>{let t=e.tool.execute;if(!t)return e.tool;let r=o(async(...n)=>{let i=await t(...n),s=lor(i);if(s)throw new Error(s);return i},"wrappedExecute");return{...e.tool,execute:r}},"wrapTool"),b4e=o(e=>Object.fromEntries(e.map(t=>[t.name,dor(t)])),"toToolSet");var _4e=require("ai"),zk=require("zod");var por=zk.z.object({query:zk.z.string().describe("The search query to find relevant information"),num_results:zk.z.number().optional().default(10).describe("Number of results to return")}),V7=o(e=>({name:"search_web_search",sourceType:"SEARCH",sourceLabel:"Exa",description:"Search the web using Exa",tool:(0,_4e.tool)({description:"Search the web using Exa",inputSchema:por,execute:async t=>{let r=await fetch("https://api.exa.ai/search",{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify({query:t.query,num_results:t.num_results})});if(!r.ok){let n=await r.text();throw new Error(`Exa error: ${r.status} ${r.statusText} - ${n}`)}return r.json()}})}),"createExaTool");var Ob=require("zod"),w4e=require("ai");var hor=Ob.z.object({objective:Ob.z.string().describe("Natural language description of what to search for"),search_queries:Ob.z.array(Ob.z.string()).describe("Array of search query strings"),max_results:Ob.z.number().optional().default(10).describe("Maximum number of results to return")}),H7=o(e=>({name:"search_web_search",description:"Search the web using Parallel AI",sourceType:"SEARCH",sourceLabel:"Parallel Search",tool:(0,w4e.tool)({description:"Search the web using Parallel AI",inputSchema:hor,execute:async t=>{let r=await fetch("https://api.parallel.ai/v1beta/search",{method:"POST",headers:{"x-api-key":e,"parallel-beta":"search-extract-2025-10-10","Content-Type":"application/json"},body:JSON.stringify({objective:t.objective,search_queries:t.search_queries,max_results:t.max_results,excerpts:{max_chars_per_result:2e3}})});if(!r.ok)throw new Error(`Parallel error: ${r.status} ${r.statusText}`);return r.json()}})}),"createParallelTool");var mor=new Set(["list_tables","get_table","list_automations","get_automation"]),E4e=o(e=>mor.has(e.name),"isHelperTool");function S4e(e){return{name:e.name,readableName:e.readableName,description:e.description,sourceType:e.sourceType,sourceLabel:e.sourceLabel,sourceIconType:e.sourceIconType}}o(S4e,"toToolMetadata");async function Q7(e){let[t,r,n,i,s]=await Promise.all([x.queries.fetch(),x.datasources.fetch(),e?x.ai.configs.find(e):Promise.resolve(void 0),x.tables.getAllTables(),x.automations.fetch()]),a=n?.webSearchConfig,u=new Map(r.filter(h=>!!h._id).map(h=>[h._id,h])),c=Object.fromEntries(r.filter(h=>!!h._id).map(h=>[h._id,h.name||"Datasource"])),l=Object.fromEntries(r.filter(h=>!!h._id).map(h=>[h._id,h.source||"CUSTOM"])),f=t.flatMap(h=>{let m=u.get(h.datasourceId);return!m||m.source!=="REST"?[]:[g4e(h,m.name||"API")]}),d=t.flatMap(h=>{let m=u.get(h.datasourceId);return!m||m.source==="REST"?[]:[y4e(h,m.name||"Datasource",m.source||"CUSTOM")]}),p=[...d4e(i,c,l,s),...f,...d];return a?.apiKey&&(a.provider==="exa"?p.push(V7(a.apiKey)):a.provider==="parallel"&&p.push(H7(a.apiKey))),p}o(Q7,"getAvailableTools");async function gor(e){return(await Q7(e)).filter(r=>!E4e(r)).map(S4e)}o(gor,"getAvailableToolsMetadata");async function yor(e,t={}){let{baseSystemPrompt:r,includeGoal:n=!0}=t,i=await Q7(e.aiconfig),s=new Set(e.enabledTools||[]),a=bor(i.filter(c=>s.has(c.name)&&!E4e(c)),i);return{systemPrompt:Mt.composeAutomationAgentSystemPrompt({baseSystemPrompt:r,goal:n?e.goal:void 0,promptInstructions:e.promptInstructions,includeGoal:n}),tools:b4e(a)}}o(yor,"buildPromptAndTools");function bor(e,t){let r=new Set(e.map(i=>i.name)),n=new Map(t.map(i=>[i.name,i]));if(e.some(i=>i.sourceType==="EXTERNAL_TABLE"||i.sourceType==="INTERNAL_TABLE"))for(let i of["get_table","list_tables"]){if(r.has(i))continue;let s=n.get(i);s&&(e.push(s),r.add(s.name))}if(e.some(i=>i.sourceType==="AUTOMATION"))for(let i of["get_automation","list_automations"]){if(r.has(i))continue;let s=n.get(i);s&&(e.push(s),r.add(s.name))}return e}o(bor,"addHelperTools");var _or=new Set(["output-available","output-error","output-denied"]);function k7(e){let t=[];for(let r of e)if(!(r.role!=="assistant"||!r.parts))for(let n of r.parts)(0,Yk.isToolUIPart)(n)&&!_or.has(n.state)&&t.push({toolName:(0,Yk.getToolName)(n),toolCallId:n.toolCallId,state:n.state});return t}o(k7,"findIncompleteToolCalls");function M7(e,t,r){for(let n of t)n.toolCallId&&e.add(n.toolCallId);for(let n of r)n.toolCallId&&e.delete(n.toolCallId)}o(M7,"updatePendingToolCalls");function U7(e){let t=e.map(r=>r.toolName).join(", ");return`The AI model failed to complete tool execution${t?` for: ${t}`:""}. This may be due to a compatibility issue with the selected model. Please try a different model or try again.`}o(U7,"formatIncompleteToolCallError");var X7={};$(X7,{enqueueAgentFileIngestion:()=>J7,getQueue:()=>Y7,init:()=>T4e});var wor=2,Eor=Je.Duration.fromSeconds(10).toMs(),Sor=Je.Duration.fromMinutes(10).toMs(),K7,z7=!1;function Y7(){return K7||(K7=new Xr.BudibaseQueue(Xr.JobQueue.RAG_INGESTION,{maxStalledCount:3,jobOptions:{attempts:5,backoff:{type:"exponential",delay:Eor},timeout:Sor,removeOnComplete:!0,removeOnFail:1e3},jobTags:e=>({workspaceId:e.workspaceId,agentId:e.agentId,fileId:e.fileId})})),K7}o(Y7,"getQueue");function T4e(e=wor){if(z7)return Promise.resolve();try{return z7=!0,Y7().process(e,async t=>{let{workspaceId:r,agentId:n,fileId:i,objectStoreKey:s}=t.data;await C.doInWorkspaceContext(r,async()=>{let a,u;try{a=await da.getOrThrow(n)}catch(c){if(c?.status===404){await t.discard();return}throw c}try{u=await da.getAgentFileOrThrow(i)}catch(c){if(c?.status===404){await t.discard();return}throw c}if(!u.objectStoreKey&&s&&(u.objectStoreKey=s),!u.objectStoreKey)throw new Error("Agent file does not have an object store key");try{let c=await Tor(u.objectStoreKey),l=await XY(a,u,c);u.status="ready",u.chunkCount=l.total,u.processedAt=new Date().toISOString(),u.errorMessage=void 0,await da.updateAgentFile(u)}catch(c){throw await vor(u,t,c),c}})})}catch{console.error("Error initialising the RAG ingestion queue"),z7=!1}}o(T4e,"init");async function J7(e){return T4e(),await Y7().add(e,{jobId:e.fileId})}o(J7,"enqueueAgentFileIngestion");var Tor=o(async e=>{let{stream:t}=await ge.getReadStream(mr.APPS,e),r=[];for await(let n of t)r.push(new Uint8Array(n));return Buffer.concat(r)},"loadFileBuffer"),vor=o(async(e,t,r)=>{let n=t.opts.attempts||1;t.attemptsMade+1>=n&&(e.status="failed",e.errorMessage=r?.message||"Failed to process uploaded file",e.chunkCount=0,await da.updateAgentFile(e))},"handleProcessingError");var Aor=o((e,t,r,n)=>`${e}/ai/agents/${t}/files/${r}/${n}`,"buildAgentFileObjectStoreKey"),Ror=o(async e=>{let t=C.getOrThrowWorkspaceId(),r=Ze.generateAgentFileID(e.agentId),n=Aor(t,e.agentId,r,e.filename);try{await ge.upload({bucket:mr.APPS,filename:n,body:e.buffer,type:e.mimetype});let i=await eJ({id:r,agentId:e.agentId,filename:e.filename,mimetype:e.mimetype,objectStoreKey:n,size:e.size??e.buffer.byteLength,uploadedBy:e.uploadedBy});try{return await J7({workspaceId:t,agentId:e.agentId,fileId:i._id,objectStoreKey:n}),i}catch(s){throw i.status="failed",i.errorMessage=s?.message||"Failed to process uploaded file",i.chunkCount=0,await tJ(i),s}}catch(i){throw await ge.deleteFile(mr.APPS,n).catch(()=>{}),i}},"uploadAgentFile");var eM={};$(eM,{create:()=>e9,getOrThrow:()=>Xk,getSingle:()=>Jk,update:()=>Zk});var Z7=o(e=>({...e,live:e.live??!1,agents:e.agents??[]}),"withDefaults"),Oor=o(e=>{if(e!==void 0){if(!Array.isArray(e))throw new V("conversationStarters must contain prompt entries",400);if(e.length>3)throw new V("conversationStarters may contain at most 3 starters",400);return e.map(t=>{if(!t||typeof t!="object")throw new V("conversationStarters must contain prompt entries",400);if(typeof t.prompt!="string")throw new V("conversationStarters must contain prompt entries",400);return{prompt:t.prompt}})}},"normalizeConversationStarters"),v4e=o(e=>{if(e===void 0)return;if(!Array.isArray(e))throw new V("agents must contain valid agentId entries",400);if(e.length===0)return[];if(!e.every(r=>typeof r?.agentId=="string"&&r.agentId.trim().length))throw new V("agents must contain valid agentId entries",400);return e.map(r=>({agentId:r.agentId,isEnabled:r.isEnabled===!0,isDefault:r.isDefault===!0,conversationStarters:Oor(r.conversationStarters)}))},"normalizeAgents");async function Jk(){let r=(await C.getWorkspaceDB().allDocs(Ze.getDocParams("chatapp",void 0,{include_docs:!0,limit:1}))).rows[0]?.doc;return r?Z7(r):void 0}o(Jk,"getSingle");async function Xk(e){if(!e)throw new V("chatAppId is required",400);let r=await C.getWorkspaceDB().tryGet(e);if(!r)throw new V("Chat App not found",404);return Z7(r)}o(Xk,"getOrThrow");async function e9(e){let t=C.getWorkspaceDB();if(await Jk())throw new V("Chat App already exists for this workspace",400);let n=v4e(e.agents===void 0?void 0:e.agents),i=new Date().toISOString(),s={_id:Ze.generateChatAppID(),createdAt:i,updatedAt:i,...e,agents:n??[]},{rev:a}=await t.put(s);return{...s,_rev:a}}o(e9,"create");async function Zk(e){if(!e._id||!e._rev)throw new V("_id and _rev are required",400);let t=C.getWorkspaceDB(),r=await t.tryGet(e._id);if(!r)throw new V("Chat App not found",404);let n=v4e(e.agents===void 0?r.agents??[]:e.agents),i=new Date().toISOString(),s={...r,...e,agents:n??[],updatedAt:i},{rev:a}=await t.put(s);return s._rev=a,Z7(s)}o(Zk,"update");var i9={};$(i9,{MSTeams:()=>n9,discord:()=>r9});var r9={};$(r9,{DISCORD_ASK_COMMAND:()=>Cor,DISCORD_NEW_COMMAND:()=>xor,buildDiscordInviteUrl:()=>kor,buildDiscordWebhookUrl:()=>Lor,disableAgentOnChatApp:()=>Por,getDiscordPublicKeyForRoute:()=>Wor,isDiscordTimestampFresh:()=>jor,resolveChatAppForAgent:()=>Nor,syncApplicationCommands:()=>For,validateDiscordIntegration:()=>Dor,verifyDiscordSignature:()=>Bor});var t9=B(require("crypto")),x4e=B(require("node-fetch"));var A4e=o(async(e,t)=>{let r=e.agents||[],n=r.find(s=>s.agentId===t);if(n?.isEnabled)return e;let i=n?r.map(s=>s.agentId===t?{...s,isEnabled:!0}:s):[...r,{agentId:t,isEnabled:!0,isDefault:!1}];return await Zk({...e,agents:i})},"enableAgentOnChatApp"),R4e=o(async({chatAppId:e,agentId:t})=>{let r=await Xk(e),n=r.agents||[],i=n.find(a=>a.agentId===t);if(!i||!i.isEnabled)return r;let s=n.map(a=>a.agentId===t?{...a,isEnabled:!1}:a);return await Zk({...r,agents:s})},"disableAgentOnChatApp"),tM=o(async({agentId:e,chatAppId:t})=>{if(t){let n=await Xk(t);return await A4e(n,e)}let r=await Jk();return r?await A4e(r,e):await e9({agents:[{agentId:e,isEnabled:!0,isDefault:!1}]})},"resolveChatAppForAgent"),rM=o(async({provider:e,chatAppId:t,agentId:r,useProdWorkspaceId:n=!1})=>{let i=await yn.getPlatformUrl({tenantAware:!0}),s=C.getWorkspaceId();if(!s)throw new V("workspaceId is required",400);let a=n?U.getProdWorkspaceID(s):s;return`${i.replace(/\/$/,"")}/api/webhooks/${e}/${a}/${t}/${r}`},"buildWebhookUrl");var I4e="https://discord.com/api/v10",Ior=300,Cor=$f.ASK,xor=$f.NEW,Dor=o(e=>{let t=e.discordIntegration;if(!t)throw new V("Discord integration is not configured for this agent",400);let r=t.applicationId?.trim(),n=t.publicKey?.trim(),i=t.botToken?.trim(),s=t.guildId?.trim();if(!r||!n||!i||!s)throw new V("Discord integration requires applicationId, publicKey, botToken, and guildId",400);return{applicationId:r,botToken:i,guildId:s,chatAppId:t.chatAppId?.trim()||void 0}},"validateDiscordIntegration"),Por=o(async(e,t)=>await R4e({chatAppId:e,agentId:t}),"disableAgentOnChatApp"),Nor=o(async(e,t)=>await tM({agentId:e,chatAppId:t}),"resolveChatAppForAgent"),Lor=o(async(e,t)=>await rM({provider:"discord",chatAppId:e,agentId:t,useProdWorkspaceId:!0}),"buildDiscordWebhookUrl"),kor=o(e=>`https://discord.com/oauth2/authorize?client_id=${e}&scope=bot+applications.commands&permissions=0`,"buildDiscordInviteUrl"),Mor=o(()=>[{name:$f.ASK,description:"Ask the configured Budibase agent",contexts:[1],options:[{type:3,name:"message",description:"Message to send to the agent",required:!0}]},{name:$f.NEW,description:"Start a new conversation with the configured agent",contexts:[1],options:[{type:3,name:"message",description:"Optional opening message",required:!1}]}],"buildGlobalCommandPayload"),Uor=o(()=>[{name:$f.ASK,description:"Ask the configured Budibase agent",options:[{type:3,name:"message",description:"Message to send to the agent",required:!0}]},{name:$f.NEW,description:"Start a new conversation with the configured agent",options:[{type:3,name:"message",description:"Optional opening message",required:!1}]}],"buildGuildCommandPayload"),C4e=o(async({url:e,botToken:t,payload:r})=>{let n=await(0,x4e.default)(e,{method:"PUT",headers:{Authorization:`Bot ${t}`,"Content-Type":"application/json"},body:JSON.stringify(r)});if(!n.ok){let i=await n.text();throw new V(`Discord command sync failed (${n.status}): ${i||n.statusText}`,400)}},"syncCommandsOnEndpoint"),For=o(async(e,t,r)=>{await C4e({url:`${I4e}/applications/${e}/commands`,botToken:t,payload:Mor()}),await C4e({url:`${I4e}/applications/${e}/guilds/${r}/commands`,botToken:t,payload:Uor()})},"syncApplicationCommands"),Bor=o(({publicKey:e,signature:t,timestamp:r,rawBody:n})=>{try{let i="302a300506032b6570032100",s=t9.default.createPublicKey({key:Buffer.from(`${i}${e}`,"hex"),format:"der",type:"spki"});return t9.default.verify(null,new Uint8Array(Buffer.from(`${r}${n}`)),s,new Uint8Array(Buffer.from(t,"hex")))}catch{return!1}},"verifyDiscordSignature"),qor=o(()=>{let e=Number(process.env.DISCORD_SIGNATURE_MAX_AGE_SECONDS);return(Number.isFinite(e)&&e>0?e:Ior)*1e3},"getDiscordSignatureMaxAgeMs"),jor=o((e,t=Date.now())=>{let r=Number(e);if(!Number.isFinite(r))return!1;let n=r*1e3;return Math.abs(t-n)<=qor()},"isDiscordTimestampFresh"),Wor=o(async({instance:e,agentId:t})=>{let r=U.getProdWorkspaceID(e);return await C.doInWorkspaceContext(r,async()=>{let i=(await tk(t)).discordIntegration?.publicKey?.trim();if(!i)throw new V("Discord public key is not configured for this agent",400);return i})},"getDiscordPublicKeyForRoute");var n9={};$(n9,{buildMSTeamsWebhookUrl:()=>Vor,resolveChatAppForAgent:()=>Gor,validateMSTeamsIntegration:()=>$or});var $or=o(e=>{let t=e.MSTeamsIntegration;if(!t)throw new V("Teams integration is not configured for this agent",400);let r=t.appId?.trim(),n=t.appPassword?.trim();if(!r||!n)throw new V("Teams integration requires appId (client ID) and appPassword (client secret value)",400);return{appId:r,appPassword:n,tenantId:t.tenantId?.trim()||void 0,chatAppId:t.chatAppId?.trim()||void 0}},"validateMSTeamsIntegration"),Gor=o(async(e,t)=>await tM({agentId:e,chatAppId:t}),"resolveChatAppForAgent"),Vor=o(async(e,t)=>await rM({provider:"ms-teams",chatAppId:e,agentId:t,useProdWorkspaceId:!0}),"buildMSTeamsWebhookUrl");var o9={};$(o9,{buildLiteLLMParams:()=>zL,generateRows:()=>Qor,generateTables:()=>Hor});async function Hor(e){let t=[],r={};try{for(let i of e)for(let s of Object.values(i.schema).filter(a=>a.type==="link")){if(!e.find(a=>a.name===s.tableId))throw new Error(`Table ${s.tableId} not found in the json response.`);if(s.tableId===i.name)throw new Error(`Self-referential relationships are not supported. Table ${i.name} cannot link to itself.`)}let n=(await x.tables.getAllInternalTables()).map(i=>i.name);for(let i of e){let s=fe.getSequentialName(n,i.name,{separator:" "}),a=await x.tables.create({...i,name:s,schema:{},primaryDisplay:void 0,sourceType:"internal",sourceId:Nn,type:"table",aiGenerated:!0});t.push({id:a._id,name:i.name}),r[i.name]=a._id}for(let i of e)for(let s of Object.values(i.schema))s.type==="link"?s.tableId=r[s.tableId]:s.type==="formula"&&(s.formula=`{{ js "${Buffer.from(s.formula).toString("base64")}" }}`);for(let i of e){let s=await x.tables.getTable(r[i.name]),a={...s.schema,...i.schema};for(let u of Object.keys(a))a[u].aiGenerated=!0;await x.tables.update({...s,schema:a,primaryDisplay:i.primaryDisplay})}}catch(n){console.log("Error generating tables, cleaning up created tables",n);let i=await x.tables.getTables(t.map(s=>s.id));throw await Promise.all(i.map(x.tables.internal.destroy)),n}return t}o(Hor,"generateTables");async function Qor(e,t,r){let n={},i=[],s=[];for(let a of Object.keys(e)){let u=r[a],c={};for(let f of Object.values(u.schema).filter(d=>d.type==="link"))c[f.name]=null;let l=Object.values(u.schema).filter(f=>["attachment","attachment_single"].includes(f.type));s.push(...e[a].map(async f=>{await Kor(f,l);let d=u._id,p=await x.rows.save(d,{...f,...c,_id:void 0},t);n[d]??={},n[d][f._id]=p.row._id;let h=Object.keys(c).reduce((m,g)=>(f[g]&&(m[g]={tableId:u.schema[g].tableId,rowId:f[g]}),m),{});Object.keys(h).length&&i.push({tableId:p.table._id,rowId:p.row._id,data:h})}))}await Promise.all(s),await Promise.all(i.map(async a=>{let u=await x.rows.find(a.tableId,a.rowId),c=Object.keys(a.data).reduce((l,f)=>(l[f]=[...u[f]||[],...a.data[f].rowId.map(d=>n[a.data[f].tableId][d])],l),{});await x.rows.save(a.tableId,{...u,...c},t,{updateAIColumns:!1})}))}o(Qor,"generateRows");async function Kor(e,t){function r(n){return typeof n=="object"?Iqe(n):Oqe(n)}o(r,"processAttachment");for(let n of t)Array.isArray(e[n.name])?e[n.name]=await Promise.all(e[n.name].map(i=>r(i))):e[n.name]=await r(e[n.name])}o(Kor,"processAttachments");var jk={};$(jk,{deleteAgentFileChunks:()=>ZY,ingestAgentFile:()=>XY,queue:()=>X7,retrieveContextForAgent:()=>QZt});var s9={};$(s9,{create:()=>Jor,createVectorDb:()=>kv,fetch:()=>zor,find:()=>Yor,remove:()=>Zor,update:()=>Xor});async function zor(){return(await C.getWorkspaceDB().allDocs(Ze.getDocParams("vectordb",void 0,{include_docs:!0}))).rows.map(r=>r.doc).filter(r=>!!r)}o(zor,"fetch");async function Yor(e){let r=await C.getWorkspaceDB().tryGet(e);if(!(!r||r._deleted))return r}o(Yor,"find");async function Jor(e){let t=C.getWorkspaceDB(),r={_id:Ze.generateVectorDbID(),name:e.name,provider:e.provider,host:e.host,port:e.port,database:e.database,user:e.user,password:e.password},{rev:n}=await t.put(r);return r._rev=n,r}o(Jor,"create");async function Xor(e){if(!e._id||!e._rev)throw new V("id and rev required",400);let t=C.getWorkspaceDB(),r=await t.tryGet(e._id);if(!r)throw new V("Vector store config not found",404);let n=e.password===xi?r.password:e.password,i={...r,...e,password:n},{rev:s}=await t.put(i);return i._rev=s,i}o(Xor,"update");async function Zor(e){let t=C.getWorkspaceDB(),r=await t.get(e);await t.remove(r)}o(Zor,"remove");var c9={};$(c9,{create:()=>isr,fetch:()=>tsr,find:()=>nsr,get:()=>rsr,remove:()=>ssr,update:()=>osr});var D4e=B(require("lodash/cloneDeep"));var P4e="********";function xh(){return C.getWorkspaceDB()}o(xh,"getDb");function N4e(e){if(e==null)return e;let t=e.definition.steps,r=e.definition.trigger,n=[...t,r];e.live!=null&&delete e.live;for(let i of n)if(i!=null)for(let s of Object.keys(i.inputs||{})){let a=s;(!i.inputs[a]||i.inputs[a]==="")&&delete i.inputs[a]}return e}o(N4e,"cleanAutomationInputs");async function esr(e,t){let r=o((a,u)=>{let c=a.definition.steps.map(l=>l.id);return u.definition.steps.filter(l=>!c.includes(l.id))},"getNewSteps"),n=o((a,u)=>{let c=u.definition.steps.map(l=>l.id);return a.definition.steps.filter(l=>!c.includes(l.id))},"getDeletedSteps"),i=r(e,t);for(let a of i)await Le.automation.stepCreated(t,a);let s=n(e,t);for(let a of s)await Le.automation.stepDeleted(t,a)}o(esr,"handleStepEvents");async function tsr(){return(await xh().allDocs(Ac(null,{include_docs:!0}))).rows.filter(n=>!!n.doc).map(n=>n.doc).map(mA).map(gA)}o(tsr,"fetch");async function rsr(e){let r=await xh().get(e);return gA(mA(r))}o(rsr,"get");async function nsr(e,t){return(await xh().getMultiple(e,t)).map(mA).map(gA)}o(nsr,"find");async function isr(e){e=mA(e);let t=xh();e._id||(e._id=K2e()),e.type="automation",e=L4e(e),e=N4e(e),e=await u9({newAuto:e});let r=await t.put(e);await Le.automation.created(e);for(let n of e.definition.steps)await Le.automation.stepCreated(e,n);return e._rev=r.rev,e._id=r.id,gA(e)}o(isr,"create");async function osr(e){if(e=mA(e),!e._id||!e._rev)throw new V("_id or _rev fields missing",400);let t=xh(),r=await t.get(e._id);asr(e,r),e=L4e(e,r),e=N4e(e),e=await u9({oldAuto:r,newAuto:e});let n=await t.put(e);e._rev=n.rev;let i=r&&r.definition.trigger?r.definition.trigger:void 0,s=e&&e.definition.trigger?e.definition.trigger:void 0;return i&&i.id!==s?.id&&(await Le.automation.triggerUpdated(e),await QN("automationTestInput",e._id),await L7(e._id)),await esr(r,e),gA({...e,_rev:n.rev,_id:n.id})}o(osr,"update");async function ssr(e,t){let r=xh(),n=await r.get(e);await u9({oldAuto:n}),await QN("automationTestInput",e),await QN("automationTestHistory",e),await L7(e);let i=await r.remove(e,t);return await Le.automation.deleted(n),i}o(ssr,"remove");async function u9({oldAuto:e,newAuto:t}){let r=Ge.triggers.definitions.WEBHOOK.stepId,n=C.getWorkspaceId();if(!n)throw new Error("Unable to check webhooks - no app ID in context.");let i=e?e.definition.trigger:null,s=t?t.definition.trigger:null,a=i&&s&&i.id!==s.id;function u(c){return c&&c.definition.trigger&&c.definition.trigger.stepId===r}if(o(u,"isWebhookTrigger"),u(e)&&(!u(t)||a)&&i.webhookId)try{let l=await xh().get(i.webhookId);s&&(delete s.webhookId,s.inputs={}),await gu.webhook.destroy(l._id,l._rev)}catch{}if((!u(e)||a)&&u(t)){let l=(await gu.webhook.save(gu.webhook.newDoc("Automation webhook","automation",t._id)))._id;s.webhookId=l;let f=U.getProdWorkspaceID(n);s.inputs={schemaUrl:`api/webhooks/schema/${n}/${l}`,triggerUrl:`api/webhooks/trigger/${f}/${l}`}}return t}o(u9,"checkForWebhooks");function asr(e,t){let r=[e.definition.trigger,...e.definition.steps],n=[t.definition.trigger,...t.definition.steps];for(let i of r)Object.keys(i.schema.inputs.properties||{}).filter(a=>i.schema.inputs.properties[a].readonly).forEach(a=>{let u=a,c=n.find(l=>l.id===i.id);if(i.inputs[u]!==c?.inputs[u])throw new V(`Field ${u} is readonly and it cannot be modified`,400)})}o(asr,"guardInvalidUpdatesAndThrow");function mA(e){let r={...{_id:e._id,_rev:e._rev,definition:e.definition,screenId:e.screenId,uiTree:e.uiTree,appId:e.appId,live:e.live,name:e.name,internal:e.internal,type:e.type,disabled:e.disabled,testData:e.testData,createdAt:e.createdAt,updatedAt:e.updatedAt,layoutDirection:e.layoutDirection}};for(let n in r)Object.prototype.hasOwnProperty.call(e,n)||delete r[n];return r}o(mA,"trimUnexpectedObjectFields");function L4e(e,t){let r=e.definition?.trigger;if(!r||!jc(r)||!r.inputs||!usr(r.inputs.password))return e;if(!t||!jc(t.definition?.trigger))throw new V("IMAP password is required",400);let n=t.definition.trigger.inputs?.password;if(!n)throw new V("IMAP password is required",400);let i=(0,D4e.default)(e),s=i.definition?.trigger;if(!jc(s)||!s.inputs)throw new V("IMAP password is required",400);return s.inputs.password=n,i}o(L4e,"hydrateAutomationSecrets");function gA(e){let t=e.definition?.trigger;return jc(t)&&t.inputs?.password&&(t.inputs.password=P4e),e}o(gA,"maskAutomationSecrets");function usr(e){return e===xi||e===P4e}o(usr,"isMaskedPassword");var l9={};$(l9,{destroy:()=>fsr,newDoc:()=>csr,save:()=>lsr});function k4e(e){return e.startsWith(U.DocumentType.WEBHOOK)}o(k4e,"isWebhookID");function csr(e,t,r){return{live:!0,name:e,action:{type:t,target:r}}}o(csr,"newDoc");async function lsr(e){let t=C.getWorkspaceDB();e._id&&k4e(e._id)?await t.get(e._id):e._id=Z2e();let r=await t.put(e);return e._rev=r.rev,e}o(lsr,"save");async function fsr(e,t){let r=C.getWorkspaceDB();if(!e||!k4e(e))throw new Error("Provided webhook ID is not valid.");return await r.remove(e,t)}o(fsr,"destroy");var f9={};$(f9,{checkForCollectStep:()=>nF});var d9={};$(d9,{trigger:()=>dsr});async function dsr(e,t={},r){let i=await C.getWorkspaceDB().get(e);if(!i)throw new Error(`Automation with ID ${e} not found`);let s=i.definition?.trigger?.stepId;if(s!=="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: ${s}`);if(x.automations.utils.checkForCollectStep(i)&&await Xi.isSyncAutomationsEnabled()){let u=await kc(i,{fields:t,timeout:r?r*1e3:ne.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=C.getWorkspaceId();return await kc(i,{fields:t,appId:u}),{message:`Automation ${i._id} has been triggered.`,automation:i}}}o(dsr,"trigger");var gu={...c9,webhook:l9,utils:f9,execution:d9};var h9={};$(h9,{exportApp:()=>q4e,exportDB:()=>B4e,streamExportApp:()=>gsr});var M4e=require("dd-trace"),p9=B(require("fs")),Uc=B(require("fs/promises")),Uf=require("path"),U4e=B(require("tar")),F4e=require("uuid");var Ib="db.txt",nM="global.txt",iM="attachments";var psr=require("memorystream");async function hsr(e,t){let r=`${(0,F4e.v4)()}.tar.gz`,n=(0,Uf.join)(iu(),r);return await U4e.create({gzip:!0,file:n,noDirRecurse:!1,cwd:e},t),n}o(hsr,"tarFilesToTmp");async function B4e(e,t={}){let r={filter:t?.filter,batch_size:1e3,batch_limit:5,style:"main_only"};return U.doWithDB(e,async n=>{if(t?.exportPath){let i=t?.exportPath,s=p9.default.createWriteStream(i);return await n.dump(s,r),i}else{let i=new psr,s="";return i.on("data",a=>{s+=a.toString()}),await n.dump(i,r),s}})}o(B4e,"exportDB");function msr(e){let t=[BN,W2e,G2e];return e&&t.push($2e),r=>!t.map(n=>r._id.includes(n)).reduce((n,i)=>n||i)}o(msr,"defineFilter");async function q4e(e,t){return await M4e.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=U.getProdWorkspaceID(e),i=`${n}/`,s=[/\/\..+/];t?.excludeRows&&s.push(/\/attachments\/.*/);let a=await ge.retrieveDirectory(mr.APPS,i,s);r.addTags({prodAppId:n,tmpPath:a});let u=(0,Uf.join)(a,i);if(p9.default.existsSync(u)){let l=await Uc.default.readdir(u);for(let f of l){let d=(0,Uf.join)(u,f);await Uc.default.rename(d,(0,Uf.join)(u,"..",f))}await Uc.default.rmdir(u)}let c=(0,Uf.join)(a,Ib);if(await B4e(e,{filter:msr(t?.excludeRows),exportPath:c}),t?.encryptPassword){let l=o(async(f,d="")=>{for(let p of await Uc.default.readdir(f)){let h=(0,Uf.join)(f,p),m=d?(0,Uf.join)(d,p):p;if(p!==iM){let g=await Uc.default.lstat(h);g.isFile()?(await $n.encryptFile({dir:f,filename:p},t.encryptPassword),await Uc.default.rm(h)):g.isDirectory()&&await l(h,m)}}},"processDirectory");await l(a)}if(t?.tar){let l=await hsr(a,await Uc.default.readdir(a));return await Uc.default.rm(a,{recursive:!0,force:!0}),l}else return a})}o(q4e,"exportApp");async function gsr({appId:e,excludeRows:t,encryptPassword:r}){let n=await q4e(e,{excludeRows:t,tar:!0,encryptPassword:r});return zqe(n)}o(gsr,"streamExportApp");var m9={};$(m9,{getGlobalDBFile:()=>wsr,getListOfAppsInMulti:()=>Esr,importApp:()=>Ssr,untarFile:()=>V4e,updateAttachmentColumns:()=>G4e});var Cb=B(require("fs")),yu=B(require("fs/promises")),Ff=require("path"),W4e=B(require("tar")),$4e=require("uuid");function j4e(e,t){let r=t.key?.split("/")||[];r.shift(),r.unshift(e);let n=r.join("/");return{...t,key:n,url:""}}o(j4e,"rewriteAttachmentUrl");async function G4e(e,t){let r=await x.tables.getAllInternalTables(t),n=[];for(let i of r){let{rows:s,columns:a}=await x.rows.getRowsWithAttachments(t.name,i);n=n.concat(s.map(u=>{for(let c of a){let l=i.schema[c].type;l==="attachment"&&Array.isArray(u[c])?u[c]=u[c].map(f=>j4e(e,f)):(l==="attachment_single"||l==="signature_single")&&u[c]&&(u[c]=j4e(e,u[c]))}return u}))}await t.bulkDocs(n)}o(G4e,"updateAttachmentColumns");async function ysr(e,t){let r=(await t.allDocs(Ac(null,{include_docs:!0}))).rows.map(s=>s.doc),n=U.getDevWorkspaceID(e),i=[];for(let s of r){let a=s.appId,u=U.getProdWorkspaceID(s.appId);if(s.definition.trigger?.stepId==="WEBHOOK"){let c=s.definition.trigger.inputs;s.definition.trigger.inputs={schemaUrl:c.schemaUrl.replace(a,n),triggerUrl:c.triggerUrl.replace(u,e)}}s.appId=n,i.push(s)}await t.bulkDocs(i)}o(ysr,"updateAutomations");async function bsr(e){if(e.file&&e.file.type!=="text/plain")throw new Error("Cannot import a non-text based file.");if(e.file)return Cb.default.createReadStream(e.file.path);if(e.key){let[t,r]=e.key.split("/"),n=await ije(t,r);return Cb.default.createReadStream((0,Ff.join)(n,r,"db","dump.txt"))}else throw new Error("Either file or key is required.")}o(bsr,"getTemplateStream");async function V4e(e){let t=(0,Ff.join)(iu(),(0,$4e.v4)());return await yu.default.mkdir(t),await W4e.extract({cwd:t,file:e.path}),t}o(V4e,"untarFile");async function _sr(e,t){try{let r=o(async n=>{for(let i of await yu.default.readdir(n)){let s=(0,Ff.join)(n,i);if(!s.endsWith(iM)){let a=await yu.default.lstat(s);if(a.isFile()&&s.endsWith(".enc")){let u=s.replace(/\.enc$/,"");await $n.decryptFile(s,u,t),await yu.default.rm(s)}else a.isDirectory()&&await r(s)}}},"processDirectory");await r(e)}catch(r){throw r.message==="incorrect header check"?new Error("File cannot be imported"):r}}o(_sr,"decryptFiles");function wsr(e){return Cb.default.readFileSync((0,Ff.join)(e,nM),"utf8")}o(wsr,"getGlobalDBFile");function Esr(e){return Cb.default.readdirSync(e).filter(t=>t!==nM)}o(Esr,"getListOfAppsInMulti");async function Ssr(e,t,r,n={updateAttachmentColumns:!0}){let i=U.getProdWorkspaceID(e),s,a=r.file&&r?.file?.type?.endsWith("gzip"),u=r.file&&(await yu.default.lstat(r.file.path)).isDirectory(),c;if(r.file&&(a||u)){c=a?await V4e(r.file):r.file.path,a&&r.file.password&&await _sr(c,r.file.password);let f=await yu.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===Ib))throw new Error("App export does not appear to be valid - no DB file found.");{let m=[],g=[nM,Ib];for(let w of f){let E=(0,Ff.join)(c,w);g.includes(w)||(w=(0,Ff.join)(i,w),(await yu.default.lstat(E)).isDirectory()?m.push(ge.uploadDirectory(mr.APPS,E,w)):m.push(ge.upload({bucket:mr.APPS,path:E,filename:w})))}await Promise.all(m);let y=await yu.default.readdir(c,{recursive:!0}),b=[];await We.parallelForeach(ge.listAllObjects(ge.ObjectStoreBuckets.APPS,i),async w=>{w.Key&&!y.includes(w.Key.replace(new RegExp(`^${i}/`),""))&&b.push(w.Key)},5),b.length&&await ge.deleteFiles(ge.ObjectStoreBuckets.APPS,b)}s=Cb.default.createReadStream((0,Ff.join)(c,Ib))}else s=await bsr(r);let{ok:l}=await t.load(s);if(!l)throw"Error loading database dump from template.";return n.updateAttachmentColumns&&await G4e(i,t),await ysr(i,t),c&&await yu.default.rm(c,{recursive:!0,force:!0}),l}o(Ssr,"importApp");var g9={};$(g9,{calculateAutomationCount:()=>Q4e,calculateBackupStats:()=>Tsr,calculateDatasourceCount:()=>H4e,calculateScreenCount:()=>K4e});async function oM(e,t,r){if(r)return t(r);{let n=U.getDevWorkspaceID(e);return C.doInWorkspaceContext(n,()=>{let i=C.getWorkspaceDB();return t(i)})}}o(oM,"runInContext");async function H4e(e,t){return oM(e,async r=>{let n=await r.allDocs(jT()),i=await r.allDocs(Ef());return n.rows.length+i.rows.length},t)}o(H4e,"calculateDatasourceCount");async function Q4e(e,t){return oM(e,async r=>(await r.allDocs(Ac())).rows.length,t)}o(Q4e,"calculateAutomationCount");async function K4e(e,t){return oM(e,async r=>(await x.screens.fetch(r)).length,t)}o(K4e,"calculateScreenCount");async function Tsr(e){return oM(e,async t=>{let r=[];r.push(H4e(e,t)),r.push(Q4e(e,t)),r.push(K4e(e,t));let n=await Promise.all(r);return{datasources:n[0],automations:n[1],screens:n[2]}})}o(Tsr,"calculateBackupStats");var y9={};$(y9,{clearErrors:()=>vsr});async function vsr(e){let t=C.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 Ue.workspace.invalidateWorkspaceMetadata(r.appId,r)}o(vsr,"clearErrors");var sM={...h9,...m9,...g9,...y9};var b9={};$(b9,{getSourceType:()=>Asr});function Asr(e){if(As(e))return"table";if(an(e))return"view";if(nm(e))return"datasource";if(Mre(e))return"query";throw new Error(`Unknown source type for source "${e}"`)}o(Asr,"getSourceType");function z4e(e,t){return!e.disabled&&t?"published":"disabled"}o(z4e,"getPublishedState");async function Y4e(){let e=C.getProdWorkspaceId(),t=await x.workspaces.isWorkspacePublished(e),r={automations:[],workspaceApps:[],screens:[],tables:[]},n={automations:[],workspaceApps:[],screens:[],tables:[]},i=o(async h=>{let[m,g,y,b]=await Promise.all([x.automations.fetch(),x.workspaceApps.fetch(),x.screens.fetch(),x.tables.getAllInternalTables()]);h.automations=m,h.workspaceApps=g,h.screens=y,h.tables=b},"updateState");await C.doInWorkspaceContext(C.getDevWorkspaceId(),async()=>i(r));let s;t&&(s=await x.workspaces.metadata.tryGet({production:!0}),await C.doInWorkspaceContext(C.getProdWorkspaceId(),async()=>i(n)));let a=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=o((h,m,g)=>{let y=g._id,b=s?.resourcesPublishedAt?.[y],w=m.has(y)||!!b;h[y]={published:w,name:g.name,publishedAt:b,unpublishedChanges:!b||g.updatedAt>b,state:z4e(g,b)}},"processResource"),f={};for(let h of r.automations)l(f,a,h);let d={};for(let h of r.tables)l(d,c,h);let p={};for(let h of r.workspaceApps){let m=s?.resourcesPublishedAt?.[h._id],g=r.screens.filter(y=>y.workspaceAppId===h._id);p[h._id]={published:u.has(h._id),name:h.name,publishedAt:m,unpublishedChanges:!m||!!g.find(y=>y.updatedAt>m),state:z4e(h,m)}}return{automations:f,workspaceApps:p,tables:d}}o(Y4e,"status");var J4e={status:Y4e};var _9={};$(_9,{create:()=>Osr,fetch:()=>Rsr,findByResourceId:()=>Csr,remove:()=>Isr});async function Rsr(e){return(await C.getWorkspaceDB().find({selector:{_id:{$regex:`^workspace_favourite${ue}`},...e?{createdBy:e}:{}}})).docs}o(Rsr,"fetch");async function Osr(e){let r=await C.getWorkspaceDB().put({_id:U.generateWorkspaceFavouriteID(),...e});return{...e,_id:r.id,_rev:r.rev}}o(Osr,"create");async function Isr(e,t){return await C.getWorkspaceDB().remove(e,t)}o(Isr,"remove");async function Csr(e){return(await C.getWorkspaceDB().find({selector:{_id:{$regex:`^workspace_favourite${ue}`},resourceId:e},limit:1})).docs}o(Csr,"findByResourceId");var w9={};$(w9,{fetch:()=>xsr,fetchWithDocument:()=>Dsr});async function xsr(e){if(!As(e))throw new Error(`Invalid tableId: ${e}`);let t=C.getWorkspaceDB(),r={startkey:[e],endkey:[e,{}]};return(await t.query(qT(vc.LINK),r)).rows.map(i=>i.value)}o(xsr,"fetch");async function Dsr(e){if(!As(e))throw new Error(`Invalid tableId: ${e}`);let t=C.getWorkspaceDB(),r={startkey:[e],endkey:[e,{}],include_docs:!0};return(await t.query(qT(vc.LINK),r)).rows.map(i=>i.doc)}o(Dsr,"fetchWithDocument");var X4e={...w9};var E9={};$(E9,{addLink:()=>Psr,deleteLink:()=>Nsr,update:()=>Lsr});async function Psr({label:e,url:t,roleId:r,workspaceAppId:n}){let i=await x.workspaceApps.get(n);if(!i)throw new V("Workspace app should be defined",500);i.navigation.links??=[],i.navigation.links.push({text:e,url:t,roleId:r,type:"link"}),await x.workspaceApps.update(i)}o(Psr,"addLink");async function Nsr(e,t){let r=await x.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(s=>s.url!==e))}),await x.workspaceApps.update({...r,navigation:{...r.navigation,links:n}})}o(Nsr,"deleteLink");async function Lsr(e,t){let r=await x.workspaceApps.get(e);if(!r)throw new V("Workspace app not found",400);await x.workspaceApps.update({...r,navigation:t})}o(Lsr,"update");var S9={};$(S9,{cleanStoredToken:()=>$sr,create:()=>ksr,fetch:()=>eQe,get:()=>aM,getLastUsages:()=>Wsr,getToken:()=>qsr,remove:()=>Usr,update:()=>Msr,validateConfig:()=>jsr});async function Z4e(e,t){if((await eQe()).find(n=>n.name===e&&n._id!==t))throw new V(`OAuth2 config with name '${e}' is already taken.`,400)}o(Z4e,"guardName");async function eQe(){return(await C.getWorkspaceDB().allDocs(Ze.getOAuth2ConfigParams(null,{include_docs:!0}))).rows.map(n=>({...n.doc,_id:n.doc._id,_rev:n.doc._rev}))}o(eQe,"fetch");async function ksr(e){let t=C.getWorkspaceDB();await Z4e(e.name);let r=await t.put({_id:`oauth2${ue}${Je.newid()}`,...e});return{_id:r.id,_rev:r.rev,...e}}o(ksr,"create");async function aM(e){return await C.getWorkspaceDB().tryGet(e)}o(aM,"get");async function Msr(e){let t=C.getWorkspaceDB();await Z4e(e.name,e._id);let r=await aM(e._id);if(!r)throw new V(`OAuth2 config with id '${e._id}' not found.`,404);let n={...e,clientSecret:e.clientSecret===xi?r.clientSecret:e.clientSecret},i=await t.put(n);return await tQe(e._id),{...n,_rev:i.rev}}o(Msr,"update");async function Usr(e,t){let r=C.getWorkspaceDB();try{await r.remove(e,t)}catch(i){throw i.status===404?new V(`OAuth2 config with id '${e}' not found.`,404):i}await tQe(e);let n=await r.tryGet(Ze.generateOAuth2LogID(e));n&&await r.remove(n)}o(Usr,"remove");async function tQe(e){let t=Ue.CacheKey.OAUTH2_TOKEN(e);await Ue.destroy(t)}o(tQe,"cleanCache");var rQe=require("koa"),nQe=B(require("node-fetch"));var{DocWritethrough:Fsr}=Ue.docWritethrough;async function iQe(e){e=await eVe(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,nQe.default)(e.url,t)}o(iQe,"fetchToken");var Bsr=o(async e=>{await new Fsr(C.getWorkspaceDB(),Ze.generateOAuth2LogID(e)).patch({lastUsage:Date.now()})},"trackUsage");async function qsr(e){let t=await Ue.withCacheWithDynamicTTL(Ue.CacheKey.OAUTH2_TOKEN(e),async()=>{let r=await aM(e);if(!r)throw new rQe.HttpError(`oAuth config ${e} count not be found`);let n=await iQe(r),i=await n.json();if(!n.ok){let u=i.error_description??n.statusText;throw new Error(`Error fetching oauth2 token: ${u}`)}let s=`${i.token_type} ${i.access_token}`,a=i.expires_in??-1;return{value:s,ttl:a}});return await Bsr(e),t}o(qsr,"getToken");async function jsr(e){try{let t=await iQe(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}}}o(jsr,"validateConfig");async function Wsr(e){let t=await C.getWorkspaceDB().getMultiple(e.map(Ze.generateOAuth2LogID),{allowMissing:!0}),r=await C.getProdWorkspaceDB().getMultiple(e.map(Ze.generateOAuth2LogID),{allowMissing:!0});return e.reduce((i,s)=>{let a=t.find(c=>c._id===Ze.generateOAuth2LogID(s));a&&(i[s]=a.lastUsage);let u=r.find(c=>c._id===Ze.generateOAuth2LogID(s));return u&&(!i[s]||i[s]<u.lastUsage)&&(i[s]=u.lastUsage),i},{})}o(Wsr,"getLastUsages");async function $sr(e){await Ue.destroy(Ue.CacheKey.OAUTH2_TOKEN(e),{useTenancy:!0})}o($sr,"cleanStoredToken");var v9={};$(v9,{enrichArrayContext:()=>aQe,enrichContext:()=>T9,fetch:()=>Hsr,find:()=>Vsr});function oQe(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}o(oQe,"updateSchema");function Gsr(e){return e.map(t=>oQe(t))}o(Gsr,"updateSchemas");function sQe(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]}o(sQe,"enrichQueries");async function Vsr(e){let t=C.getWorkspaceDB(),r=C.getWorkspaceId(),n=sQe(await t.get(e));return _f(r)&&(delete n.fields,delete n.parameters),oQe(n)}o(Vsr,"find");async function Hsr(e={enrich:!0}){let n=(await C.getWorkspaceDB().allDocs(G8(null,{include_docs:!0}))).rows.map(i=>i.doc);return e.enrich&&(n=await sQe(n)),Gsr(n)}o(Hsr,"fetch");async function aQe(e,t={}){let r={};for(let s in e)r[s]=e[s];let n=await T9(r,t),i=[];for(let[s,a]of Object.entries(n))i[parseInt(s)]=a;return i}o(aQe,"enrichArrayContext");async function T9(e,t={}){let r={};if(!e||!t)return r;if(Array.isArray(e))return aQe(e,t);let n=await Nc(),i={...t,env:n};for(let s of Object.keys(e))e[s]!=null&&(typeof e[s]=="object"?r[s]=await T9(e[s],i):typeof e[s]=="string"?r[s]=nr(e[s],i,{noEscaping:!0,noHelpers:!0,escapeNewlines:!0}):r[s]=e[s]);if(r.json||r.customData||r.requestBody){try{r.json=JSON.parse(r.json||r.customData||r.requestBody)}catch{}delete r.customData}return r}o(T9,"enrichContext");var uQe={...v9};var R9={};$(R9,{duplicateResourcesToWorkspace:()=>car,getResourcesInfo:()=>Qsr});var fQe=B(require("lodash/chunk"));async function Qsr(){let e=await x.automations.fetch(),t=await x.workspaceApps.fetch(),r={},n=[],i=await x.tables.getAllInternalTables(),s=await x.rowActions.getAll();n.push(...i.map(d=>({id:d._id,idToSearch:d._id,name:d.name,type:"table"})));let a=await x.datasources.fetch();n.push(...a.filter(d=>d._id!==Nn).map(d=>({id:d._id,idToSearch:d._id,name:d.name,type:"datasource"}))),n.push(...e.map(d=>({id:d._id,idToSearch:d._id,name:d.name,type:"automation"})));let u=await x.queries.fetch();if(n.push(...u.map(d=>({id:d._id,idToSearch:d._id,name:d.name,type:"query"}))),s.length){let d=await x.rowActions.getNames(Object.values(s).flatMap(p=>Object.values(p.actions)));for(let p of s){let h=Object.entries(p.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(p.actions))for(let y of[m,nqe(p._id)])n.push({id:p._id,idToSearch:y,name:d[g.automationId],type:"row_action",extraDependencies:h})}}let c=o((d,p)=>{let h=JSON.stringify(p);r[d]??={dependencies:[]};for(let m of n)if(h.includes(m.idToSearch)&&!r[d].dependencies.find(g=>g.id===m.id)){r[d].dependencies.push({id:m.id,name:m.name,type:m.type});let g=[...m.extraDependencies||[],...r[m.id]?.dependencies||[]].filter(({id:y})=>!r[d].dependencies.some(b=>b.id===y));r[d].dependencies.push(...g)}},"searchForUsages");for(let d of i)c(d._id,d);for(let d of e)c(d._id,d);for(let d of u)c(d._id,d);let l=await x.screens.fetch(),f={};for(let d of l)d.workspaceAppId&&(f[d.workspaceAppId]||(f[d.workspaceAppId]=[]),f[d.workspaceAppId].push(d));for(let d of t){let p=f[d._id]||[];r[d._id]??={dependencies:[]},r[d._id].dependencies.push(...p.map(h=>({id:h._id,name:h.name,type:"screen"})));for(let h of p)c(d._id,h)}for(let d of Object.values(r).flatMap(p=>p.dependencies).filter(p=>p.type==="row_action")){let p=s.find(h=>h._id===d.id);if(p)for(let h of Object.values(p.actions)){if(r[d.id]?.dependencies.some(g=>g.id===h.automationId))continue;let m=e.find(g=>g._id===h.automationId);m&&(r[d.id]??={dependencies:[]},r[d.id].dependencies.push({id:m._id,name:m.name,type:"automation"}))}}return r}o(Qsr,"getResourcesInfo");async function Ksr(e){let t=U.getDB(U.getDevWorkspaceID(e),{skip_setup:!0});if(!await t.exists())throw new V("Destination workspace does not exist",400);return t}o(Ksr,"getDestinationDb");var zsr={datasource:Yn("datasource"),table:Yn("ta"),row_action:Yn("ra"),query:Yn("query"),automation:Yn("au"),workspace_app:Yn("workspace_app"),screen:Yn("screen")};function cM(e){return Object.entries(zsr).find(([r,n])=>e.startsWith(n))?.[0]}o(cM,"getResourceType");function cQe(e){return e._id?cM(e._id)==="automation":!1}o(cQe,"isAutomation");function Ysr(e){return e._id?cM(e._id)==="workspace_app":!1}o(Ysr,"isWorkspaceApp");function Jsr(e){return e._id?cM(e._id)==="table":!1}o(Jsr,"isTable");var Xsr=new Set(["attachment","attachment_single","signature_single"]),Zsr=o(e=>!!e?.type&&Xsr.has(e.type),"isAttachmentColumn"),ear=o(e=>e.schema?Object.entries(e.schema).filter(([,t])=>Zsr(t)).map(([t,r])=>({field:t,type:r.type})):[],"getAttachmentColumns"),tar=o((e,t,r)=>{if(!e?.startsWith(`${t}/`)||t===r)return e;let n=e.slice(t.length);return`${r}${n}`},"buildDestinationAttachmentKey");async function rar(e,t,r){if(!e||e===t)return e;r.has(e)||r.set(e,(async()=>{try{if(await ge.objectExists(mr.APPS,t))return t}catch(i){Ne.logWarn("Resource duplication: failed to check attachment existence",{err:i,key:e,destinationKey:t})}try{let{stream:i,contentType:s}=await ge.getReadStream(mr.APPS,e);return await ge.streamUpload({bucket:mr.APPS,stream:i,filename:t,type:s}),t}catch(i){Ne.logWarn("Resource duplication: failed to copy attachment",{err:i,key:e,destinationKey:t});return}})());let n=await r.get(e);return n===void 0&&r.delete(e),n}o(rar,"copyAttachmentToWorkspace");async function lQe(e,t){if(!e?.key||!t.sourceProdWorkspaceId||!t.destinationProdWorkspaceId||t.sourceProdWorkspaceId===t.destinationProdWorkspaceId)return e;let r=tar(e.key,t.sourceProdWorkspaceId,t.destinationProdWorkspaceId);if(!r||r===e.key)return e;let n=await rar(e.key,r,t.cache);return n?{...e,key:n,url:""}:e}o(lQe,"remapAttachmentValue");async function nar(e,t,r){if(!t.length)return;let n=e;for(let i of t){let s=n[i.field];if(s)if(i.type==="attachment"&&Array.isArray(s)){let a=[];for(let u of s){let c=await lQe(u,r);a.push(c)}n[i.field]=a}else(i.type==="attachment_single"||i.type==="signature_single")&&s&&(n[i.field]=await lQe(s,r))}}o(nar,"remapRowAttachments");var uM=1e3,iar=250,A9=3,oar=o(e=>new Promise(t=>setTimeout(t,e)),"delay");async function sar(e,t){let r=C.getWorkspaceDB(),n={include_docs:!0,limit:uM+(t?1:0)};t&&(n.startkey=t,n.skip=1);let s=(await r.allDocs(tn(e,null,n))).rows.map(c=>c.doc).filter(c=>!!c),a=s.length>uM?s.slice(0,uM):s,u=a.length===uM?a[a.length-1]._id:void 0;return{rows:a,nextStartAfter:u}}o(sar,"fetchTableRowsPage");async function aar(e,t){let r=(0,fQe.default)(t,iar);for(let n of r){let i=n,s=0;for(;i.length&&s<A9;){s++;let a=await e.bulkDocs(i),u=[];if(a.forEach((c,l)=>{c.error&&u.push(i[l])}),!u.length)break;if(s>=A9)throw new Error(`Failed to copy ${u.length} row(s) after ${A9} attempts.`);await oar(s*250),i=u}}}o(aar,"bulkInsertRows");async function uar(e,t,r,n){if(!e.length)return;let i=U.getProdWorkspaceID(r),s=U.getProdWorkspaceID(n),a=new Map;for(let u of e){if(u.sourceId!==Nn)continue;if(!!(await t.allDocs(tn(u._id,null,{include_docs:!1,limit:1}))).rows.length){Ne.logWarn("Resource duplication: destination table already contains rows, skipping copy",{tableId:u._id,tableName:u.name});continue}let l=ear(u),f;do{let{rows:d,nextStartAfter:p}=await sar(u._id,f);if(f=p,!d.length)break;let h=[];for(let m of d){await nar(m,l,{sourceProdWorkspaceId:i,destinationProdWorkspaceId:s,cache:a});let g={...m,fromWorkspace:r};delete g._rev,delete g.createdAt,delete g.updatedAt,h.push(g)}await aar(t,h)}while(f)}}o(uar,"duplicateInternalTableRows");async function car(e,t,r){e=Array.from(new Set(e).keys());let n=await Ksr(t),i=await n.getMultiple(e,{allowMissing:!0}),s=new Set(i.map(p=>p._id)),a=e.filter(p=>!s.has(p)),u=await C.getWorkspaceDB().getMultiple(e,{allowMissing:!1}),c=u.filter(p=>p._id&&a.includes(p._id)),l=C.getWorkspaceId();if(!l)throw new Error("Could not get workspaceId");if(c.length&&await n.bulkDocs(c.map(p=>{let h={...p,fromWorkspace:l};return delete h._rev,delete h.createdAt,delete h.updatedAt,(cQe(h)||Ysr(h))&&(h.disabled=!0),cQe(h)&&(h.appId=t),h})),(r?.copyRows??!0)&&await uar(u.filter(Jsr),n,l,t),!c.length)return;let f=(await x.workspaces.metadata.tryGet())?.name||l,d=await C.doInContext(t,async()=>(await x.workspaces.metadata.tryGet())?.name||t);for(let p of c){let h,m;switch(cM(p._id)){case"automation":h=p.name,m="Automation";break;case"datasource":h=p.name||"Unknown",m="Datasource";break;case"query":h=p.name,m="Query";break;case"row_action":h=p._id,m="Row action";break;case"table":h=p.name,m="Table";break;case"screen":h=p.name||"Unkown",m="Screen";break;case"workspace_app":h=p.name,m="App";break;case void 0:throw new Error("Resource type could not be infered");default:throw new Error("Unreachable")}let y={id:p._id,name:h,type:m};await Le.resource.duplicatedToWorkspace({resource:y,fromWorkspace:f,toWorkspace:d})}}o(car,"duplicateResourcesToWorkspace");var O9={};$(O9,{create:()=>far,deleteAll:()=>par,deleteAllForDatasource:()=>Ear,docExists:()=>har,get:()=>dQe,getAll:()=>dar,getAllForTable:()=>lM,getNames:()=>hQe,remove:()=>_ar,run:()=>war,setTablePermission:()=>mar,setViewPermission:()=>yar,unsetTablePermission:()=>gar,unsetViewPermission:()=>bar});async function lar(e,t,r){let n=await hQe(Object.values(e.actions));if(t=t.toLowerCase().trim(),Object.entries(n).find(([i,s])=>s.toLowerCase().trim()===t&&i!==r))throw new V("A row action with the same name already exists.",409)}o(lar,"ensureUniqueAndThrow");async function far(e,t){let r={name:t.name.trim()},n=C.getWorkspaceDB(),i=$N(e),s=await n.tryGet(i);s||(s={_id:i,actions:{}}),await lar(s,r.name);let a=C.getWorkspaceId();if(!a)throw new Error("Could not get the current appId");let u=`row_action${ue}${Je.newid()}`,c=await gu.create({name:r.name,appId:a,definition:{trigger:{id:"trigger",...Ge.triggers.definitions.ROW_ACTION,stepId:"ROW_ACTION",inputs:{tableId:e,rowActionId:u}},steps:[]}});return s.actions[u]={automationId:c._id,permissions:{table:{runAllowed:!0},views:{}}},await n.put(s),{id:u,name:c.name,...s.actions[u]}}o(far,"create");async function dQe(e,t){let n=(await lM(e))?.actions[t];if(!n)throw new V(`Row action '${t}' not found in '${e}'`,400);return n}o(dQe,"get");async function lM(e){let t=C.getWorkspaceDB(),r=$N(e);return await t.tryGet(r)}o(lM,"getAllForTable");async function dar(){return(await C.getWorkspaceDB().allDocs(Ze.getDocParams("ra",void 0,{include_docs:!0}))).rows.map(t=>t.doc)}o(dar,"getAll");async function par(e){let t=C.getWorkspaceDB(),r=await lM(e);if(!r)return;let n=Object.values(r.actions).map(s=>s.automationId),i=await t.getMultiple(n);for(let s of i)await x.automations.remove(s._id,s._rev);await t.remove(r)}o(par,"deleteAll");async function har(e){let t=C.getWorkspaceDB(),r=$N(e);return await t.exists(r)}o(har,"docExists");async function yA(e,t,r){let n=await lM(e);if(!n?.actions[t])throw new V(`Row action '${t}' not found in '${e}'`,400);let s=await r(n);return await C.getWorkspaceDB().put(s),{id:t,...s.actions[t]}}o(yA,"updateDoc");async function pQe(e,t){let r;if(an(t)&&(r=await x.views.get(t)),!r||r.tableId!==e)throw new V(`View '${t}' not found in '${e}'`,400)}o(pQe,"guardView");async function mar(e,t){return await yA(e,t,async r=>(r.actions[t].permissions.table.runAllowed=!0,r))}o(mar,"setTablePermission");async function gar(e,t){return await yA(e,t,async r=>(r.actions[t].permissions.table.runAllowed=!1,r))}o(gar,"unsetTablePermission");async function yar(e,t,r){return await pQe(e,r),await yA(e,t,async n=>(n.actions[t].permissions.views[r]={runAllowed:!0},n))}o(yar,"setViewPermission");async function bar(e,t,r){return await pQe(e,r),await yA(e,t,async n=>(delete n.actions[t].permissions.views[r],n))}o(bar,"unsetViewPermission");async function _ar(e,t){return await yA(e,t,async r=>{let{automationId:n}=r.actions[t],i=await gu.get(n);return await gu.remove(i._id,i._rev),delete r.actions[t],r})}o(_ar,"remove");async function war(e,t,r,n){let i=await x.tables.getTable(e);if(!i)throw new V("Table not found",404);let{automationId:s}=await dQe(e,t),a=await x.automations.get(s),u=await x.rows.find(e,r);await kc(a,{fields:{id:u._id,revision:u._rev,row:u,table:i},user:n,appId:C.getWorkspaceId()},{getResponses:!0})}o(war,"run");async function hQe(e){return(await x.automations.find(e.map(({automationId:n})=>n))).reduce((n,i)=>(n[i._id]=i.name,n),{})}o(hQe,"getNames");async function Ear(e){let r=(await x.tables.getAllTables()).filter(n=>n.sourceId===e);for(let n of Object.values(r))await x.rowActions.deleteAll(n._id)}o(Ear,"deleteAllForDatasource");var C9={};$(C9,{FIND_LIMIT:()=>I9,getRowsWithAttachments:()=>Tar});var I9=25;function Sar(e,t,r){let n={selector:{$or:t.map(i=>({[i]:{$exists:!0}})),_id:{$regex:`^ro${wt}${e}`}},limit:I9};return r&&(n.bookmark=r),n}o(Sar,"generateAttachmentFindParams");async function Tar(e,t){let r=U.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,s=0,a=[];do{let u=Sar(t._id,n,i),c=await r.find(u);i=c.bookmark,s=c.docs.length;let l=c.docs;a=a.concat(l)}while(s===I9);return{rows:a,columns:n}}o(Tar,"getRowsWithAttachments");var D9={};$(D9,{find:()=>Car,getAllInternalRows:()=>Oar,save:()=>Iar});var bA={};$(bA,{find:()=>Rar,getRow:()=>x9,save:()=>Aar});var mQe=B(require("lodash/fp/cloneDeep"));async function x9(e,t,r){let n;return typeof e=="string"?an(e)?n=await x.views.get(e):n=await x.tables.getTable(e):n=e,((await Ii("READ",n,{id:Dn(t),includeSqlRelationships:r?.relationships?1:0}))?.rows||[])[0]}o(x9,"getRow");async function Aar(e,t,r){let{tableId:n,viewId:i}=Oh(e),s;if(i?s=await x.views.get(i):s=await x.tables.getTable(n),x.views.isView(s)&&fe.views.isCalculationView(s))throw new V("Cannot insert rows through a calculation view",400);let a=await fa(r,(0,mQe.default)(s),t),u=await x.rows.utils.validate({row:a,source:s});if(!u.valid)throw{validation:u.errors};let c=await Ii("CREATE",s,{row:a}),l=c.row._id;if(l){let f=await x9(s,l,{relationships:!0});return{...c,row:await zt(s,f,{preserveLinks:!0,squash:!0})}}else return c}o(Aar,"save");async function Rar(e,t){let{tableId:r,viewId:n}=Oh(e),i;n?i=await x.views.get(n):i=await x.tables.getTable(r);let s=await x9(i,t,{relationships:!0});if(!s)throw new V("Row not found",404);return await zt(i,s,{squash:!0,preserveLinks:!0})}o(Rar,"find");async function Oar(e){let t;return e?t=U.getDB(e):t=C.getWorkspaceDB(),(await t.allDocs(tn(null,null,{include_docs:!0}))).rows.map(n=>n.doc)}o(Oar,"getAllInternalRows");function gQe(e){let t=e;return an(e)&&(t=Kr(e)),Pt(t)?bA:u7}o(gQe,"pickApi");async function Iar(e,t,r,n){return gQe(e).save(e,t,r,n)}o(Iar,"save");async function Car(e,t){return gQe(e).find(e,t)}o(Car,"find");var j9={};$(j9,{exportRows:()=>Jar,fetch:()=>Xar,fetchLegacyView:()=>eur,fetchRaw:()=>Zar,isValidFilter:()=>_qe,search:()=>Yar});var U9={};$(U9,{exportRows:()=>jar,fetch:()=>CQe,fetchLegacyView:()=>M9,fetchRaw:()=>k9,sqs:()=>_A});var _A={};$(_A,{buildInternalFieldList:()=>N9,search:()=>OQe});var EQe=B(require("dd-trace")),SQe=require("lodash"),TQe=B(require("lodash/pick"));var yQe=require("lodash");var xar=["CREATE","UPDATE","DELETE"],Dar=["mysql2","mssql","oracledb"],Par=["CREATE_TABLE","UPDATE_TABLE","DELETE_TABLE"],P9=class e{static{o(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}},Dh=class{static{o(this,"AliasTables")}constructor(t){this.tableNames=t,this.aliases={},this.tableAliases={},this.charSeq=new P9}isAliasingEnabled(t,r){let n=t.resource?.fields?.length;if(!n||n<=0||Par.includes(t.operation))return!1;if(!r)return!0;try{let i=bJ(r),s=xar.includes(t.operation),a=Dar.includes(i);if(s&&a)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("."),s=i.join("."),a=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});a&&(t=`${n.replace(a,this.getAlias(a))}.${s}`)}return t}reverse(t){let r=new Map,n=o(i=>{let s={};for(let a of Object.keys(i)){let u=r.get(a);if(!u){let c=a.indexOf(".");if(c===-1)u=a;else{let l=a.slice(0,c),f=a.slice(c+1);u=`${this.tableAliases[l]||l}.${f}`}r.set(a,u)}s[u]=i[a]}return s},"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,s;if(i?s=this.isAliasingEnabled(t):s=this.isAliasingEnabled(t,n),s){if(t=(0,yQe.cloneDeep)(t),t.resource?.fields&&(t.resource.fields=t.resource.fields.map(c=>this.aliasField(c))),t.filters){let c=o(l=>{for(let[f,d]of Object.entries(l)){if(typeof d!="object")continue;let p={};for(let h of Object.keys(d))p[this.aliasField(h)]=d[h];l[f]=p}return Et.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 a=await r(t);return Array.isArray(a)&&s?this.reverse(a):a}};function Nar(e,t,r){if(t){for(let n of Object.values(t))if(typeof n=="object")for(let[i,s]of Object.entries(n))i.endsWith(e)&&(n[i]=r(s))}}o(Nar,"findColumnInQueries");function bQe(e,t){Nar(e,t,r=>{let n=Array.isArray(r);if(!(typeof r=="string")&&!n)return r;let s=o(a=>{let u="ro"+ue;return a.startsWith(u)?U.getGlobalIDFromUserMetadataID(a):a},"processString");return n?r.map(a=>typeof a=="string"?s(a):a):s(r)})}o(bQe,"userColumnMapping");function fM(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":bQe(r,t);break;default:We.unreachable(i)}break}case"bb_reference":{bQe(r,t);break}}return Et.recurseLogicalOperators(t,r=>fM(e,r))}o(fM,"checkFilters");function _Qe(e,t){return t.query&&(t.query=fM(e,t.query)),t}o(_Qe,"searchInputMapping");function dM(e){for(let t of Object.values(e)){if(typeof t!="object")continue;if(Object.keys(t).find(n=>U.removeKeyNumbering(n)==="_id"&&t[n]))return!0}return!1}o(dM,"isSearchingByRowID");var vQe=new He.Sql("sqlite3"),Lar=2e3,AQe=new RegExp("no such column: .+"),kar=new RegExp("no such table: .+"),Mar=new RegExp("duplicate column name: .+");async function N9(e,t,r){let{relationships:n,allowedFields:i,includeHiddenFields:s}=r||{},a=[],u=x.views.isView(e),c;u?c=await x.views.getTable(e.id):c=e,u?a=Object.keys(fe.views.basicFields(e)):a=Object.keys(e.schema).filter(p=>s||e.schema[p].visible!==!1);let l=a.some(p=>c.schema[p]?.type==="formula");l?a=Object.keys(c.schema):i&&(a=a.filter(p=>i.includes(p)));let f=[],d=o((p,h)=>{let m=[];return h.forEach(g=>{m.push(`${Sf(c._id,p._id)}.${g}`)}),m},"getJunctionFields");if(x.tables.isTable(e))for(let p of Hr)i&&!i.includes(p)||f.push(`${c._id}.${p}`);for(let p of a){let h=c.schema[p];if(!h)continue;let m=h.type==="link";if(!(!n&&m))if(!m)f.push(`${c._id}.${hu(p)}`);else{let g=h,y=t.find(w=>w._id===g.tableId);if(!y)continue;let b=(await N9(y,t,{includeHiddenFields:l})).concat(d(y,["doc1.fieldName","doc2.fieldName"]));if(b.length+f.length>Lar)break;f=f.concat(b)}}if(!u||!fe.views.isCalculationView(e))for(let p of Hr)f.push(`${c._id}.${p}`);return[...new Set(f)]}o(N9,"buildInternalFieldList");function Uar(e,t){let r={};for(let a of t)for(let u of Object.keys(a.schema))Wf(u)||(r[u]=hu(u));let n=o(a=>Wf(a)?!1:t.some(u=>u.schema[a]),"keyInAnyTable"),i=new Et.ColumnSplitter(t),s=o(a=>{for(let u of Object.keys(a))if(Fc(u))for(let c of a[u].conditions)s(c);else{let c=a[u];if(typeof c!="object")continue;for(let l of Object.keys(c)){let{numberPrefix:f,relationshipPrefix:d,column:p}=i.run(l);n(p)&&(c[`${f||""}${d||""}${hu(p)}`]=c[l],delete c[l])}}},"prefixFilters");return s(e),e}o(Uar,"cleanupFilters");function RQe(e,t){let r=mb.length;return e.map(n=>{let i={};for(let s of Object.keys(n)){t?.schema[s]?.type==="link"&&typeof n[s]=="string"&&(n[s]=RQe(JSON.parse(n[s])));let a=s.indexOf(mb);if(a!==-1){let u=s.slice(0,a)+s.slice(a+r),c=fe.schema.decodeNonAscii(u);i[c]=n[s]}else i[s]=n[s]}return i})}o(RQe,"reverseUserColumnMapping");async function wQe(e,t,r,n){let i=r.map(c=>c.through),s=new Dh(t.map(c=>c._id).concat(i));n?.countTotalRows&&(e.operation="COUNT");let a=o(async c=>{let l=vQe._query(c,{disableReturning:!0});if(Array.isArray(l))throw new Error("SQS cannot currently handle multiple queries");let f=l.sql,d=l.bindings,p=o(m=>["doc1","doc2"].forEach(g=>{f=f.replaceAll(`\`${g}\`.\`${m}\``,`\`${g}.${m}\``)}),"fixJunctionDocs");if(p("rowId"),p("fieldName"),Array.isArray(l))throw new Error("SQS cannot currently handle multiple queries");let h=C.getWorkspaceDB();return await EQe.default.trace("sqs.runSqlQuery",async m=>(m?.addTags({sql:f}),await h.sql(f,d)))},"processSQLQuery"),u=await s.queryWithAliasing(e,a);return n?.countTotalRows?Wv(u):Array.isArray(u)?RQe(u,e.table):u}o(wQe,"runSqlQuery");function Far(e,t){return e===400&&t?.match(kar)||e===400&&t?.match(AQe)||e===400&&t?.match(Mar)||e===404&&t?.includes(Ln)}o(Far,"resyncDefinitionsRequired");async function OQe(e,t,r){let{paginate:n,query:i,...s}=(0,SQe.cloneDeep)(e),a;x.views.isView(t)?a=await x.views.getTable(t.id):a=t;let u=await x.tables.getAllInternalTables(),c=u.reduce((g,y)=>(g[y._id]=y,g),{});if(a._id&&(a=c[a._id]),!a)throw new Error("Unable to find table");let l=fje(a,u),f={...Uar(i,u),documentType:"ro"},d=[];if(x.views.isView(t)&&fe.views.isCalculationView(t)){let g=fe.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?d.push({name:y,distinct:!0,field:hu(b.field),calculationType:b.calculationType}):d.push({name:y,calculationType:b.calculationType,field:hu(b.field)}):d.push({name:y,field:hu(b.field),calculationType:b.calculationType}))}let p={endpoint:{datasourceId:Xc,entityId:a._id,operation:"READ"},filters:f,meta:{columnPrefix:mb,sqliteUseLikeWithoutLower:!0},resource:{fields:await N9(t,u,{relationships:l,allowedFields:e.fields}),aggregations:d},relationships:l};if(s.sort){let g=a.schema[s.sort];if(d.some(b=>b.name===s.sort))p.sort={[s.sort]:{direction:s.sortOrder||"ascending",type:"number"}};else if(g){let w=(bM(g)?g.responseType:g.type)==="number"?"number":"string";p.sort={[hu(g.name)]:{direction:s.sortOrder||"ascending",type:w}}}else throw new Error(`Unable to sort by ${s.sort}`)}if(s.bookmark&&typeof s.bookmark!="number")throw new Error("Unable to paginate with string based bookmarks");let h=s.bookmark||0;!dM(f)&&s.limit&&(n=!0,p.paginate={limit:s.limit+1,offset:h});let m=await Rh(p);try{let[g,y]=await Promise.all([wQe(m,u,l),e.countRows?wQe(m,u,l,{countTotalRows:!0}):Promise.resolve(void 0)]),b=vQe.convertJsonStringColumns(a,await KL(g,t,c,l,{sqs:!0})),w=!1;n&&s.limit&&g.length>s.limit&&(w=!0,b.length>s.limit&&b.pop());let E=await zt(t,b,{preserveLinks:!0,squash:!0}),T=[...e.fields||Object.keys(t.schema||{}).filter(A=>t.schema?.[A].visible!==!1),...Hr];E=E.map(A=>(0,TQe.default)(A,T));let R={rows:E};return y!=null&&(R.totalRows=y),n&&w&&(R.hasNextPage=!0,R.bookmark=h+b.length),n&&!w&&(R.hasNextPage=!1),R}catch(g){let y=typeof g=="string"?g:g.message;if(!r?.retrying&&Far(g.status,y))return await jn.doWithLock({type:"auto_extend",name:"sys_sync_definitions",resource:C.getWorkspaceId()},x.tables.sqs.syncDefinition),OQe(e,t,{retrying:!0});if(g.status===400&&y?.match(AQe))return{rows:[]};throw new Error(`Unable to search by SQL - ${y}`,{cause:g})}}o(OQe,"search");var Bar=U.getPouch({inMemory:!0});async function IQe(view,calculation,group,data){let db=new Bar(Je.newid());try{if(await db.bulkDocs(data.map(e=>({...e,_rev:void 0}))),!view.meta)throw new Error("Legacy view metadata is missing");let groupByMulti=view.meta.groupByMulti??view.meta.schema?.group?.type==="array",rebuiltView=Nf(view.meta,groupByMulti),fn=o((e,t)=>t(e._id),"fn");eval("fn = "+rebuiltView?.map?.replace("function (doc)","function (doc, emit)"));let queryFns={meta:rebuiltView.meta,map:fn};rebuiltView.reduce&&(queryFns.reduce=rebuiltView.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 U.closePouchDB(db)}}o(IQe,"runView");async function jar(e){let{tableId:t,format:r,rowIds:n,columns:i,query:s,sort:a,sortOrder:u,delimiter:c,customHeaders:l}=e,f=C.getWorkspaceDB(),d=await x.tables.getTable(t),p=[];if(n){let b=(await f.allDocs({include_docs:!0,keys:n.map(w=>{let E=Dn(w);if(E.length>1)throw new V("Export data does not support composite keys.",400);return E[0]})})).rows.map(w=>w.doc);p=await zt(d,b)}else p=(await x.rows.search({tableId:t,query:s||{},sort:a,sortOrder:u})).rows;let h=[],m=d.schema,g;if(p=Var(p,m),i&&i.length){for(let b=0;b<p.length;b++){h[b]={};for(let w of i)h[b][w]=p[b][w]}g=i}else h=p;let y=x.rows.utils.cleanExportRows(h,m,r,i,l);if(r==="csv")return{fileName:"export.csv",content:dk(g??Object.keys(h[0]),y,c,l)};if(r==="json")return{fileName:"export.json",content:pk(y)};if(r==="jsonWithSchema")return{fileName:"export.json",content:hk(m,y)};throw"Format not recognised"}o(jar,"exportRows");async function CQe(e){let t=await War(e),r=await k9(e);return await zt(t,r)}o(CQe,"fetch");async function War(e){try{return await x.tables.getTable(e)}catch(t){if(t.status!==404)throw t;let i=await $ar(e);if(!i)throw t;return i}}o(War,"getTableForFetch");async function $ar(e){let t=C.getWorkspaceId();if(!t||!_f(t))return;let r=C.getDevWorkspaceId();return await C.doInWorkspaceContext(r,async()=>{if(await x.tables.doesTableExist(e))return await x.tables.getTable(e)})}o($ar,"getDevTableWhenProdMissing");async function k9(e,t){let r=C.getWorkspaceDB(),n;return e===$t.USER_METADATA?n=await x.users.fetchMetadata():n=(await r.allDocs(tn(e,null,{include_docs:!0,limit:t}))).rows.map(s=>s.doc),n}o(k9,"fetchRaw");async function M9(e,t){if(e.startsWith("ta"))return CQe(e);let r=C.getWorkspaceDB(),{calculation:n,group:i,field:s}=t,a=await Gar(r,e),u;if(ne.SELF_HOSTED)u=await r.query(`database/${e}`,{include_docs:!n,group:!!i});else{let l=a.meta.tableId,f=await k9(l);u=await IQe(a,n,!!i,f)}let c=[];if(!n){u.rows=u.rows.map(f=>f.doc);let l;try{l=await x.tables.getTable(a.meta.tableId)}catch{throw new Error("Unable to retrieve view table.")}c=await zt(l,u.rows)}return n===L9.STATS&&(u.rows=u.rows.map(l=>({group:l.key,field:s,...l.value,avg:l.value.sum/l.value.count})),c=u.rows),(n===L9.COUNT||n===L9.SUM)&&(c=u.rows.map(l=>({group:l.key,field:s,value:l.value}))),c}o(M9,"fetchLegacyView");var L9={SUM:"sum",COUNT:"count",STATS:"stats"};async function Gar(e,t){let r=ne.SELF_HOSTED?vJ:AJ,n=ne.SELF_HOSTED?AJ:vJ,i=ne.SELF_HOSTED?gVe:mVe,s,a=!1;try{s=await r(e,t)}catch(u){u.status!==404?s=null:(s=await n(e,t),a=!!s)}if(a&&await i(e,t),!s)throw"View does not exist.";return s}o(Gar,"getView");function Var(e,t){let r=["_id",...Object.keys(t)];return e.map(i=>Object.keys(i).filter(s=>r.includes(s)).reduce((s,a)=>({...s,[a]:i[a]}),{}))}o(Var,"trimFields");var F9={};$(F9,{exportRows:()=>Qar,fetch:()=>Kar,fetchRaw:()=>zar,search:()=>pM});var xQe=B(require("lodash/pick"));function Har(e,t,r,n){let i;if(!dM(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}}o(Har,"getPaginationAndLimitParameters");async function pM(e,t){let{countRows:r,paginate:n,query:i,...s}=e,{limit:a}=s,u=s.bookmark&&parseInt(s.bookmark)||void 0;n&&!u&&(u=0);let c=Har(i,n,u,a),l;if(s.sort){let f=s.sortOrder==="descending"?"descending":"ascending";l={[s.sort]:{direction:f}}}if(i?.oneOf?._id){let f=i.oneOf._id;i.oneOf._id=f.map(d=>Dn(d)[0])}try{let f={filters:i,sort:l,paginate:c,includeSqlRelationships:1},[{rows:d,rawResponseSize:p},h]=await Promise.all([Ii("READ",t,f),r?Ii("COUNT",t,f):Promise.resolve(void 0)]),m=await zt(t,d,{preserveLinks:!0,squash:!0}),g=!1;n&&a&&p>a&&(g=!0,m.length>a&&m.pop());let b=[...e.fields||Object.keys(t.schema||{}).filter(E=>t.schema?.[E].visible!==!1),...no];m=m.map(E=>(0,xQe.default)(E,b));let w={rows:m,hasNextPage:g};return g&&u!=null&&(w.bookmark=u+m.length),h!=null&&(w.totalRows=h),n&&!g&&(w.hasNextPage=!1),w}catch(f){throw f.message&&f.message.includes("does not exist")?new Error(`Table updated externally, please re-fetch - ${f.message}`,{cause:f}):f}}o(pM,"search");async function Qar(e){let{tableId:t,format:r,columns:n,rowIds:i,query:s,sort:a,sortOrder:u,delimiter:c,customHeaders:l}=e;if(!t)throw new V("No table ID for search provided.",400);let{datasourceId:f,tableName:d}=gr(t),p={};i?.length?p={oneOf:{_id:i.map(R=>{let A=Dn(R);return A.length>1?A:A[0]})}}:p=s||{};let h=await x.datasources.get(f),m=await x.tables.getTable(t);if(!h||!h.entities)throw new V("Datasource has not been configured for plus API.",400);let g=await pM({tableId:m._id,query:p,sort:a,sortOrder:u},m),y=[],b;if(n&&n.length){for(let R=0;R<g.rows.length;R++){y[R]={};for(let A of n)y[R][A]=g.rows[R][A]}b=n}else y=g.rows;let w=h.entities[d].schema,E=x.rows.utils.cleanExportRows(y,w,r,n,l),S;switch(r){case"csv":S=dk(b??Object.keys(w),E,c,l);break;case"json":S=pk(E);break;case"jsonWithSchema":S=hk(w,E);break;default:throw We.unreachable(r)}return{fileName:`export.${r}`,content:S}}o(Qar,"exportRows");async function Kar(e){let t=await x.tables.getTable(e),r=await Ii("READ",t,{includeSqlRelationships:1});return await zt(t,r.rows,{preserveLinks:!0,squash:!0})}o(Kar,"fetch");async function zar(e,t){let r=await x.tables.getTable(e),n;return t&&(n={limit:t}),(await Ii("READ",r,{includeSqlRelationships:1,paginate:n})).rows}o(zar,"fetchRaw");var PQe=B(require("dd-trace"));var B9=o((e,t)=>{t=t.map(r=>r.toLowerCase());for(let r of Object.keys(e||{}))if(Fc(r)){let n=e[r];if(!n)continue;for(let i of n.conditions)B9(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(U.removeKeyNumbering(i).toLowerCase()))throw new V(`Invalid filter field: ${i}`,400)}},"validateFilters"),DQe=o(async(e,t)=>{let r=o(async(i,s,a,u)=>{let c=[];FJ({table:i})&&c.push("_id");for(let l of Object.keys(i.schema).filter(f=>s.includes(f)&&i.schema[f].visible!==!1)){let f=i.schema[l],d=f.type==="link";if(!(d&&(u?.noRelationships||a.includes(f.tableId))))if(d){c.push(l);try{let p=await x.tables.getTable(f.tableId),h=await r(p,Object.keys(p.schema),[...a,f.tableId],{noRelationships:!0});c.push(...h.flatMap(m=>[`${f.name}.${m}`,`${p.name}.${m}`]))}catch(p){if(p.status!==404)throw p}}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 q9(e){return Pt(e)?F9:U9}o(q9,"pickApi");async function Yar(e,t){return await PQe.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 x.views.get(e.viewId),i=await x.views.getTable(n);else if(e.tableId)n=await x.tables.getTable(e.tableId),i=n;else throw new Error("Must supply either a view ID or a table ID");let s=Pt(i._id);if(e.query){let u=(e.fields||Object.keys(i.schema)).filter(l=>i.schema[l]?.visible!==!1),c=await DQe(i,u);B9(e.query,c)}else e.query={};if(t&&(e.query=await vh(e.query,t)),e=_Qe(i,e),e.viewId){let c=await vh(n.query||{},t);Array.isArray(c)&&(c=Et.buildQuery(c)),c=fM(i,c);let l=c?[c]:[];e.query={$and:{conditions:[...l,e.query]}},c.onEmptyFilter&&(e.query.onEmptyFilter=c.onEmptyFilter)}if(e.query=Et.cleanupQuery(e.query),e.query=Et.fixupFilterArrays(e.query),r.addTags({cleanedQuery:e.query}),!Et.hasFilters(e.query)&&e.query.onEmptyFilter==="none")return r.addTags({emptyQuery:!0}),{rows:[]};e.sortOrder&&(e.sortOrder=e.sortOrder.toLowerCase());let a;return s?(r?.addTags({searchType:"external"}),a=await pM(e,n)):(r?.addTags({searchType:"sqs"}),a=await _A.search(e,n)),r.addTags({foundRows:a.rows.length,totalRows:a.totalRows}),a})}o(Yar,"search");async function Jar(e){return q9(e.tableId).exportRows(e)}o(Jar,"exportRows");async function Xar(e){return q9(e).fetch(e)}o(Xar,"fetch");async function Zar(e,t){return q9(e).fetchRaw(e,t)}o(Zar,"fetchRaw");async function eur(e,t){return M9(e,t)}o(eur,"fetchLegacyView");var NQe={...C9,...D9,...j9,utils:wJ,external:bA,AliasTables:Dh};var W9={};$(W9,{create:()=>rur,ensureHomepageUniqueness:()=>iur,fetch:()=>tur,update:()=>nur});async function tur(e=C.getWorkspaceDB()){let t=(await e.allDocs(X2e(null,{include_docs:!0}))).rows.map(n=>n.doc),r=t.filter(n=>!n.workspaceAppId);if(r.length){let n=await x.workspaceApps.fetch(),i=n.find(s=>s.isDefault)||n[0];i&&r.forEach(s=>{s.workspaceAppId=i._id})}return t}o(tur,"fetch");async function rur(e){let r=await C.getWorkspaceDB().put({...e,_id:J2e()});return{...e,_id:r.id,_rev:r.rev}}o(rur,"create");async function nur(e){let r=await C.getWorkspaceDB().put(e);return{...e,_rev:r.rev}}o(nur,"update");async function iur(e){let n=(await x.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 x.screens.update(i)}o(iur,"ensureHomepageUniqueness");var $9={};$($9,{create:()=>uur,duplicate:()=>cur,fetch:()=>kQe,get:()=>MQe,getMatchedWorkspaceApp:()=>dur,remove:()=>fur,update:()=>lur});async function LQe(e,t){if((await kQe()).find(n=>n.name===e&&n._id!==t))throw new V(`App with name '${e}' is already taken.`,400)}o(LQe,"guardName");var our=o(async(e,t)=>{let n=(await x.screens.fetch()).filter(s=>s.workspaceAppId===e),i=[];for(let s=0;s<n.length;s++){let a=n[s],u=await x.screens.create({layoutId:a.layoutId,showNavigation:a.showNavigation,width:a.width,routing:a.routing,props:a.props,name:a.name,pluginAdded:a.pluginAdded,onLoad:a.onLoad,variant:a.variant,workspaceAppId:t});i.push(u)}return i},"duplicateScreens"),sur=o(async e=>{let t=await x.workspaceApps.fetch(),r=fe.duplicateName(e.name,t.map(i=>i.name)),n={name:r,url:`/${aur(r)}`,disabled:!0,navigation:e.navigation,isDefault:!1};return x.workspaceApps.create(n)},"createDuplicatedApp"),aur=o(e=>e.toLowerCase().replaceAll(" ","-"),"slugify");async function kQe(e=C.getWorkspaceDB()){return(await e.allDocs(Ze.getWorkspaceAppParams(null,{include_docs:!0}))).rows.map(n=>({...n.doc,_id:n.doc._id,_rev:n.doc._rev}))}o(kQe,"fetch");async function MQe(e){return await C.getWorkspaceDB().tryGet(e)}o(MQe,"get");async function uur(e){let t=C.getWorkspaceDB();return await LQe(e.name),(await t.put({...e,_id:Ze.generateWorkspaceAppID()},{returnDoc:!0})).doc}o(uur,"create");async function cur(e){let t=await sur(e);return await our(e._id,t._id),t}o(cur,"duplicate");async function lur(e){let t=C.getWorkspaceDB(),r=await MQe(e._id);if(!r)throw new V(`Project app with id '${e._id}' not found.`,404);e.name!==r.name&&await LQe(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}o(lur,"update");async function fur(e,t){let r=C.getWorkspaceDB();try{let i=await r.tryGet(e);if(!i)throw new V(`Project app with id '${e}' not found.`,404);await r.remove(e,t),Le.workspace.deleted(i,C.getWorkspaceId())}catch(i){throw i.status===404?new V(`Project app with id '${e}' not found.`,404):i}let n=(await x.screens.fetch()).filter(i=>i.workspaceAppId===e);await r.bulkRemove(n)}o(fur,"remove");async function dur(e){let t=await x.workspaces.metadata.get(),r=e.split("?")[0],n=U.isProdWorkspaceID(t.appId)?`/app/${t.url}`.replace("//","/"):`/${t.appId}`,i=U.isProdWorkspaceID(t.appId)?`/app-chat/${t.url}`.replace("//","/"):`/app-chat/${t.appId}`,s=U.isProdWorkspaceID(t.appId)?`/embed/${t.url}`.replace("//","/"):null,a=await x.workspaceApps.fetch(),u=a.filter(h=>!h.disabled),c=o(()=>u.find(h=>h.isDefault)||u[0]||a.find(h=>h.isDefault)||a[0],"getDefaultWorkspaceApp");function l(h,{url:m,isDefault:g}){return h.replace(/\/$/,"")===`${n}${m.replace(/\/$/,"")}`||s&&h.replace(/\/$/,"")===`${s}${m.replace(/\/$/,"")}`||!h&&g}o(l,"isWorkspaceAppMatch");let f=o(h=>a.find(m=>l(h,m)),"findWorkspaceApp");if(r.replace(/\/$/,"")===i.replace(/\/$/,"")||r.startsWith(`${i.replace(/\/$/,"")}/`))return c();let d=f(r);if(d)return d;let p=r.replace(/\/_chat(?:\/.*)?$/,"");return p!==r?f(p):d}o(dur,"getMatchedWorkspaceApp");var G9={};$(G9,{updateWithExport:()=>yur});var UQe=[ad.SQLITE,"_design/migrations"];async function pur(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}`)}}o(pur,"getNewWorkspaceMetadata");function hur(e,t,r){let n=[];for(let s of t){let a=e.find(u=>u._id===s._id);a?a._rev=s._rev:n.push(s)}return[...e,...n,r]}o(hur,"mergeUpdateAndDeleteDocuments");async function mur(e){let t=[];for(let s of mM)t.push(e.allDocs(U.getDocParams(s)));let r=[];for(let s of await Promise.all(t))r=r.concat(s.rows.map(a=>({_id:a.id,_rev:a.value.rev})));let n=await e.getMultiple(UQe,{allowMissing:!0});r.push(...n.map(s=>({_id:s._id,_rev:s._rev})));let i=new Map;return r.forEach(s=>{i.set(s._id,s)}),Array.from(i.values()).map(s=>({_deleted:!0,...s}))}o(mur,"removeImportableDocuments");async function gur(e){let t=[];for(let s of mM)t.push(e.allDocs(U.getDocParams(s,null,{include_docs:!0})));let r=[];for(let s of await Promise.all(t))r=r.concat(s.rows.map(a=>a.doc));let n=await e.getMultiple(UQe,{allowMissing:!0});r.push(...n);let i=new Map;return r.forEach(s=>{delete s._rev,i.set(s._id,s)}),Array.from(i.values())}o(gur,"getImportableDocuments");async function yur(e,t,r){let n=U.getDevWorkspaceID(e),i=`temp_${n}`,s=U.getDB(i),a=U.getDB(n);try{let u={file:{type:t.type,path:t.path,password:r}};await sM.importApp(n,s,u,{updateAttachmentColumns:!0});let c=await pur(s,a),l=await gur(s),f=await mur(a);if((await a.bulkDocs(hur(l,f,c))).some(p=>p.error))throw new V("Error importing documents",500);await Ue.destroy(Bk(n)),await N7(n)}finally{await s.destroy()}}o(yur,"updateWithExport");var V9={};$(V9,{get:()=>bur,tryGet:()=>_ur});async function bur(e){return await(e?.production?C.getProdWorkspaceDB():C.getWorkspaceDB()).get("app_metadata")}o(bur,"get");async function _ur(e){return await(e?.production?C.getProdWorkspaceDB():C.getWorkspaceDB()).tryGet("app_metadata")}o(_ur,"tryGet");var H9={};$(H9,{enrichWithDefaultWorkspaceAppUrl:()=>Eur,fetch:()=>wur,filterAppList:()=>FQe});function FQe(e,t){let r=[],n=Object.keys(e.roles);if(tt.hasAppBuilderPermissions(e))r=e.builder?.apps||[],r=r.concat(n);else if(!tt.isAdminOrBuilder(e))r=n;else return t;return t.filter(i=>r.includes(U.getProdWorkspaceID(i.appId)))}o(FQe,"filterAppList");async function wur(e,t){let r=e==="development",n=e==="all",i=await U.getAllWorkspaces({dev:r,all:n}),s={...t,roles:t?.roles||{}},a=await Kn.enrichUserRolesFromGroups(s);i=FQe(a,i);let u=i.filter(l=>l.status==="development").map(l=>l.appId);if(r||n){let l=await sje(u);for(let f of i){let d=l[f.appId];d?f.lockedBy=d:delete f.lockedBy}}let c=await xY(i);return await Y3e(c)}o(wur,"fetch");async function Eur(e){let t=[];for(let r of e){let n=await U.doWithDB(r.appId,i=>x.workspaceApps.fetch(i));t.push({...r,defaultWorkspaceAppUrl:n[0]?.url||""})}return t}o(Eur,"enrichWithDefaultWorkspaceAppUrl");var BQe={...sJ,...Tz,...H9,...G9,metadata:V9};var Sur={backups:sM,tables:Ih,automations:gu,workspaces:BQe,rows:NQe,users:$$e,datasources:pu,queries:uQe,plugins:OY,screens:W9,views:Yv,permissions:GJ,links:X4e,rowActions:O9,common:b9,oauth2:S9,ai:a9,workspaceApps:$9,navigation:E9,resources:R9,deployment:J4e,dev:Oz,workspace:_9},x=Sur;var bu=require("undici");var wA={path:{type:"string",display:"URL"},queryString:{type:"string"},headers:{type:"object"},enabledHeaders:{type:"object"},requestBody:{type:"json"},bodyType:{type:"string",enum:Object.values(Uh)},pagination:{type:"object"}},Tur={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:wA},read:{displayName:"GET",readable:!0,type:"fields",fields:wA},update:{displayName:"PUT",readable:!0,type:"fields",fields:wA},patch:{displayName:"PATCH",readable:!0,type:"fields",fields:wA},delete:{displayName:"DELETE",type:"fields",fields:wA}}},z9=o(e=>Object.prototype.toString.call(e)==="[object Object]","isPlainRecord"),vur=o(e=>{if(e==null)return{bodyString:"",bodyObject:{},jsonValue:void 0};if(typeof e=="string")try{let t=JSON.parse(e);return z9(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()}:z9(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"),Y9=class{constructor(t){this.headers={};this.startTimeMs=hM.performance.now();this.config=t}static{o(this,"RestIntegration")}async parseResponse(t,r){let n,i,s={},a,{contentType:u,contentDisposition:c}=Hqe(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&&(a=WQe.default.basename((0,jQe.parse)(c).parameters?.filename)||"");let d=!1,p;try{if(a)return Eqe(t,a,this.startTimeMs);{p=t.text?await t.text():"",!l&&p&&(l=Buffer.byteLength(p,"utf8").toString());let y=l&&parseInt(l)>0||p.length>0;if(t.status===204)n=[],i="";else if(y&&u.includes("application/json"))d=!0,n=JSON.parse(p),i=p;else if(y&&u.includes("text/xml")||u.includes("application/xml")){d=!0;let b=await wqe(p);n=b.data,i=b.rawXml}else n=p,i=p}}catch(y){if(d)n=p,i=p;else throw new Error(`Failed to parse response body: ${y}`)}let h=fe.formatBytes(l||"0"),m=`${Math.round(hM.performance.now()-this.startTimeMs)}ms`;for(let[y,b]of t.headers.entries())s[y]=b;let g;return r?.responseParam&&(g=(0,qQe.default)(n,r.responseParam)),{data:n,info:{code:t.status,size:h,time:m},extra:{raw:i,headers:s},pagination:{cursor:g}}}getUrl(t,r,n,i){if(n?.location==="query"&&i){let{pageParam:u,sizeParam:c}=n,l=new K9.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=Q9.default.decode(r),c={};for(let[l,f]of Object.entries(u))f!==""&&f!=null&&(c[l]=f);Object.keys(c).length>0?r="?"+Q9.default.encode(c):r=""}let s=`${t}${r}`,a=s;return this.config.url&&!s.startsWith("http")&&(a=this.config.url?`${this.config.url}/${s}`:s),a.startsWith("http")||(a=`http://${a}`),a}addBody(t,r,n,i,s){if(n.headers||(n.headers={}),t==="none")return n;let a,u={},c="",l;if(r!=null){let{bodyString:d,bodyObject:p,parseError:h,jsonValue:m}=vur(r);c=d,u=p,a=h,l=m}let f=o(d=>{i?.location==="body"&&(i?.pageParam&&s?.page!=null&&d(i.pageParam,s.page),i?.sizeParam&&s?.limit!=null&&d(i.sizeParam,s.limit))},"addPaginationToBody");switch(t){case"text":n.body=c;break;case"encoded":{let d=new K9.URLSearchParams;for(let[p,h]of Object.entries(u))d.append(p,String(h));f((p,h)=>{h!=null&&d.append(p,String(h))}),n.body=d;break}case"form":{let d=new bu.FormData,p=o((y,b)=>{if(b==null){d.append(y,"");return}if(typeof b=="string"){d.append(y,b);return}if(b instanceof Blob){d.append(y,b);return}if(Buffer.isBuffer(b)){d.append(y,Buffer.from(b).toString());return}if(b instanceof Uint8Array){d.append(y,Buffer.from(b).toString());return}d.append(y,String(b))},"appendFormValue");for(let[y,b]of Object.entries(u))p(y,b);f((y,b)=>{b!=null&&p(y,b)});let m=o(()=>n.headers?Array.isArray(n.headers)?n.headers.reduce((b,[w,E])=>(b[w]=E,b),{}):n.headers instanceof bu.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=d;break}case"xml":u!=null&&Object.keys(u).length&&(c=new $Qe.Builder().buildObject(u)),n.body=c,n.headers["Content-Type"]="application/xml";break;case"json":{if(a)throw"Invalid JSON for request body";let d;if(typeof l<"u")d=l;else if(c)try{d=JSON.parse(c)}catch{d=u}else d=u;if(i?.location==="body"&&z9(d)){let p={...d};i.pageParam&&s?.page!=null&&(p[i.pageParam]=s.page),i.sizeParam&&s?.limit!=null&&(p[i.sizeParam]=s.limit),d=p}else if(i?.location==="body"){let p={...u};i.pageParam&&s?.page!=null&&(p[i.pageParam]=s.page),i.sizeParam&&s?.limit!=null&&(p[i.sizeParam]=s.limit),Object.keys(p).length>0&&(d=p)}n.body=typeof d=="string"?d:JSON.stringify(d),n.headers["Content-Type"]="application/json";break}}return n}async getAuthHeaders(t,r){if(!t)return{};if(r==="oauth2")return{Authorization:await x.oauth2.getToken(t)};if(!this.config.authConfigs)return{};let n={},i=this.config.authConfigs.filter(s=>s._id===t)[0];if(i){let{type:s,config:a}=i;switch(s){case"basic":n.Authorization=`Basic ${Buffer.from(`${a.username}:${a.password}`).toString("base64")}`;break;case"bearer":n.Authorization=`Bearer ${a.token}`;break;default:throw We.unreachable(s)}}return n}async _req(t,r=!0){let{path:n="",queryString:i="",headers:s={},method:a="GET",disabledHeaders:u,bodyType:c="none",requestBody:l,authConfigId:f,authConfigType:d,pagination:p,paginationValues:h}=t,m=await this.getAuthHeaders(f,d);if(this.headers={...this.config.defaultHeaders||{},...s,...m},u)for(let T of Object.keys(this.headers))u[T]&&delete this.headers[T];let g={method:a,headers:this.headers};g=this.addBody(c,l,g,p,h),this.config.legacyHttpParser&&(g.extraHttpOptions={insecureHTTPParser:!0}),this.startTimeMs=hM.performance.now();let y=this.getUrl(n,i,p,h);if(await PP.isBlacklisted(y))throw new Error("Cannot connect to URL.");let b=this.config.rejectUnauthorized===void 0?ne.REST_REJECT_UNAUTHORIZED:this.config.rejectUnauthorized;(0,bu.getGlobalDispatcher)()instanceof bu.MockAgent||(g.dispatcher=Cqe({rejectUnauthorized:b,url:y}));let S;try{S=await(0,bu.fetch)(y,g)}catch(T){let R=T;throw console.log("[rest integration] Fetch error details",{url:y,error:R.message,cause:R.cause?.message,code:R.cause?.code,hasDispatcher:!!g.dispatcher,isHttpsUrl:y.startsWith("https://"),rejectUnauthorized:b}),R.cause?.code==="UNABLE_TO_VERIFY_LEAF_SIGNATURE"||R.cause?.code==="CERT_UNTRUSTED"||R.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: ${R.message}`):R.cause?.code==="ECONNREFUSED"&&g.dispatcher?new Error(`Connection refused when using proxy. Check proxy configuration and ensure the proxy server is accessible. Original error: ${R.message}`):R}return S.status===401&&d==="oauth2"&&r?(await x.oauth2.cleanStoredToken(f),await this._req(t,!1)):await this.parseResponse(S,p)}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"})}},J9={schema:Tur,integration:Y9};var GQe=require("@google-cloud/firestore");var Aur={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}}},X9=class{static{o(this,"FirebaseIntegration")}constructor(t){this.config=t,this.client=new GQe.Firestore({projectId:t.projectId,databaseId:t.databaseId||"(default)",credentials:{client_email:t.email,private_key:t.privateKey?.replace(/\\n/g,`
997
+ Generate the content based on these instructions. Format appropriately for a ${e.contentType}.`),i=(await mu(r.messages))?.trim();return i?{response:i,success:!0}:{success:!1,response:"Generate Text AI Step Failed: AI did not return any content."}}catch(t){return{success:!1,response:Ye(t)}}}o(j3e,"run");function Eir(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 We.unreachable(e)}}o(Eir,"getContentTypePrompt");var W3e=B(require("node-fetch"));var vb=5,Tir=100;function vir(e){return new Promise(t=>setTimeout(t,e))}o(vir,"sleep");async function Air(e,t,r){let n=await(0,W3e.default)(e);if(!n.ok)throw new Error(`Failed to fetch file from URL: ${n.statusText}`);let i=n.body,s=n.headers.get("content-type")||t,a=`document.${t}`;return await r.uploadFile(i,a,s)}o(Air,"processUrlFile");async function Rir(e,t){let r=ge.ObjectStoreBuckets.APPS,{stream:n}=await ge.getReadStream(r,e.key),i=e.name||"document";return await t.uploadFile(n,i,e.extension)}o(Rir,"processAttachmentFile");async function Oir(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.")}}o(Oir,"parseAIResponse");async function $3e({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 Mt.getLLMOrThrow(),r;if(e.source==="URL"&&typeof e.file=="string")r=await Air(e.file,e.fileType,t);else if(e.source==="Attachment"&&typeof e.file!="string")r=await Rir(e.file,t);else throw new Error("Invalid file input \u2013 source and file type do not match");let n=Mt.extractFileData(e.schema,r,t.supportsFiles),i=[],s;for(let a=1;a<=vb;a++){try{let u=await t.prompt(n);if(i=await Oir(u),!(Array.isArray(i)&&i.length===0)||a===vb)break;console.warn(`[Extract AI] Empty extraction result on attempt ${a}/${vb}, retrying...`)}catch(u){if(s=u,a===vb)throw console.error(`[Extract AI] Final extraction attempt ${a}/${vb} failed:`,u),u;console.warn(`[Extract AI] Extraction attempt ${a}/${vb} failed, retrying...`,u)}await vir(Tir)}if(s&&Array.isArray(i)&&i.length===0)throw s;return{data:i,success:!0}}catch(t){return console.error("Document extraction error:",t),{success:!1,data:{},response:Ye(t)}}}o($3e,"run");var to=require("ai"),G3e=require("uuid");var Mc=B(require("dd-trace"));async function V3e({inputs:e,appId:t}){let{agentId:r,prompt:n,useStructuredOutput:i,outputSchema:s}=e;if(!r)return{success:!1,response:"Agent step failed: No agent selected"};if(!n)return{success:!1,response:"Agent step failed: No prompt provided"};let a=(0,G3e.v4)();return Mc.default.llmobs.trace({kind:"agent",name:"automation.agent",sessionId:a},async u=>{try{let c=await x.ai.agents.getOrThrow(r);if(Mc.default.llmobs.annotate(u,{inputData:n,metadata:{agentId:r,agentName:c.name,appId:t,isForkedProcess:ne.isInThread(),forkedProcessName:process.env.FORKED_PROCESS_NAME||"main"}}),t&&_f(t)&&c.live!==!0)return Mc.default.llmobs.annotate(u,{outputData:"Agent is paused",tags:{error:"agent_paused"}}),{success:!1,response:"Agent is paused. Set it live to use it in published automations."};let{systemPrompt:l,tools:f}=await x.ai.agents.buildPromptAndTools(c);Mc.default.llmobs.annotate(u,{metadata:{toolCount:Object.keys(f).length}});let{chat:d,providerOptions:p}=await x.ai.llm.createLLM(c.aiconfig,a,u),h;if(i&&s&&Object.keys(s).length>0){let P=fe.structuredOutput.normalizeSchemaForStructuredOutput(s);h=to.Output.object({schema:(0,to.jsonSchema)(P)})}let m=new Set,g=Object.keys(f).length>0,b=await new to.ToolLoopAgent({model:(0,to.wrapLanguageModel)({model:d,middleware:(0,to.extractReasoningMiddleware)({tagName:"think"})}),instructions:l||void 0,tools:g?f:void 0,toolChoice:g?"auto":"none",stopWhen:(0,to.stepCountIs)(30),providerOptions:p?.(g),output:h,onStepFinish({content:P,toolCalls:D,toolResults:q}){M7(m,D,q);for(let N of P)N.type==="tool-error"&&m.delete(N.toolCallId)}}).stream({prompt:n}),w,E;for await(let P of(0,to.readUIMessageStream)({stream:b.toUIMessageStream({sendReasoning:!0,onError:D=>{let q=t3(D);return E=q,q}})}))w=P;let S=w?k7([w]):[];if(m.size>0||S.length>0){let P=U7(S);return Mc.default.llmobs.annotate(u,{outputData:P,tags:{error:"1","error.type":"IncompleteToolCall"}}),{success:!1,response:P,message:w}}let T,R;try{T=await b.text}catch(P){R=t3(P)}let A=E||R;if(A&&!T)return Mc.default.llmobs.annotate(u,{outputData:A,tags:{error:"1","error.type":"StreamingError"}}),{success:!1,response:A,message:w};let O=await b.usage,I=h?await b.output:void 0;return Mc.default.llmobs.annotate(u,{outputData:T,metadata:{stepCount:w?.parts?.length??0}}),{success:!0,response:T,usage:O,message:w,output:I}}catch(c){let l=Ye(c);return Mc.default.llmobs.annotate(u,{outputData:l,tags:{error:"1","error.type":c?.name||"UnknownError"}}),console.error("Agent step failed",{agentId:r,appId:t,liteLLMUrl:ne.LITELLM_URL,errorName:c?.name,errorMessage:l}),{success:!1,response:l}}})}o(V3e,"run");async function H3e({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:nr(e.value,t,{noThrow:!1})}}catch(n){return{success:!1,response:Ye(n)}}}o(H3e,"run");var B7={SEND_EMAIL_SMTP:cHe,CREATE_ROW:yHe,GET_ROW:C3e,UPDATE_ROW:bHe,DELETE_ROW:_He,QUERY_ROWS:I3e,OUTGOING_WEBHOOK:e3e,EXECUTE_SCRIPT:AHe,EXECUTE_SCRIPT_V2:RHe,EXECUTE_QUERY:JHe,API_REQUEST:XHe,SERVER_LOG:t3e,DELAY:p3e,FILTER:d3e,COLLECT:x3e,TRIGGER_AUTOMATION_RUN:D3e,OPENAI:N3e,CLASSIFY_CONTENT:U3e,PROMPT_LLM:F3e,TRANSLATE:B3e,SUMMARISE:q3e,GENERATE_TEXT:j3e,EXTRACT_FILE_DATA:$3e,AGENT:V3e,EXTRACT_STATE:H3e,discord:n3e,slack:o3e,zapier:a3e,integromat:f3e,n8n:c3e},F7={SEND_EMAIL_SMTP:Ge.steps.sendSmtpEmail.definition,CREATE_ROW:Ge.steps.createRow.definition,GET_ROW:Ge.steps.getRow.definition,UPDATE_ROW:Ge.steps.updateRow.definition,DELETE_ROW:Ge.steps.deleteRow.definition,QUERY_ROWS:Ge.steps.queryRows.definition,OUTGOING_WEBHOOK:Ge.steps.outgoingWebhook.definition,EXECUTE_SCRIPT:Ge.steps.executeScript.definition,EXECUTE_SCRIPT_V2:Ge.steps.executeScriptV2.definition,EXECUTE_QUERY:Ge.steps.executeQuery.definition,API_REQUEST:Ge.steps.apiRequest.definition,SERVER_LOG:Ge.steps.serverLog.definition,DELAY:Ge.steps.delay.definition,FILTER:Ge.steps.filter.definition,LOOP:Ge.steps.loop.definition,COLLECT:Ge.steps.collect.definition,TRIGGER_AUTOMATION_RUN:Ge.steps.triggerAutomationRun.definition,BRANCH:Ge.steps.branch.definition,CLASSIFY_CONTENT:Ge.steps.classifyText.definition,PROMPT_LLM:Ge.steps.promptLLM.definition,TRANSLATE:Ge.steps.translate.definition,SUMMARISE:Ge.steps.summarise.definition,GENERATE_TEXT:Ge.steps.generate.definition,EXTRACT_FILE_DATA:Ge.steps.extract.definition,EXTRACT_STATE:Ge.steps.extractState.definition,LOOP_V2:Ge.steps.loopV2.definition,discord:Ge.steps.discord.definition,slack:Ge.steps.slack.definition,zapier:Ge.steps.zapier.definition,integromat:Ge.steps.make.definition,n8n:Ge.steps.n8n.definition};ne.SELF_HOSTED&&(B7.EXECUTE_BASH=k3e,F7.EXECUTE_BASH=Ge.steps.bash.definition,ne.isTest()&&(F7.OPENAI=Ge.steps.openai.definition,F7.AGENT=Ge.steps.agent.definition));async function Q3e(e){if(B7[e]!=null)return B7[e];if(ne.SELF_HOSTED){let r=(await x.plugins.fetch("automation")).find(n=>n.schema.schema.stepId===e);if(!r)throw new Error(`Unable to find action implementation for "${e}"`);return(await nje(r)).action}}o(Q3e,"getAction");var K3e=B(require("object-sizeof"));var Pir=1024*1024;function Nir(e,t){let r=`[removed] - max results size of ${t}MB exceeded`;for(let n of e.steps)n.inputs={message:r},n.outputs={message:r,success:n.outputs.success}}o(Nir,"sanitiseResults");async function z3e(e,t){if(ne.DISABLE_AUTOMATION_LOGS)return;let r=ne.AUTOMATION_MAX_LOG_SIZE_MB;(0,K3e.default)(t)/Pir>r&&Nir(t,r);try{await Jy.logs.storeLog(e,t)}catch(i){i.status===413&&i.request?.data&&(delete i.request.data,i.request.data={message:"removed due to large size"}),Ne.logAlert("Error writing automation log",i)}}o(z3e,"storeLog");async function Y3e(e){let t=await Jy.logs.oldestLogDate();for(let r of e)if(r.automationErrors)for(let[n,i]of Object.entries(r.automationErrors)){let s=[];for(let a of i){if(!a)continue;a.split(U.SEPARATOR)[2]>t&&s.push(a)}r.automationErrors[n]=s}return e}o(Y3e,"checkAppMetadata");var J3e=5,q7=class{static{o(this,"AutomationEmitter")}constructor(t){this.chainCount=t,this.metadata={automationChainCount:t}}async getMaxAutomationChain(){let n=(await C.getWorkspaceDB().get("app_metadata"))?.automations?.chainAutomations;return n===!0?J3e:ne.isTest()?0:n===void 0&&ne.SELF_HOSTED?J3e:0}async emitRow({eventName:t,appId:r,row:n,table:i,oldRow:s,user:a}){let u=await this.getMaxAutomationChain();this.chainCount>=u||rk({emitter:Ah,eventName:t,appId:r,row:n,table:i,oldRow:s,metadata:this.metadata,user:a})}async emitTable(t,r,n){let i=await this.getMaxAutomationChain();this.chainCount>=i||nk({emitter:Ah,eventName:t,appId:r,table:n,metadata:this.metadata})}},X3e=q7;process.env.DD_APM_ENABLED&&(e4e(),SA(Lir));Lc.threadSetup();var kir=Ge.triggers.definitions.CRON.stepId,Mir={success:!0,status:"stopped"};function Vk(e,t,r){if(e.isLegacyLoop){t.items=cJ(t.items);let n=e?.inputs?.children?.[0],i=n?.id||e.id,s=n?.stepId||e.stepId,a=r||n?.inputs||e.inputs;return{id:i,stepId:s,inputs:a,outputs:{success:!0,...t}}}return{id:e.id,stepId:e.stepId,inputs:r||e.inputs,outputs:{success:!0,...t}}}o(Vk,"stepSuccess");function Ab(e,t,r){if(e.isLegacyLoop){t.items=cJ(t.items);let n=e?.inputs?.children?.[0],i=n?.id||e.id,s=n?.stepId||e.stepId,a=r||n?.inputs||e.inputs;return{id:i,stepId:s,inputs:a,outputs:{success:!1,...t}}}return{id:e.id,stepId:e.stepId,inputs:r||e.inputs,outputs:{success:!1,...t}}}o(Ab,"stepFailure");function Uir(e){return{id:e.id,stepId:e.stepId,inputs:e.inputs,outputs:Mir}}o(Uir,"stepStopped");async function Fir(e,t){if(!o(a=>!a||typeof a!="object"?!1:Object.entries(a).some(([u,c])=>{if(u==="onEmptyFilter"||c===void 0||c===null)return!1;if(u==="$and"||u==="$or"){let l=c;return Array.isArray(l?.conditions)&&l.conditions.length>0}return typeof c=="object"?Object.keys(c).length>0:!0}),"requiresEvaluation")(t.condition))return!0;let n={},i=o(a=>{let u=(0,pA.cloneDeep)(a);for(let c of Object.values(u))if(c)if(wX(c))c.conditions=c.conditions.map(i);else for(let[l,f]of Object.entries(c))n[l]=nr(l,e),typeof f=="string"&&Ai(f).length>0&&(c[l]=nr(f,e));return u},"evaluateBindings");return Et.runQuery([n],i(t.condition)).length>0}o(Fir,"branchMatches");async function Bir(e){e.env=await Nc();try{let{config:t}=await yn.getSettingsConfigDoc();e.settings={url:t.platformUrl,logo:t.logoUrl,company:t.company}}catch{e.settings={}}}o(Bir,"enrichBaseContext");function qir(e,t){e.trigger.outputs={...e.trigger.outputs,...t},e.steps[0]=e.trigger}o(qir,"setTriggerOutput");async function jir(e){let t=e.data.automation?.definition?.trigger;if(!t||!gM(t)&&!jc(t))return;let r=e.data.event.appId,n=e.data.automation._id;if(!r)throw new Error("Unable to execute, event doesn't contain app ID.");if(!n)throw new Error("Unable to execute, event doesn't contain automation ID.");e.data.automation=await x.automations.get(n)}o(jir,"reloadAutomation");var Hk=class{static{o(this,"Orchestrator")}constructor(t,r={}){this.job=t,this.stopped=!1,this.onProgress=r.onProgress,this.job.data.automation=KGe(t.data.automation);let n=t.data.event.metadata?.automationChainCount||0;this.emitter=new X3e(n+1)}get automation(){return this.job.data.automation}get appId(){return this.job.data.event.appId}isCron(){return this.automation.definition.trigger.stepId===kir}async stopCron(t,r){if(!this.isCron())return;let n=`CRON disabled reason=${t} - ${this.appId}/${this.automation._id}`;Ne.logWarn(n),await R3e(this.job.id);let{result:i}=r||{};i&&(qir(i,{success:!1,status:"stopped_error"}),i.status="stopped_error",await this.logResult(i))}async logResult(t){await z3e(this.automation,t)}async getMetadata(){let t=tqe(this.automation._id);return await C.getWorkspaceDB().tryGet(t)||{_id:t,errorCount:0}}async incrementErrorCount(){let t=C.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(s){r=s,await fe.wait(1e3+Math.random()*1e3)}}Ne.logAlertWithInfo("Failed to update error count in automation metadata",t.name,this.automation._id,r)}isProd(){return _f(this.appId)}hasErrored(t){return t._error===!0}reportStepProgress(t,r,n,i){if(!this.onProgress)return;let s=i?._loopIteration;this.onProgress({automationId:this.automation._id,appId:this.appId,blockId:t.id,stepId:t.stepId,status:r,occurredAt:Date.now(),result:n,...s?{loop:s}:{}})}async execute(){return await Mf.default.trace("execute",async t=>{t.addTags({appId:this.appId,automationId:this.automation._id});let r=(0,pA.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"};this.onProgress?.({automationId:this.automation._id,appId:this.appId,blockId:r.automation.definition.trigger.id,stepId:r.automation.definition.trigger.stepId,status:"running",occurredAt:Date.now()});let s={trigger:n.outputs,steps:{0:n.outputs},stepsByName:{},stepsById:{},user:n.outputs.user,state:{},_error:!1,_stepIndex:1,_stepResults:[]};await Bir(s);let a=this.job.data.event.timeout||ne.AUTOMATION_THREAD_TIMEOUT,u=[];try{u=await fe.withTimeout(a,()=>this.executeSteps(s,r.automation.definition.steps)),this.stopped?i.status="stopped":this.hasErrored(s)&&(i.status="error")}catch(f){if(f.errno==="ETIME")t.addTags({timeout:!0}),i.status="timed_out",u=s._stepResults;else throw f}i.steps.push(...u);let c=0;this.isProd()&&this.isCron()&&this.hasErrored(s)&&(c=await this.incrementErrorCount()||0),c>=cqe?(await this.stopCron("errors",{result:i}),t?.addTags({shouldStop:!0})):await this.logResult(i),Object.keys(s?.state||{}).length>0&&(i.state=s.state);let l={success:"success",error:"error",stopped:"stopped"};return this.onProgress?.({automationId:this.automation._id,appId:this.appId,blockId:n.id,stepId:n.stepId,status:l[i.status]||"error",occurredAt:Date.now(),result:n}),i})}async executeSteps(t,r){return await Mf.default.trace("executeSteps",async()=>{let n=0,i=[],s=o(u=>u.outputs.success===!1?"error":u.outputs.status==="stopped"?"stopped":"success","progressStatus");function a(u,c,l=!1){u.stepId==="EXTRACT_STATE"&&!l&&(t.state??={},t.state[c.inputs.key]=c.outputs.value),t.steps[u.id]=c.outputs,t.steps[u.name||u.id]=c.outputs,t.stepsById[u.id]=c.outputs,t.stepsByName[u.name||u.id]=c.outputs,t.previous=c.outputs,t._stepIndex||=0,t.steps[t._stepIndex]=c.outputs,t._stepIndex++,c.outputs.success===!1&&(t._error=!0),t._stepResults.push(c),i.push(c)}for(o(a,"addToContext");n<r.length&&!this.stopped;){let u=r[n];switch(u.stepId){case"BRANCH":{let c=await this.executeBranchStep(t,u);t._stepResults.push(...c),i.push(...c),c[0]&&this.reportStepProgress(u,s(c[0]),c[0],t),n++;break}case"LOOP_V2":{this.reportStepProgress(u,"running",void 0,t);let c=await this.executeLoopStep(t,u);if(u.isLegacyLoop){let l=u.inputs.children?.[0];l&&a(l,c,!0)}else a(u,c,!0);if(this.reportStepProgress(u,s(c),c,t),c.outputs.success===!1&&c.outputs.status==null)return i;n++;break}default:{this.reportStepProgress(u,"running",void 0,t),a(u,await It.addAction(async()=>{let l=await this.executeStep(t,u);return u.stepId==="EXTRACT_STATE"&&(t.state??={},t.state[l.inputs.key]=l.outputs.value),Le.action.automationStepExecuted({stepId:u.stepId}),l}));let c=i.at(-1);if(c&&(this.reportStepProgress(u,s(c),c,t),u.stepId==="TRIGGER_AUTOMATION_RUN"&&c.outputs.success===!1&&(c.outputs.status==="error"||c.outputs.status==="stopped_error")))return i;n++;break}}}return i})}async executeLoopStep(t,r){return await Mf.default.trace("executeLoopStep",async n=>{let i=(0,pA.cloneDeep)(r.inputs.children)||[],s=r.inputs;await UN(s,t);let a=GGe(r),u=(t._loopDepth||0)+1;t._loopDepth=u;try{let c=0,l=[];try{l=$Ge(r)}catch{return n.addTags({status:"INCORRECT_TYPE",iterations:c}),Ab(r,{status:"INCORRECT_TYPE"})}let d=r.isLegacyLoop?Number.MAX_SAFE_INTEGER:VGe(r),p=HGe(i,d),h=Math.min(l.length,a);for(;c<l.length;c++){let g=l[c];if(c===a)return n.addTags({status:"max_iterations_reached",iterations:c}),Ab(r,sb(p,"max_iterations_reached",c));if(WGe(r,g))return n.addTags({status:"FAILURE_CONDITION_MET",iterations:c}),Ab(r,sb(p,"FAILURE_CONDITION_MET",c));let y=t.loop,b=t._loopIteration;t.loop={currentItem:g},t._loopIteration={current:c+1,total:h};try{let w=t._stepIndex,E=await this.executeSteps(t,i);t._stepIndex=w;for(let T of E)i.some(A=>A.id===T.id)&&QGe(p,T,c);if(E.some(T=>T.outputs.success===!1))return Ab(r,sb(p,void 0,void 0,!0));if(this.stopped){let T=sb(p,void 0,c+1);return T.status="stopped",n.addTags({status:"stopped",iterations:c+1}),Vk(r,T)}}finally{t.loop=y,t._loopIteration=b}}let m=c===0?"no_iterations":void 0;return Vk(r,sb(p,m,c))}finally{t._loopDepth=u-1}})}async executeBranchStep(t,r){return await Mf.default.trace("executeBranchStep",async n=>{let{branches:i,children:s}=r.inputs;for(let a of i)if(await Fir(t,a)){n.addTags({branchName:a.name,branchId:a.id});let u=Vk(r,{branchName:a.name,status:`${a.name} branch taken`,branchId:`${a.id}`});this.reportStepProgress(r,"running",u,t);let c=await this.executeSteps(t,s?.[a.id]||[]);return[u,...c]}return n.addTags({status:"No branch condition met"}),[Ab(r,{status:"No branch condition met"})]})}async executeStep(t,r){return await Mf.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}),Uir(r);let i=await Q3e(r.stepId);if(i==null)throw new Error(`Cannot find automation step by name ${r.stepId}`);let s=(0,pA.cloneDeep)(r.inputs);r.stepId!=="EXECUTE_SCRIPT_V2"&&r.stepId!=="EXTRACT_STATE"&&(s=await UN(s,t)),s=uJ(s,r.schema.inputs.properties);let a;try{a=await Mf.default.trace("fn",()=>i({inputs:s,appId:this.appId,emitter:this.emitter,context:t}))}catch(u){return Ab(r,{status:"error",error:Ye(u)})}return r.stepId==="FILTER"&&"result"in a&&a.result===!1&&(this.stopped=!0,a.status="stopped"),r.stepId==="TRIGGER_AUTOMATION_RUN"&&"status"in a&&a.status==="stopped"&&(this.stopped=!0),n.addTags({outputsKeys:Object.keys(a)}),Vk(r,a,s)})}};async function t4e(e,t={}){let r=e.data.event.appId;if(!r)throw new Error("Unable to execute, event doesn't contain workspace ID.");return await Mf.default.trace("automation.executeInThread",async n=>(n.addTags({workspaceId:r,automationId:e.data.automation?._id}),await C.doInWorkspaceContext(r,async()=>{await jir(e),await C.ensureSnippetContext();let i=await Nc();return await C.doInEnvironmentContext(i,async()=>new Hk(e,t).execute())})))}o(t4e,"executeInThread");var v3e=o(async e=>{let t=e.data.event.appId;if(!t)throw new Error("Unable to execute, event doesn't contain app ID.");await C.doInWorkspaceContext(t,async()=>{await new Hk(e).stopCron("stalled")})},"removeStalled");var QNn=Ge.triggers.definitions,r4e={removeOnComplete:!0,removeOnFail:!0};async function Wir(){return(await C.getWorkspaceDB().allDocs(Ac(null,{include_docs:!0}))).rows.map(r=>r.doc)}o(Wir,"getAllAutomations");async function $ir(e,t){let r=e.row.tableId;if(e.appId==null)throw`No appId specified for ${t} - check event emitters.`;!r||!await ZJ(r)||await C.doInWorkspaceContext(e.appId,async()=>{let n=await Wir();n=n.filter(i=>{let s=i.definition.trigger,a=s?.inputs;return s&&s.event===t&&!i.disabled&&a?.tableId===e.row.tableId});for(let i of n){if(!ne.ALLOW_DEV_AUTOMATIONS&&j8(e.appId)&&!await Cz(i._id))continue;if(await n4e(i,{row:e.row,oldRow:e.oldRow}))try{await Tb.add({automation:i,event:e},r4e)}catch(a){Ne.logAlert("Failed to queue automation",a)}}})}o($ir,"queueRelevantRowAutomations");async function j7(e,t){try{await $ir(e,t)}catch(r){Ne.logWarn("Unable to process row event",r)}}o(j7,"queueRowAutomations");Ah.on("row:save",async function(e){!e||!e.row||!e.row.tableId||await j7(e,"row:save")});Ah.on("row:update",async function(e){!e||!e.row||!e.row.tableId||await j7(e,"row:update")});Ah.on("row:delete",async function(e){!e||!e.row||!e.row.tableId||await j7(e,"row:delete")});function Gir(e,t){return Et.runQuery([e],t).length>0}o(Gir,"rowPassesFilters");function $k(e){return e!==null&&"steps"in e&&Array.isArray(e.steps)}o($k,"isAutomationResults");async function kc(e,t,{getResponses:r,onProgress:n}={}){if(e.disabled)throw new Error("Automation is disabled");if(sn.automations.isAppAction(e)&&!await Cz(e._id)){t.fields==null&&(t.fields={});let a={},u=e.definition.trigger.inputs||{},c="fields"in u?u.fields:{};for(let l of Object.keys(c||{}))a[l]=Sh(t.fields[l],c[l]);t.fields=a}else(sn.automations.isRowAction(e)||sn.automations.isWebhookAction(e))&&(t={...t,...t.fields,fields:{}});let i={automation:e,event:t};return await n4e(e,{row:i.event?.row??{},oldRow:i.event?.oldRow??{}})?r?(i.event={...i.event,appId:C.getWorkspaceId(),automation:e},t4e({data:i},{onProgress:n})):Tb.add(i,r4e):{outputs:{success:!1,status:"stopped"},message:"Automation did not run. Filter conditions in trigger were not met."}}o(kc,"externalTrigger");async function n4e(e,t){let r=e.definition.trigger,n=r.inputs,i=n?.filters,s=n?.tableId;if(!i)return!0;if(r.stepId===Ge.triggers.definitions.ROW_UPDATED.stepId||r.stepId===Ge.triggers.definitions.ROW_SAVED.stepId){let a=await ob(s,t.row);return Gir(a,i)}return!0}o(n4e,"checkTriggerFilters");var i4e="Trigger this automation (APP triggers only). Returns all step outputs.",o4e="Fields map: key/value pairs. Values must be string, number, boolean, or array (no nested objects).",Vir=o(e=>{let r=e.definition?.trigger?.inputs?.fields;return!r||Object.keys(r).length===0?"":Object.entries(r).map(([n,i])=>`${n} (${i})`).join(", ")},"getAutomationFieldsSummary"),Hir=o(async({automationId:e,fields:t})=>{let r=t??{},i=await C.getWorkspaceDB().tryGet(e);if(!i)return{error:`Automation with ID ${e} not found`};let s=i.definition?.trigger?.stepId;if(s!=="APP")return{error:`Cannot trigger automation '${i.name}'. Only APP trigger type supported. This automation has: ${s}`};let a=await kc(i,{fields:r},{getResponses:!0});return $k(a)?{success:a.status==="success",status:a.status,steps:a.steps}:{success:!1,error:a.message||"Automation did not trigger"}},"triggerAutomationById"),Qir=[{name:"list_automations",sourceType:"AUTOMATION",sourceLabel:"Budibase",description:"List all automations in the current app",tool:(0,Qk.tool)({description:"List all automations in the current app",inputSchema:ko.z.object({}),execute:async()=>({automations:await x.automations.fetch()})})},{name:"get_automation",sourceType:"AUTOMATION",sourceLabel:"Budibase",description:"Get details about a specific automation by ID",tool:(0,Qk.tool)({description:"Get details about a specific automation by ID",inputSchema:ko.z.object({automationId:ko.z.string().describe("The ID of the automation to retrieve")}),execute:async e=>{let{automationId:t}=e;return{automation:await x.automations.get(t)}}})}],Kir=o((e=[])=>{let t=e.filter(r=>r._id&&r.definition?.trigger?.stepId==="APP").map(r=>{let n=r.name||r._id,s=`${r._id.replace(/[^A-Za-z0-9_-]/g,"_")}_trigger`.substring(0,64),a=Vir(r),u=a?`${o4e} Available fields: ${a}.`:o4e,c=a?`Trigger "${n}" automation. ${i4e} Fields: ${a}.`:`Trigger "${n}" automation. ${i4e}`;return{name:s,readableName:`${n}.trigger`,sourceType:"AUTOMATION",sourceLabel:"Budibase",description:c,tool:(0,Qk.tool)({description:c,inputSchema:ko.z.object({fields:ko.z.record(ko.z.string(),ko.z.union([ko.z.string(),ko.z.number(),ko.z.boolean(),ko.z.array(ko.z.unknown())])).nullish().describe(u)}),execute:async l=>{let{fields:f}=l;return Hir({automationId:r._id,fields:f})}})}});return[...Qir,...t]},"createAutomationTools"),s4e=Kir;var W7=require("ai"),hA=require("zod");var zir=[{name:"list_tables",sourceType:"INTERNAL_TABLE",sourceLabel:"Budibase",description:"List all tables in the current app",tool:(0,W7.tool)({description:"List all tables in the current app",inputSchema:hA.z.object({showSchema:hA.z.boolean().describe("Whether to show the schema of the tables. This can be extemely large. Default to false to save on tokens.").default(!1)}),execute:async e=>{let{showSchema:t}=e,r=await x.tables.getAllTables();return t?{tables:r}:{tables:r.map(n=>({id:n._id,tableName:n.name}))}}})},{name:"get_table",sourceType:"INTERNAL_TABLE",sourceLabel:"Budibase",description:"Get details about a specific table by ID",tool:(0,W7.tool)({description:"Get details about a specific table by ID",inputSchema:hA.z.object({tableId:hA.z.string().describe("The ID of the table to retrieve")}),execute:async e=>{let{tableId:t}=e;return{table:await x.tables.getTable(t)}}})}],a4e=zir;var c4e=require("ai"),Ve=require("zod");var u4e="CRITICAL: Use plain text values only. Do NOT include HTML tags, markdown formatting, or content containing quotes, backslashes, or special characters - these break JSON parsing. Summarize or strip complex content. Max 500 characters per field.",Kk='Row data as a JSON object. Example: {"name": "John", "age": 30}. Do NOT nest this inside a string; pass the object directly. Values must be plain text - no HTML, markdown, or special characters.',$7='Query filters object. Structure: { operator: { fieldName: value } }. CRITICAL: fieldName must match an existing column in the table schema exactly (case-sensitive). Valid operators: "equal", "notEqual", "empty", "notEmpty", "fuzzy", "string", "contains", "notContains", "containsAny", "oneOf", "range". IMPORTANT: Do NOT use "and", "or", or nested $and/$or conditions. All operators must be top-level keys in a single flat object. Operators oneOf and containsAny require array values (e.g. {"oneOf": {"status": ["active", "pending"]}}). To combine multiple filters, include multiple operator keys: {"fuzzy": {"name": "John", "city": "London"}, "equal": {"status": "active"}}. Examples: Find where status equals "active": {"equal": {"status": "active"}}. Find where status is "active" OR "pending": {"oneOf": {"status": ["active", "pending"]}}. Find where tags contains any of "urgent", "review": {"containsAny": {"tags": ["urgent", "review"]}}. Find where name is not empty: {"notEmpty": {"name": true}}. Find where price is within the range of 10 to 100: {"range": {"price": {"low": 10, "high": 100}}}. Combine fuzzy name with exact status: {"fuzzy": {"name": "John"}, "equal": {"status": "active"}}.',Yir=30,Jir=o(e=>new Set(e==="external"?no:Hr),"getProtectedColumns"),Xir=o(e=>e.type==="formula"||e.type==="auto"||e.type==="ai"||e.autocolumn===!0,"isReadOnlyField"),l4e=o(e=>{switch(e.type){case"string":return"string";case"longform":return"longform";case"options":return"options";case"number":return"number";case"boolean":return"boolean";case"array":return"array";case"datetime":return"datetime";case"attachment":return"attachments";case"attachment_single":return"attachment";case"link":return"link";case"json":return"json";case"bb_reference":return"bb_reference";case"bb_reference_single":return"bb_reference_single";case"bigint":return"bigint";case"barcodeqr":return"barcode";case"signature_single":return"signature";default:return e.type}},"formatFieldType"),Zir=o(({name:e,schema:t})=>{let r=`${e} (${l4e(t)})`,n=t.constraints?.inclusion;return(t.type==="options"||t.type==="array")&&Array.isArray(n)&&n.length>0&&(r+=` options: ${n.join(" | ")}`),t.type==="link"&&"tableId"in t&&t.tableId&&(r+=` -> ${t.tableId}`),r},"formatFieldSummary"),eor=o((e,t)=>{let r=Jir(t);return Object.entries(e).filter(([n,i])=>!(r.has(n)||Xir(i))).map(([n,i])=>({name:n,schema:i}))},"getWritableFields"),tor=o(e=>{if(e.length===0)return"";let t=e.map(Zir),r=t.slice(0,Yir),n=t.length-r.length;return n>0&&r.push(`... +${n} more (use get_table for full schema)`),r.join(", ")},"buildSchemaSummary"),ror=o(e=>e?`${Kk} Available fields: ${e}.`:Kk,"buildDataFieldDescription"),nor=o((e,t)=>{if(e.length===0)return Ve.z.record(Ve.z.string(),Ve.z.any()).describe(Kk);let r={};for(let n of e){let i=l4e(n.schema),s=n.schema.constraints?.inclusion,a=Array.isArray(s)&&s.length>0?` Options: ${s.join(" | ")}.`:"";r[n.name]=Ve.z.any().describe(`Field type: ${i}.${a}`)}return Ve.z.object(r).partial().passthrough().describe(ror(t))},"buildRowDataSchema"),ior=o(e=>e?`${$7} Available fields: ${e}.`:$7,"buildSearchQueryDescription"),oor=o(e=>Ve.z.object({query:Ve.z.union([Ve.z.record(Ve.z.string(),Ve.z.any()),Ve.z.string()]).nullish().describe(ior(e)),sort:Ve.z.object({column:Ve.z.string().describe("Column to sort by"),order:Ve.z.enum(["ascending","descending"]).describe("Sort order")}).nullish().describe("Sort configuration"),limit:Ve.z.number().nullish().describe("Maximum number of results")}),"buildSearchInputSchema"),sor={list_rows:{description:"List rows in a given table with optional pagination",inputSchema:Ve.z.object({limit:Ve.z.number().nullish().describe("Maximum number of rows to return"),bookmark:Ve.z.union([Ve.z.string(),Ve.z.number()]).nullish().describe("Bookmark for pagination (returned from previous request)")}),execute:async(e,{limit:t,bookmark:r})=>{let n={tableId:e,query:{},limit:t??void 0,bookmark:r??void 0},i=await x.rows.search(n);return{rows:i.rows,hasNextPage:i.hasNextPage,bookmark:i.bookmark}}},get_row:{description:"Get a specific row by ID",inputSchema:Ve.z.object({rowId:Ve.z.string().describe("The ID of the row to retrieve")}),execute:async(e,{rowId:t})=>({row:await x.rows.find(e,t)})},create_row:{description:`Create a new row. Only include fields that match the table schema. ${u4e}`,inputSchema:Ve.z.object({data:Ve.z.record(Ve.z.string(),Ve.z.any()).describe(Kk)}),execute:async(e,{data:t})=>{let{row:r}=await x.rows.save(e,t,void 0);return{row:r}}},update_row:{description:`Update an existing row. ${u4e}`,inputSchema:Ve.z.object({rowId:Ve.z.string().describe("The ID of the row to update"),rowRev:Ve.z.string().describe("The current _rev of the row (if known)"),data:Ve.z.record(Ve.z.string(),Ve.z.any()).describe('The updated data as a JSON object. Example: {"name": "Jane"}. Do NOT nest this inside a string; pass the object directly. Values must be plain text - no HTML, markdown, or special characters.')}),execute:async(e,{rowId:t,rowRev:r,data:n})=>{let s={...await x.rows.find(e,t),...n,_id:t,_rev:r},{row:a}=await x.rows.save(e,s,void 0);return{row:a}}},search_rows:{description:"Search for rows in a table based on criteria. IMPORTANT: You can ONLY filter on fields that exist in the table schema. Use get_table or list_tables first to see available field names. Searching on non-existent fields will fail.",inputSchema:Ve.z.object({query:Ve.z.union([Ve.z.record(Ve.z.string(),Ve.z.any()),Ve.z.string()]).nullish().describe($7),sort:Ve.z.object({column:Ve.z.string().describe("Column to sort by"),order:Ve.z.enum(["ascending","descending"]).describe("Sort order")}).nullish().describe("Sort configuration"),limit:Ve.z.number().nullish().describe("Maximum number of results")}),execute:async(e,{query:t,sort:r,limit:n})=>{let i=t;if(typeof i=="string")try{i=JSON.parse(i)}catch(u){return{error:`Invalid JSON in query parameter: ${u}`}}let s={tableId:e,query:i||{},limit:n??void 0};return r&&(s.sort=r.column,s.sortOrder=r.order==="ascending"?"ascending":"descending"),{rows:(await x.rows.search(s)).rows}}}},aor=o(e=>e.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" "),"formatActionLabel"),f4e=o(({tableId:e,tableName:t,tableSourceType:r,tableSchema:n,sourceLabel:i,sourceIconType:s})=>{let a=r==="external",u=a?"EXTERNAL_TABLE":"INTERNAL_TABLE",c=i||(a?"External":"Budibase"),l=eor(n,r),f=tor(l),d=nor(l,f),p=oor(f);return Object.entries(sor).map(([h,m])=>{let g=`${aor(h)} in "${t}". ${m.description}`,b=`${e.replace(/[^A-Za-z0-9_-]/g,"_")}_${h}`.substring(0,64),w=m.inputSchema;return h==="create_row"?w=Ve.z.object({data:d}):h==="update_row"?w=Ve.z.object({rowId:Ve.z.string().describe("The ID of the row to update"),rowRev:Ve.z.string().describe("The current _rev of the row (if known)"),data:d}):h==="search_rows"&&(w=p),{name:b,readableName:`${t}.${h}`,sourceType:u,sourceLabel:c,sourceIconType:s,description:g,tool:(0,c4e.tool)({description:g,inputSchema:w,execute:async E=>m.execute(e,E)})}})},"createRowTools");var d4e=o((e=[],t={},r={},n=[])=>{let i=[...s4e(n),...a4e],s=e.filter(a=>a._id).flatMap(a=>{let u=a.sourceType==="external";return f4e({tableId:a._id,tableName:a.name||a._id,tableSourceType:a.sourceType,tableSchema:a.schema,sourceLabel:u?t[a.sourceId]||"External":"Budibase",sourceIconType:u?r[a.sourceId]:void 0})});return[...i,...s]},"getBudibaseTools");var Yk=require("ai");var h4e=require("ai"),G7=require("zod");var p4e=o((e,t)=>e.toLowerCase().replace(/[^a-z0-9_-]/g,"_").replace(/_+/g,"_").replace(/^_|_$/g,"").substring(0,t),"sanitiseNameSegment"),uor=o((e,t,r)=>{let n=p4e(t||"datasource",20)||"datasource",i=p4e(e.name||"query",24)||"query";return`${r}_${n}_${i}`},"buildScopedToolName"),cor=o(e=>{let t={};for(let r of e.parameters||[])t[r.name]=G7.z.string().optional().describe(`Parameter: ${r.name}`);return G7.z.object(t)},"buildParametersSchema"),m4e=o(({query:e,sourceType:t,sourceLabel:r,sourceIconType:n,description:i,namePrefix:s})=>{let a=uor(e,r,s),u=cor(e);return{name:a,readableName:e.name,description:i,sourceType:t,sourceLabel:r,sourceIconType:n,tool:(0,h4e.tool)({description:i,inputSchema:u,execute:async c=>{let l=C.getWorkspaceId();if(!l)return{success:!1,error:"No app context available"};let f=Wr(l,null,{body:{parameters:c},params:{queryId:e._id}});try{await Sb(f);let{data:d,...p}=f.body||{};return{success:!0,data:d,info:p}}catch(d){return{success:!1,error:(d instanceof Error?d.message:String(d))||"Query execution failed"}}}})}},"createQueryTool"),g4e=o((e,t)=>{let r=e.restTemplateMetadata?.description?`${e.name}: ${e.restTemplateMetadata.description}`:`Execute REST query: ${e.name}`;return m4e({query:e,description:r,sourceType:"REST_QUERY",sourceLabel:t||"API",namePrefix:"rest"})},"createRestQueryTool"),y4e=o((e,t,r)=>m4e({query:e,description:`Execute datasource query: ${e.name}`,sourceType:"DATASOURCE_QUERY",sourceLabel:t||"Datasource",sourceIconType:r,namePrefix:"ds"}),"createDatasourceQueryTool");var lor=o(e=>{if(!e||typeof e!="object"||!("error"in e))return;let{error:t}=e;if(!(t==null||t===!1))return t instanceof Error?t.message||"Tool execution failed":String(t)},"getToolFailure"),dor=o(e=>{let t=e.tool.execute;if(!t)return e.tool;let r=o(async(...n)=>{let i=await t(...n),s=lor(i);if(s)throw new Error(s);return i},"wrappedExecute");return{...e.tool,execute:r}},"wrapTool"),b4e=o(e=>Object.fromEntries(e.map(t=>[t.name,dor(t)])),"toToolSet");var _4e=require("ai"),zk=require("zod");var por=zk.z.object({query:zk.z.string().describe("The search query to find relevant information"),num_results:zk.z.number().optional().default(10).describe("Number of results to return")}),V7=o(e=>({name:"search_web_search",sourceType:"SEARCH",sourceLabel:"Exa",description:"Search the web using Exa",tool:(0,_4e.tool)({description:"Search the web using Exa",inputSchema:por,execute:async t=>{let r=await fetch("https://api.exa.ai/search",{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"},body:JSON.stringify({query:t.query,num_results:t.num_results})});if(!r.ok){let n=await r.text();throw new Error(`Exa error: ${r.status} ${r.statusText} - ${n}`)}return r.json()}})}),"createExaTool");var Ob=require("zod"),w4e=require("ai");var hor=Ob.z.object({objective:Ob.z.string().describe("Natural language description of what to search for"),search_queries:Ob.z.array(Ob.z.string()).describe("Array of search query strings"),max_results:Ob.z.number().optional().default(10).describe("Maximum number of results to return")}),H7=o(e=>({name:"search_web_search",description:"Search the web using Parallel AI",sourceType:"SEARCH",sourceLabel:"Parallel Search",tool:(0,w4e.tool)({description:"Search the web using Parallel AI",inputSchema:hor,execute:async t=>{let r=await fetch("https://api.parallel.ai/v1beta/search",{method:"POST",headers:{"x-api-key":e,"parallel-beta":"search-extract-2025-10-10","Content-Type":"application/json"},body:JSON.stringify({objective:t.objective,search_queries:t.search_queries,max_results:t.max_results,excerpts:{max_chars_per_result:2e3}})});if(!r.ok)throw new Error(`Parallel error: ${r.status} ${r.statusText}`);return r.json()}})}),"createParallelTool");var mor=new Set(["list_tables","get_table","list_automations","get_automation"]),E4e=o(e=>mor.has(e.name),"isHelperTool");function S4e(e){return{name:e.name,readableName:e.readableName,description:e.description,sourceType:e.sourceType,sourceLabel:e.sourceLabel,sourceIconType:e.sourceIconType}}o(S4e,"toToolMetadata");async function Q7(e){let[t,r,n,i,s]=await Promise.all([x.queries.fetch(),x.datasources.fetch(),e?x.ai.configs.find(e):Promise.resolve(void 0),x.tables.getAllTables(),x.automations.fetch()]),a=n?.webSearchConfig,u=new Map(r.filter(h=>!!h._id).map(h=>[h._id,h])),c=Object.fromEntries(r.filter(h=>!!h._id).map(h=>[h._id,h.name||"Datasource"])),l=Object.fromEntries(r.filter(h=>!!h._id).map(h=>[h._id,h.source||"CUSTOM"])),f=t.flatMap(h=>{let m=u.get(h.datasourceId);return!m||m.source!=="REST"?[]:[g4e(h,m.name||"API")]}),d=t.flatMap(h=>{let m=u.get(h.datasourceId);return!m||m.source==="REST"?[]:[y4e(h,m.name||"Datasource",m.source||"CUSTOM")]}),p=[...d4e(i,c,l,s),...f,...d];return a?.apiKey&&(a.provider==="exa"?p.push(V7(a.apiKey)):a.provider==="parallel"&&p.push(H7(a.apiKey))),p}o(Q7,"getAvailableTools");async function gor(e){return(await Q7(e)).filter(r=>!E4e(r)).map(S4e)}o(gor,"getAvailableToolsMetadata");async function yor(e,t={}){let{baseSystemPrompt:r,includeGoal:n=!0}=t,i=await Q7(e.aiconfig),s=new Set(e.enabledTools||[]),a=bor(i.filter(c=>s.has(c.name)&&!E4e(c)),i);return{systemPrompt:Mt.composeAutomationAgentSystemPrompt({baseSystemPrompt:r,goal:n?e.goal:void 0,promptInstructions:e.promptInstructions,includeGoal:n}),tools:b4e(a)}}o(yor,"buildPromptAndTools");function bor(e,t){let r=new Set(e.map(i=>i.name)),n=new Map(t.map(i=>[i.name,i]));if(e.some(i=>i.sourceType==="EXTERNAL_TABLE"||i.sourceType==="INTERNAL_TABLE"))for(let i of["get_table","list_tables"]){if(r.has(i))continue;let s=n.get(i);s&&(e.push(s),r.add(s.name))}if(e.some(i=>i.sourceType==="AUTOMATION"))for(let i of["get_automation","list_automations"]){if(r.has(i))continue;let s=n.get(i);s&&(e.push(s),r.add(s.name))}return e}o(bor,"addHelperTools");var _or=new Set(["output-available","output-error","output-denied"]);function k7(e){let t=[];for(let r of e)if(!(r.role!=="assistant"||!r.parts))for(let n of r.parts)(0,Yk.isToolUIPart)(n)&&!_or.has(n.state)&&t.push({toolName:(0,Yk.getToolName)(n),toolCallId:n.toolCallId,state:n.state});return t}o(k7,"findIncompleteToolCalls");function M7(e,t,r){for(let n of t)n.toolCallId&&e.add(n.toolCallId);for(let n of r)n.toolCallId&&e.delete(n.toolCallId)}o(M7,"updatePendingToolCalls");function U7(e){let t=e.map(r=>r.toolName).join(", ");return`The AI model failed to complete tool execution${t?` for: ${t}`:""}. This may be due to a compatibility issue with the selected model. Please try a different model or try again.`}o(U7,"formatIncompleteToolCallError");var X7={};$(X7,{enqueueAgentFileIngestion:()=>J7,getQueue:()=>Y7,init:()=>T4e});var wor=2,Eor=Je.Duration.fromSeconds(10).toMs(),Sor=Je.Duration.fromMinutes(10).toMs(),K7,z7=!1;function Y7(){return K7||(K7=new Xr.BudibaseQueue(Xr.JobQueue.RAG_INGESTION,{maxStalledCount:3,jobOptions:{attempts:5,backoff:{type:"exponential",delay:Eor},timeout:Sor,removeOnComplete:!0,removeOnFail:1e3},jobTags:e=>({workspaceId:e.workspaceId,agentId:e.agentId,fileId:e.fileId})})),K7}o(Y7,"getQueue");function T4e(e=wor){if(z7)return Promise.resolve();try{return z7=!0,Y7().process(e,async t=>{let{workspaceId:r,agentId:n,fileId:i,objectStoreKey:s}=t.data;await C.doInWorkspaceContext(r,async()=>{let a,u;try{a=await da.getOrThrow(n)}catch(c){if(c?.status===404){await t.discard();return}throw c}try{u=await da.getAgentFileOrThrow(i)}catch(c){if(c?.status===404){await t.discard();return}throw c}if(!u.objectStoreKey&&s&&(u.objectStoreKey=s),!u.objectStoreKey)throw new Error("Agent file does not have an object store key");try{let c=await Tor(u.objectStoreKey),l=await XY(a,u,c);u.status="ready",u.chunkCount=l.total,u.processedAt=new Date().toISOString(),u.errorMessage=void 0,await da.updateAgentFile(u)}catch(c){throw await vor(u,t,c),c}})})}catch{console.error("Error initialising the RAG ingestion queue"),z7=!1}}o(T4e,"init");async function J7(e){return T4e(),await Y7().add(e,{jobId:e.fileId})}o(J7,"enqueueAgentFileIngestion");var Tor=o(async e=>{let{stream:t}=await ge.getReadStream(mr.APPS,e),r=[];for await(let n of t)r.push(new Uint8Array(n));return Buffer.concat(r)},"loadFileBuffer"),vor=o(async(e,t,r)=>{let n=t.opts.attempts||1;t.attemptsMade+1>=n&&(e.status="failed",e.errorMessage=r?.message||"Failed to process uploaded file",e.chunkCount=0,await da.updateAgentFile(e))},"handleProcessingError");var Aor=o((e,t,r,n)=>`${e}/ai/agents/${t}/files/${r}/${n}`,"buildAgentFileObjectStoreKey"),Ror=o(async e=>{let t=C.getOrThrowWorkspaceId(),r=Ze.generateAgentFileID(e.agentId),n=Aor(t,e.agentId,r,e.filename);try{await ge.upload({bucket:mr.APPS,filename:n,body:e.buffer,type:e.mimetype});let i=await eJ({id:r,agentId:e.agentId,filename:e.filename,mimetype:e.mimetype,objectStoreKey:n,size:e.size??e.buffer.byteLength,uploadedBy:e.uploadedBy});try{return await J7({workspaceId:t,agentId:e.agentId,fileId:i._id,objectStoreKey:n}),i}catch(s){throw i.status="failed",i.errorMessage=s?.message||"Failed to process uploaded file",i.chunkCount=0,await tJ(i),s}}catch(i){throw await ge.deleteFile(mr.APPS,n).catch(()=>{}),i}},"uploadAgentFile");var eM={};$(eM,{create:()=>e9,getOrThrow:()=>Xk,getSingle:()=>Jk,update:()=>Zk});var Z7=o(e=>({...e,live:e.live??!1,agents:e.agents??[]}),"withDefaults"),Oor=o(e=>{if(e!==void 0){if(!Array.isArray(e))throw new V("conversationStarters must contain prompt entries",400);if(e.length>3)throw new V("conversationStarters may contain at most 3 starters",400);return e.map(t=>{if(!t||typeof t!="object")throw new V("conversationStarters must contain prompt entries",400);if(typeof t.prompt!="string")throw new V("conversationStarters must contain prompt entries",400);return{prompt:t.prompt}})}},"normalizeConversationStarters"),v4e=o(e=>{if(e===void 0)return;if(!Array.isArray(e))throw new V("agents must contain valid agentId entries",400);if(e.length===0)return[];if(!e.every(r=>typeof r?.agentId=="string"&&r.agentId.trim().length))throw new V("agents must contain valid agentId entries",400);return e.map(r=>({agentId:r.agentId,isEnabled:r.isEnabled===!0,isDefault:r.isDefault===!0,conversationStarters:Oor(r.conversationStarters)}))},"normalizeAgents");async function Jk(){let r=(await C.getWorkspaceDB().allDocs(Ze.getDocParams("chatapp",void 0,{include_docs:!0,limit:1}))).rows[0]?.doc;return r?Z7(r):void 0}o(Jk,"getSingle");async function Xk(e){if(!e)throw new V("chatAppId is required",400);let r=await C.getWorkspaceDB().tryGet(e);if(!r)throw new V("Chat App not found",404);return Z7(r)}o(Xk,"getOrThrow");async function e9(e){let t=C.getWorkspaceDB();if(await Jk())throw new V("Chat App already exists for this workspace",400);let n=v4e(e.agents===void 0?void 0:e.agents),i=new Date().toISOString(),s={_id:Ze.generateChatAppID(),createdAt:i,updatedAt:i,...e,agents:n??[]},{rev:a}=await t.put(s);return{...s,_rev:a}}o(e9,"create");async function Zk(e){if(!e._id||!e._rev)throw new V("_id and _rev are required",400);let t=C.getWorkspaceDB(),r=await t.tryGet(e._id);if(!r)throw new V("Chat App not found",404);let n=v4e(e.agents===void 0?r.agents??[]:e.agents),i=new Date().toISOString(),s={...r,...e,agents:n??[],updatedAt:i},{rev:a}=await t.put(s);return s._rev=a,Z7(s)}o(Zk,"update");var i9={};$(i9,{MSTeams:()=>n9,discord:()=>r9});var r9={};$(r9,{DISCORD_ASK_COMMAND:()=>Cor,DISCORD_NEW_COMMAND:()=>xor,buildDiscordInviteUrl:()=>kor,buildDiscordWebhookUrl:()=>Lor,disableAgentOnChatApp:()=>Por,getDiscordPublicKeyForRoute:()=>Wor,isDiscordTimestampFresh:()=>jor,resolveChatAppForAgent:()=>Nor,syncApplicationCommands:()=>For,validateDiscordIntegration:()=>Dor,verifyDiscordSignature:()=>Bor});var t9=B(require("crypto")),x4e=B(require("node-fetch"));var A4e=o(async(e,t)=>{let r=e.agents||[],n=r.find(s=>s.agentId===t);if(n?.isEnabled)return e;let i=n?r.map(s=>s.agentId===t?{...s,isEnabled:!0}:s):[...r,{agentId:t,isEnabled:!0,isDefault:!1}];return await Zk({...e,agents:i})},"enableAgentOnChatApp"),R4e=o(async({chatAppId:e,agentId:t})=>{let r=await Xk(e),n=r.agents||[],i=n.find(a=>a.agentId===t);if(!i||!i.isEnabled)return r;let s=n.map(a=>a.agentId===t?{...a,isEnabled:!1}:a);return await Zk({...r,agents:s})},"disableAgentOnChatApp"),tM=o(async({agentId:e,chatAppId:t})=>{if(t){let n=await Xk(t);return await A4e(n,e)}let r=await Jk();return r?await A4e(r,e):await e9({agents:[{agentId:e,isEnabled:!0,isDefault:!1}]})},"resolveChatAppForAgent"),rM=o(async({provider:e,chatAppId:t,agentId:r,useProdWorkspaceId:n=!1})=>{let i=await yn.getPlatformUrl({tenantAware:!0}),s=C.getWorkspaceId();if(!s)throw new V("workspaceId is required",400);let a=n?U.getProdWorkspaceID(s):s;return`${i.replace(/\/$/,"")}/api/webhooks/${e}/${a}/${t}/${r}`},"buildWebhookUrl");var I4e="https://discord.com/api/v10",Ior=300,Cor=$f.ASK,xor=$f.NEW,Dor=o(e=>{let t=e.discordIntegration;if(!t)throw new V("Discord integration is not configured for this agent",400);let r=t.applicationId?.trim(),n=t.publicKey?.trim(),i=t.botToken?.trim(),s=t.guildId?.trim();if(!r||!n||!i||!s)throw new V("Discord integration requires applicationId, publicKey, botToken, and guildId",400);return{applicationId:r,botToken:i,guildId:s,chatAppId:t.chatAppId?.trim()||void 0}},"validateDiscordIntegration"),Por=o(async(e,t)=>await R4e({chatAppId:e,agentId:t}),"disableAgentOnChatApp"),Nor=o(async(e,t)=>await tM({agentId:e,chatAppId:t}),"resolveChatAppForAgent"),Lor=o(async(e,t)=>await rM({provider:"discord",chatAppId:e,agentId:t,useProdWorkspaceId:!0}),"buildDiscordWebhookUrl"),kor=o(e=>`https://discord.com/oauth2/authorize?client_id=${e}&scope=bot+applications.commands&permissions=0`,"buildDiscordInviteUrl"),Mor=o(()=>[{name:$f.ASK,description:"Ask the configured Budibase agent",contexts:[1],options:[{type:3,name:"message",description:"Message to send to the agent",required:!0}]},{name:$f.NEW,description:"Start a new conversation with the configured agent",contexts:[1],options:[{type:3,name:"message",description:"Optional opening message",required:!1}]}],"buildGlobalCommandPayload"),Uor=o(()=>[{name:$f.ASK,description:"Ask the configured Budibase agent",options:[{type:3,name:"message",description:"Message to send to the agent",required:!0}]},{name:$f.NEW,description:"Start a new conversation with the configured agent",options:[{type:3,name:"message",description:"Optional opening message",required:!1}]}],"buildGuildCommandPayload"),C4e=o(async({url:e,botToken:t,payload:r})=>{let n=await(0,x4e.default)(e,{method:"PUT",headers:{Authorization:`Bot ${t}`,"Content-Type":"application/json"},body:JSON.stringify(r)});if(!n.ok){let i=await n.text();throw new V(`Discord command sync failed (${n.status}): ${i||n.statusText}`,400)}},"syncCommandsOnEndpoint"),For=o(async(e,t,r)=>{await C4e({url:`${I4e}/applications/${e}/commands`,botToken:t,payload:Mor()}),await C4e({url:`${I4e}/applications/${e}/guilds/${r}/commands`,botToken:t,payload:Uor()})},"syncApplicationCommands"),Bor=o(({publicKey:e,signature:t,timestamp:r,rawBody:n})=>{try{let i="302a300506032b6570032100",s=t9.default.createPublicKey({key:Buffer.from(`${i}${e}`,"hex"),format:"der",type:"spki"});return t9.default.verify(null,new Uint8Array(Buffer.from(`${r}${n}`)),s,new Uint8Array(Buffer.from(t,"hex")))}catch{return!1}},"verifyDiscordSignature"),qor=o(()=>{let e=Number(process.env.DISCORD_SIGNATURE_MAX_AGE_SECONDS);return(Number.isFinite(e)&&e>0?e:Ior)*1e3},"getDiscordSignatureMaxAgeMs"),jor=o((e,t=Date.now())=>{let r=Number(e);if(!Number.isFinite(r))return!1;let n=r*1e3;return Math.abs(t-n)<=qor()},"isDiscordTimestampFresh"),Wor=o(async({instance:e,agentId:t})=>{let r=U.getProdWorkspaceID(e);return await C.doInWorkspaceContext(r,async()=>{let i=(await tk(t)).discordIntegration?.publicKey?.trim();if(!i)throw new V("Discord public key is not configured for this agent",400);return i})},"getDiscordPublicKeyForRoute");var n9={};$(n9,{buildMSTeamsWebhookUrl:()=>Vor,resolveChatAppForAgent:()=>Gor,validateMSTeamsIntegration:()=>$or});var $or=o(e=>{let t=e.MSTeamsIntegration;if(!t)throw new V("Teams integration is not configured for this agent",400);let r=t.appId?.trim(),n=t.appPassword?.trim();if(!r||!n)throw new V("Teams integration requires appId (client ID) and appPassword (client secret value)",400);return{appId:r,appPassword:n,tenantId:t.tenantId?.trim()||void 0,chatAppId:t.chatAppId?.trim()||void 0}},"validateMSTeamsIntegration"),Gor=o(async(e,t)=>await tM({agentId:e,chatAppId:t}),"resolveChatAppForAgent"),Vor=o(async(e,t)=>await rM({provider:"ms-teams",chatAppId:e,agentId:t,useProdWorkspaceId:!0}),"buildMSTeamsWebhookUrl");var o9={};$(o9,{buildLiteLLMParams:()=>zL,generateRows:()=>Qor,generateTables:()=>Hor});async function Hor(e){let t=[],r={};try{for(let i of e)for(let s of Object.values(i.schema).filter(a=>a.type==="link")){if(!e.find(a=>a.name===s.tableId))throw new Error(`Table ${s.tableId} not found in the json response.`);if(s.tableId===i.name)throw new Error(`Self-referential relationships are not supported. Table ${i.name} cannot link to itself.`)}let n=(await x.tables.getAllInternalTables()).map(i=>i.name);for(let i of e){let s=fe.getSequentialName(n,i.name,{separator:" "}),a=await x.tables.create({...i,name:s,schema:{},primaryDisplay:void 0,sourceType:"internal",sourceId:Nn,type:"table",aiGenerated:!0});t.push({id:a._id,name:i.name}),r[i.name]=a._id}for(let i of e)for(let s of Object.values(i.schema))s.type==="link"?s.tableId=r[s.tableId]:s.type==="formula"&&(s.formula=`{{ js "${Buffer.from(s.formula).toString("base64")}" }}`);for(let i of e){let s=await x.tables.getTable(r[i.name]),a={...s.schema,...i.schema};for(let u of Object.keys(a))a[u].aiGenerated=!0;await x.tables.update({...s,schema:a,primaryDisplay:i.primaryDisplay})}}catch(n){console.log("Error generating tables, cleaning up created tables",n);let i=await x.tables.getTables(t.map(s=>s.id));throw await Promise.all(i.map(x.tables.internal.destroy)),n}return t}o(Hor,"generateTables");async function Qor(e,t,r){let n={},i=[],s=[];for(let a of Object.keys(e)){let u=r[a],c={};for(let f of Object.values(u.schema).filter(d=>d.type==="link"))c[f.name]=null;let l=Object.values(u.schema).filter(f=>["attachment","attachment_single"].includes(f.type));s.push(...e[a].map(async f=>{await Kor(f,l);let d=u._id,p=await x.rows.save(d,{...f,...c,_id:void 0},t);n[d]??={},n[d][f._id]=p.row._id;let h=Object.keys(c).reduce((m,g)=>(f[g]&&(m[g]={tableId:u.schema[g].tableId,rowId:f[g]}),m),{});Object.keys(h).length&&i.push({tableId:p.table._id,rowId:p.row._id,data:h})}))}await Promise.all(s),await Promise.all(i.map(async a=>{let u=await x.rows.find(a.tableId,a.rowId),c=Object.keys(a.data).reduce((l,f)=>(l[f]=[...u[f]||[],...a.data[f].rowId.map(d=>n[a.data[f].tableId][d])],l),{});await x.rows.save(a.tableId,{...u,...c},t,{updateAIColumns:!1})}))}o(Qor,"generateRows");async function Kor(e,t){function r(n){return typeof n=="object"?Iqe(n):Oqe(n)}o(r,"processAttachment");for(let n of t)Array.isArray(e[n.name])?e[n.name]=await Promise.all(e[n.name].map(i=>r(i))):e[n.name]=await r(e[n.name])}o(Kor,"processAttachments");var jk={};$(jk,{deleteAgentFileChunks:()=>ZY,ingestAgentFile:()=>XY,queue:()=>X7,retrieveContextForAgent:()=>QZt});var s9={};$(s9,{create:()=>Jor,createVectorDb:()=>kv,fetch:()=>zor,find:()=>Yor,remove:()=>Zor,update:()=>Xor});async function zor(){return(await C.getWorkspaceDB().allDocs(Ze.getDocParams("vectordb",void 0,{include_docs:!0}))).rows.map(r=>r.doc).filter(r=>!!r)}o(zor,"fetch");async function Yor(e){let r=await C.getWorkspaceDB().tryGet(e);if(!(!r||r._deleted))return r}o(Yor,"find");async function Jor(e){let t=C.getWorkspaceDB(),r={_id:Ze.generateVectorDbID(),name:e.name,provider:e.provider,host:e.host,port:e.port,database:e.database,user:e.user,password:e.password},{rev:n}=await t.put(r);return r._rev=n,r}o(Jor,"create");async function Xor(e){if(!e._id||!e._rev)throw new V("id and rev required",400);let t=C.getWorkspaceDB(),r=await t.tryGet(e._id);if(!r)throw new V("Vector store config not found",404);let n=e.password===xi?r.password:e.password,i={...r,...e,password:n},{rev:s}=await t.put(i);return i._rev=s,i}o(Xor,"update");async function Zor(e){let t=C.getWorkspaceDB(),r=await t.get(e);await t.remove(r)}o(Zor,"remove");var c9={};$(c9,{create:()=>isr,fetch:()=>tsr,find:()=>nsr,get:()=>rsr,remove:()=>ssr,update:()=>osr});var D4e=B(require("lodash/cloneDeep"));var P4e="********";function xh(){return C.getWorkspaceDB()}o(xh,"getDb");function N4e(e){if(e==null)return e;let t=e.definition.steps,r=e.definition.trigger,n=[...t,r];e.live!=null&&delete e.live;for(let i of n)if(i!=null)for(let s of Object.keys(i.inputs||{})){let a=s;(!i.inputs[a]||i.inputs[a]==="")&&delete i.inputs[a]}return e}o(N4e,"cleanAutomationInputs");async function esr(e,t){let r=o((a,u)=>{let c=a.definition.steps.map(l=>l.id);return u.definition.steps.filter(l=>!c.includes(l.id))},"getNewSteps"),n=o((a,u)=>{let c=u.definition.steps.map(l=>l.id);return a.definition.steps.filter(l=>!c.includes(l.id))},"getDeletedSteps"),i=r(e,t);for(let a of i)await Le.automation.stepCreated(t,a);let s=n(e,t);for(let a of s)await Le.automation.stepDeleted(t,a)}o(esr,"handleStepEvents");async function tsr(){return(await xh().allDocs(Ac(null,{include_docs:!0}))).rows.filter(n=>!!n.doc).map(n=>n.doc).map(mA).map(gA)}o(tsr,"fetch");async function rsr(e){let r=await xh().get(e);return gA(mA(r))}o(rsr,"get");async function nsr(e,t){return(await xh().getMultiple(e,t)).map(mA).map(gA)}o(nsr,"find");async function isr(e){e=mA(e);let t=xh();e._id||(e._id=K2e()),e.type="automation",e=L4e(e),e=N4e(e),e=await u9({newAuto:e});let r=await t.put(e);await Le.automation.created(e);for(let n of e.definition.steps)await Le.automation.stepCreated(e,n);return e._rev=r.rev,e._id=r.id,gA(e)}o(isr,"create");async function osr(e){if(e=mA(e),!e._id||!e._rev)throw new V("_id or _rev fields missing",400);let t=xh(),r=await t.get(e._id);asr(e,r),e=L4e(e,r),e=N4e(e),e=await u9({oldAuto:r,newAuto:e});let n=await t.put(e);e._rev=n.rev;let i=r&&r.definition.trigger?r.definition.trigger:void 0,s=e&&e.definition.trigger?e.definition.trigger:void 0;return i&&i.id!==s?.id&&(await Le.automation.triggerUpdated(e),await QN("automationTestInput",e._id),await L7(e._id)),await esr(r,e),gA({...e,_rev:n.rev,_id:n.id})}o(osr,"update");async function ssr(e,t){let r=xh(),n=await r.get(e);await u9({oldAuto:n}),await QN("automationTestInput",e),await QN("automationTestHistory",e),await L7(e);let i=await r.remove(e,t);return await Le.automation.deleted(n),i}o(ssr,"remove");async function u9({oldAuto:e,newAuto:t}){let r=Ge.triggers.definitions.WEBHOOK.stepId,n=C.getWorkspaceId();if(!n)throw new Error("Unable to check webhooks - no app ID in context.");let i=e?e.definition.trigger:null,s=t?t.definition.trigger:null,a=i&&s&&i.id!==s.id;function u(c){return c&&c.definition.trigger&&c.definition.trigger.stepId===r}if(o(u,"isWebhookTrigger"),u(e)&&(!u(t)||a)&&i.webhookId)try{let l=await xh().get(i.webhookId);s&&(delete s.webhookId,s.inputs={}),await gu.webhook.destroy(l._id,l._rev)}catch{}if((!u(e)||a)&&u(t)){let l=(await gu.webhook.save(gu.webhook.newDoc("Automation webhook","automation",t._id)))._id;s.webhookId=l;let f=U.getProdWorkspaceID(n);s.inputs={schemaUrl:`api/webhooks/schema/${n}/${l}`,triggerUrl:`api/webhooks/trigger/${f}/${l}`}}return t}o(u9,"checkForWebhooks");function asr(e,t){let r=[e.definition.trigger,...e.definition.steps],n=[t.definition.trigger,...t.definition.steps];for(let i of r)Object.keys(i.schema.inputs.properties||{}).filter(a=>i.schema.inputs.properties[a].readonly).forEach(a=>{let u=a,c=n.find(l=>l.id===i.id);if(i.inputs[u]!==c?.inputs[u])throw new V(`Field ${u} is readonly and it cannot be modified`,400)})}o(asr,"guardInvalidUpdatesAndThrow");function mA(e){let r={...{_id:e._id,_rev:e._rev,definition:e.definition,screenId:e.screenId,uiTree:e.uiTree,appId:e.appId,live:e.live,name:e.name,internal:e.internal,type:e.type,disabled:e.disabled,testData:e.testData,createdAt:e.createdAt,updatedAt:e.updatedAt,layoutDirection:e.layoutDirection}};for(let n in r)Object.prototype.hasOwnProperty.call(e,n)||delete r[n];return r}o(mA,"trimUnexpectedObjectFields");function L4e(e,t){let r=e.definition?.trigger;if(!r||!jc(r)||!r.inputs||!usr(r.inputs.password))return e;if(!t||!jc(t.definition?.trigger))throw new V("IMAP password is required",400);let n=t.definition.trigger.inputs?.password;if(!n)throw new V("IMAP password is required",400);let i=(0,D4e.default)(e),s=i.definition?.trigger;if(!jc(s)||!s.inputs)throw new V("IMAP password is required",400);return s.inputs.password=n,i}o(L4e,"hydrateAutomationSecrets");function gA(e){let t=e.definition?.trigger;return jc(t)&&t.inputs?.password&&(t.inputs.password=P4e),e}o(gA,"maskAutomationSecrets");function usr(e){return e===xi||e===P4e}o(usr,"isMaskedPassword");var l9={};$(l9,{destroy:()=>fsr,newDoc:()=>csr,save:()=>lsr});function k4e(e){return e.startsWith(U.DocumentType.WEBHOOK)}o(k4e,"isWebhookID");function csr(e,t,r){return{live:!0,name:e,action:{type:t,target:r}}}o(csr,"newDoc");async function lsr(e){let t=C.getWorkspaceDB();e._id&&k4e(e._id)?await t.get(e._id):e._id=Z2e();let r=await t.put(e);return e._rev=r.rev,e}o(lsr,"save");async function fsr(e,t){let r=C.getWorkspaceDB();if(!e||!k4e(e))throw new Error("Provided webhook ID is not valid.");return await r.remove(e,t)}o(fsr,"destroy");var f9={};$(f9,{checkForCollectStep:()=>nF});var d9={};$(d9,{trigger:()=>dsr});async function dsr(e,t={},r){let i=await C.getWorkspaceDB().get(e);if(!i)throw new Error(`Automation with ID ${e} not found`);let s=i.definition?.trigger?.stepId;if(s!=="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: ${s}`);if(x.automations.utils.checkForCollectStep(i)&&await Xi.isSyncAutomationsEnabled()){let u=await kc(i,{fields:t,timeout:r?r*1e3:ne.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=C.getWorkspaceId();return await kc(i,{fields:t,appId:u}),{message:`Automation ${i._id} has been triggered.`,automation:i}}}o(dsr,"trigger");var gu={...c9,webhook:l9,utils:f9,execution:d9};var h9={};$(h9,{exportApp:()=>q4e,exportDB:()=>B4e,streamExportApp:()=>gsr});var M4e=require("dd-trace"),p9=B(require("fs")),Uc=B(require("fs/promises")),Uf=require("path"),U4e=B(require("tar")),F4e=require("uuid");var Ib="db.txt",nM="global.txt",iM="attachments";var psr=require("memorystream");async function hsr(e,t){let r=`${(0,F4e.v4)()}.tar.gz`,n=(0,Uf.join)(iu(),r);return await U4e.create({gzip:!0,file:n,noDirRecurse:!1,cwd:e},t),n}o(hsr,"tarFilesToTmp");async function B4e(e,t={}){let r={filter:t?.filter,batch_size:1e3,batch_limit:5,style:"main_only"};return U.doWithDB(e,async n=>{if(t?.exportPath){let i=t?.exportPath,s=p9.default.createWriteStream(i);return await n.dump(s,r),i}else{let i=new psr,s="";return i.on("data",a=>{s+=a.toString()}),await n.dump(i,r),s}})}o(B4e,"exportDB");function msr(e){let t=[BN,W2e,G2e];return e&&t.push($2e),r=>!t.map(n=>r._id.includes(n)).reduce((n,i)=>n||i)}o(msr,"defineFilter");async function q4e(e,t){return await M4e.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=U.getProdWorkspaceID(e),i=`${n}/`,s=[/\/\..+/];t?.excludeRows&&s.push(/\/attachments\/.*/);let a=await ge.retrieveDirectory(mr.APPS,i,s);r.addTags({prodAppId:n,tmpPath:a});let u=(0,Uf.join)(a,i);if(p9.default.existsSync(u)){let l=await Uc.default.readdir(u);for(let f of l){let d=(0,Uf.join)(u,f);await Uc.default.rename(d,(0,Uf.join)(u,"..",f))}await Uc.default.rmdir(u)}let c=(0,Uf.join)(a,Ib);if(await B4e(e,{filter:msr(t?.excludeRows),exportPath:c}),t?.encryptPassword){let l=o(async(f,d="")=>{for(let p of await Uc.default.readdir(f)){let h=(0,Uf.join)(f,p),m=d?(0,Uf.join)(d,p):p;if(p!==iM){let g=await Uc.default.lstat(h);g.isFile()?(await $n.encryptFile({dir:f,filename:p},t.encryptPassword),await Uc.default.rm(h)):g.isDirectory()&&await l(h,m)}}},"processDirectory");await l(a)}if(t?.tar){let l=await hsr(a,await Uc.default.readdir(a));return await Uc.default.rm(a,{recursive:!0,force:!0}),l}else return a})}o(q4e,"exportApp");async function gsr({appId:e,excludeRows:t,encryptPassword:r}){let n=await q4e(e,{excludeRows:t,tar:!0,encryptPassword:r});return zqe(n)}o(gsr,"streamExportApp");var m9={};$(m9,{getGlobalDBFile:()=>wsr,getListOfAppsInMulti:()=>Esr,importApp:()=>Ssr,untarFile:()=>V4e,updateAttachmentColumns:()=>G4e});var Cb=B(require("fs")),yu=B(require("fs/promises")),Ff=require("path"),W4e=B(require("tar")),$4e=require("uuid");function j4e(e,t){let r=t.key?.split("/")||[];r.shift(),r.unshift(e);let n=r.join("/");return{...t,key:n,url:""}}o(j4e,"rewriteAttachmentUrl");async function G4e(e,t){let r=await x.tables.getAllInternalTables(t),n=[];for(let i of r){let{rows:s,columns:a}=await x.rows.getRowsWithAttachments(t.name,i);n=n.concat(s.map(u=>{for(let c of a){let l=i.schema[c].type;l==="attachment"&&Array.isArray(u[c])?u[c]=u[c].map(f=>j4e(e,f)):(l==="attachment_single"||l==="signature_single")&&u[c]&&(u[c]=j4e(e,u[c]))}return u}))}await t.bulkDocs(n)}o(G4e,"updateAttachmentColumns");async function ysr(e,t){let r=(await t.allDocs(Ac(null,{include_docs:!0}))).rows.map(s=>s.doc),n=U.getDevWorkspaceID(e),i=[];for(let s of r){let a=s.appId,u=U.getProdWorkspaceID(s.appId);if(s.definition.trigger?.stepId==="WEBHOOK"){let c=s.definition.trigger.inputs;s.definition.trigger.inputs={schemaUrl:c.schemaUrl.replace(a,n),triggerUrl:c.triggerUrl.replace(u,e)}}s.appId=n,i.push(s)}await t.bulkDocs(i)}o(ysr,"updateAutomations");async function bsr(e){if(e.file&&e.file.type!=="text/plain")throw new Error("Cannot import a non-text based file.");if(e.file)return Cb.default.createReadStream(e.file.path);if(e.key){let[t,r]=e.key.split("/"),n=await ije(t,r);return Cb.default.createReadStream((0,Ff.join)(n,r,"db","dump.txt"))}else throw new Error("Either file or key is required.")}o(bsr,"getTemplateStream");async function V4e(e){let t=(0,Ff.join)(iu(),(0,$4e.v4)());return await yu.default.mkdir(t),await W4e.extract({cwd:t,file:e.path}),t}o(V4e,"untarFile");async function _sr(e,t){try{let r=o(async n=>{for(let i of await yu.default.readdir(n)){let s=(0,Ff.join)(n,i);if(!s.endsWith(iM)){let a=await yu.default.lstat(s);if(a.isFile()&&s.endsWith(".enc")){let u=s.replace(/\.enc$/,"");await $n.decryptFile(s,u,t),await yu.default.rm(s)}else a.isDirectory()&&await r(s)}}},"processDirectory");await r(e)}catch(r){throw r.message==="incorrect header check"?new Error("File cannot be imported"):r}}o(_sr,"decryptFiles");function wsr(e){return Cb.default.readFileSync((0,Ff.join)(e,nM),"utf8")}o(wsr,"getGlobalDBFile");function Esr(e){return Cb.default.readdirSync(e).filter(t=>t!==nM)}o(Esr,"getListOfAppsInMulti");async function Ssr(e,t,r,n={updateAttachmentColumns:!0}){let i=U.getProdWorkspaceID(e),s,a=r.file&&r?.file?.type?.endsWith("gzip"),u=r.file&&(await yu.default.lstat(r.file.path)).isDirectory(),c;if(r.file&&(a||u)){c=a?await V4e(r.file):r.file.path,a&&r.file.password&&await _sr(c,r.file.password);let f=await yu.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===Ib))throw new Error("App export does not appear to be valid - no DB file found.");{let m=[],g=[nM,Ib];for(let w of f){let E=(0,Ff.join)(c,w);g.includes(w)||(w=(0,Ff.join)(i,w),(await yu.default.lstat(E)).isDirectory()?m.push(ge.uploadDirectory(mr.APPS,E,w)):m.push(ge.upload({bucket:mr.APPS,path:E,filename:w})))}await Promise.all(m);let y=await yu.default.readdir(c,{recursive:!0}),b=[];await We.parallelForeach(ge.listAllObjects(ge.ObjectStoreBuckets.APPS,i),async w=>{w.Key&&!y.includes(w.Key.replace(new RegExp(`^${i}/`),""))&&b.push(w.Key)},5),b.length&&await ge.deleteFiles(ge.ObjectStoreBuckets.APPS,b)}s=Cb.default.createReadStream((0,Ff.join)(c,Ib))}else s=await bsr(r);let{ok:l}=await t.load(s);if(!l)throw"Error loading database dump from template.";return n.updateAttachmentColumns&&await G4e(i,t),await ysr(i,t),c&&await yu.default.rm(c,{recursive:!0,force:!0}),l}o(Ssr,"importApp");var g9={};$(g9,{calculateAutomationCount:()=>Q4e,calculateBackupStats:()=>Tsr,calculateDatasourceCount:()=>H4e,calculateScreenCount:()=>K4e});async function oM(e,t,r){if(r)return t(r);{let n=U.getDevWorkspaceID(e);return C.doInWorkspaceContext(n,()=>{let i=C.getWorkspaceDB();return t(i)})}}o(oM,"runInContext");async function H4e(e,t){return oM(e,async r=>{let n=await r.allDocs(jT()),i=await r.allDocs(Ef());return n.rows.length+i.rows.length},t)}o(H4e,"calculateDatasourceCount");async function Q4e(e,t){return oM(e,async r=>(await r.allDocs(Ac())).rows.length,t)}o(Q4e,"calculateAutomationCount");async function K4e(e,t){return oM(e,async r=>(await x.screens.fetch(r)).length,t)}o(K4e,"calculateScreenCount");async function Tsr(e){return oM(e,async t=>{let r=[];r.push(H4e(e,t)),r.push(Q4e(e,t)),r.push(K4e(e,t));let n=await Promise.all(r);return{datasources:n[0],automations:n[1],screens:n[2]}})}o(Tsr,"calculateBackupStats");var y9={};$(y9,{clearErrors:()=>vsr});async function vsr(e){let t=C.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 Ue.workspace.invalidateWorkspaceMetadata(r.appId,r)}o(vsr,"clearErrors");var sM={...h9,...m9,...g9,...y9};var b9={};$(b9,{getSourceType:()=>Asr});function Asr(e){if(As(e))return"table";if(an(e))return"view";if(nm(e))return"datasource";if(Mre(e))return"query";throw new Error(`Unknown source type for source "${e}"`)}o(Asr,"getSourceType");function z4e(e,t){return!e.disabled&&t?"published":"disabled"}o(z4e,"getPublishedState");async function Y4e(){let e=C.getProdWorkspaceId(),t=await x.workspaces.isWorkspacePublished(e),r={automations:[],workspaceApps:[],screens:[],tables:[]},n={automations:[],workspaceApps:[],screens:[],tables:[]},i=o(async h=>{let[m,g,y,b]=await Promise.all([x.automations.fetch(),x.workspaceApps.fetch(),x.screens.fetch(),x.tables.getAllInternalTables()]);h.automations=m,h.workspaceApps=g,h.screens=y,h.tables=b},"updateState");await C.doInWorkspaceContext(C.getDevWorkspaceId(),async()=>i(r));let s;t&&(s=await x.workspaces.metadata.tryGet({production:!0}),await C.doInWorkspaceContext(C.getProdWorkspaceId(),async()=>i(n)));let a=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=o((h,m,g)=>{let y=g._id,b=s?.resourcesPublishedAt?.[y],w=m.has(y)||!!b;h[y]={published:w,name:g.name,publishedAt:b,unpublishedChanges:!b||g.updatedAt>b,state:z4e(g,b)}},"processResource"),f={};for(let h of r.automations)l(f,a,h);let d={};for(let h of r.tables)l(d,c,h);let p={};for(let h of r.workspaceApps){let m=s?.resourcesPublishedAt?.[h._id],g=r.screens.filter(y=>y.workspaceAppId===h._id);p[h._id]={published:u.has(h._id),name:h.name,publishedAt:m,unpublishedChanges:!m||!!g.find(y=>y.updatedAt>m),state:z4e(h,m)}}return{automations:f,workspaceApps:p,tables:d}}o(Y4e,"status");var J4e={status:Y4e};var _9={};$(_9,{create:()=>Osr,fetch:()=>Rsr,findByResourceId:()=>Csr,remove:()=>Isr});async function Rsr(e){return(await C.getWorkspaceDB().find({selector:{_id:{$regex:`^workspace_favourite${ue}`},...e?{createdBy:e}:{}}})).docs}o(Rsr,"fetch");async function Osr(e){let r=await C.getWorkspaceDB().put({_id:U.generateWorkspaceFavouriteID(),...e});return{...e,_id:r.id,_rev:r.rev}}o(Osr,"create");async function Isr(e,t){return await C.getWorkspaceDB().remove(e,t)}o(Isr,"remove");async function Csr(e){return(await C.getWorkspaceDB().find({selector:{_id:{$regex:`^workspace_favourite${ue}`},resourceId:e},limit:1})).docs}o(Csr,"findByResourceId");var w9={};$(w9,{fetch:()=>xsr,fetchWithDocument:()=>Dsr});async function xsr(e){if(!As(e))throw new Error(`Invalid tableId: ${e}`);let t=C.getWorkspaceDB(),r={startkey:[e],endkey:[e,{}]};return(await t.query(qT(vc.LINK),r)).rows.map(i=>i.value)}o(xsr,"fetch");async function Dsr(e){if(!As(e))throw new Error(`Invalid tableId: ${e}`);let t=C.getWorkspaceDB(),r={startkey:[e],endkey:[e,{}],include_docs:!0};return(await t.query(qT(vc.LINK),r)).rows.map(i=>i.doc)}o(Dsr,"fetchWithDocument");var X4e={...w9};var E9={};$(E9,{addLink:()=>Psr,deleteLink:()=>Nsr,update:()=>Lsr});async function Psr({label:e,url:t,roleId:r,workspaceAppId:n}){let i=await x.workspaceApps.get(n);if(!i)throw new V("Workspace app should be defined",500);i.navigation.links??=[],i.navigation.links.push({text:e,url:t,roleId:r,type:"link"}),await x.workspaceApps.update(i)}o(Psr,"addLink");async function Nsr(e,t){let r=await x.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(s=>s.url!==e))}),await x.workspaceApps.update({...r,navigation:{...r.navigation,links:n}})}o(Nsr,"deleteLink");async function Lsr(e,t){let r=await x.workspaceApps.get(e);if(!r)throw new V("Workspace app not found",400);await x.workspaceApps.update({...r,navigation:t})}o(Lsr,"update");var S9={};$(S9,{cleanStoredToken:()=>$sr,create:()=>ksr,fetch:()=>eQe,get:()=>aM,getLastUsages:()=>Wsr,getToken:()=>qsr,remove:()=>Usr,update:()=>Msr,validateConfig:()=>jsr});async function Z4e(e,t){if((await eQe()).find(n=>n.name===e&&n._id!==t))throw new V(`OAuth2 config with name '${e}' is already taken.`,400)}o(Z4e,"guardName");async function eQe(){return(await C.getWorkspaceDB().allDocs(Ze.getOAuth2ConfigParams(null,{include_docs:!0}))).rows.map(n=>({...n.doc,_id:n.doc._id,_rev:n.doc._rev}))}o(eQe,"fetch");async function ksr(e){let t=C.getWorkspaceDB();await Z4e(e.name);let r=await t.put({_id:`oauth2${ue}${Je.newid()}`,...e});return{_id:r.id,_rev:r.rev,...e}}o(ksr,"create");async function aM(e){return await C.getWorkspaceDB().tryGet(e)}o(aM,"get");async function Msr(e){let t=C.getWorkspaceDB();await Z4e(e.name,e._id);let r=await aM(e._id);if(!r)throw new V(`OAuth2 config with id '${e._id}' not found.`,404);let n={...e,clientSecret:e.clientSecret===xi?r.clientSecret:e.clientSecret},i=await t.put(n);return await tQe(e._id),{...n,_rev:i.rev}}o(Msr,"update");async function Usr(e,t){let r=C.getWorkspaceDB();try{await r.remove(e,t)}catch(i){throw i.status===404?new V(`OAuth2 config with id '${e}' not found.`,404):i}await tQe(e);let n=await r.tryGet(Ze.generateOAuth2LogID(e));n&&await r.remove(n)}o(Usr,"remove");async function tQe(e){let t=Ue.CacheKey.OAUTH2_TOKEN(e);await Ue.destroy(t)}o(tQe,"cleanCache");var rQe=require("koa"),nQe=B(require("node-fetch"));var{DocWritethrough:Fsr}=Ue.docWritethrough;async function iQe(e){e=await eVe(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,nQe.default)(e.url,t)}o(iQe,"fetchToken");var Bsr=o(async e=>{await new Fsr(C.getWorkspaceDB(),Ze.generateOAuth2LogID(e)).patch({lastUsage:Date.now()})},"trackUsage");async function qsr(e){let t=await Ue.withCacheWithDynamicTTL(Ue.CacheKey.OAUTH2_TOKEN(e),async()=>{let r=await aM(e);if(!r)throw new rQe.HttpError(`oAuth config ${e} count not be found`);let n=await iQe(r),i=await n.json();if(!n.ok){let u=i.error_description??n.statusText;throw new Error(`Error fetching oauth2 token: ${u}`)}let s=`${i.token_type} ${i.access_token}`,a=i.expires_in??-1;return{value:s,ttl:a}});return await Bsr(e),t}o(qsr,"getToken");async function jsr(e){try{let t=await iQe(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}}}o(jsr,"validateConfig");async function Wsr(e){let t=await C.getWorkspaceDB().getMultiple(e.map(Ze.generateOAuth2LogID),{allowMissing:!0}),r=await C.getProdWorkspaceDB().getMultiple(e.map(Ze.generateOAuth2LogID),{allowMissing:!0});return e.reduce((i,s)=>{let a=t.find(c=>c._id===Ze.generateOAuth2LogID(s));a&&(i[s]=a.lastUsage);let u=r.find(c=>c._id===Ze.generateOAuth2LogID(s));return u&&(!i[s]||i[s]<u.lastUsage)&&(i[s]=u.lastUsage),i},{})}o(Wsr,"getLastUsages");async function $sr(e){await Ue.destroy(Ue.CacheKey.OAUTH2_TOKEN(e),{useTenancy:!0})}o($sr,"cleanStoredToken");var v9={};$(v9,{enrichArrayContext:()=>aQe,enrichContext:()=>T9,fetch:()=>Hsr,find:()=>Vsr});function oQe(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}o(oQe,"updateSchema");function Gsr(e){return e.map(t=>oQe(t))}o(Gsr,"updateSchemas");function sQe(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]}o(sQe,"enrichQueries");async function Vsr(e){let t=C.getWorkspaceDB(),r=C.getWorkspaceId(),n=sQe(await t.get(e));return _f(r)&&(delete n.fields,delete n.parameters),oQe(n)}o(Vsr,"find");async function Hsr(e={enrich:!0}){let n=(await C.getWorkspaceDB().allDocs(G8(null,{include_docs:!0}))).rows.map(i=>i.doc);return e.enrich&&(n=await sQe(n)),Gsr(n)}o(Hsr,"fetch");async function aQe(e,t={}){let r={};for(let s in e)r[s]=e[s];let n=await T9(r,t),i=[];for(let[s,a]of Object.entries(n))i[parseInt(s)]=a;return i}o(aQe,"enrichArrayContext");async function T9(e,t={}){let r={};if(!e||!t)return r;if(Array.isArray(e))return aQe(e,t);let n=await Nc(),i={...t,env:n};for(let s of Object.keys(e))e[s]!=null&&(typeof e[s]=="object"?r[s]=await T9(e[s],i):typeof e[s]=="string"?r[s]=nr(e[s],i,{noEscaping:!0,noHelpers:!0,escapeNewlines:!0}):r[s]=e[s]);if(r.json||r.customData||r.requestBody){try{r.json=JSON.parse(r.json||r.customData||r.requestBody)}catch{}delete r.customData}return r}o(T9,"enrichContext");var uQe={...v9};var R9={};$(R9,{duplicateResourcesToWorkspace:()=>car,getResourcesInfo:()=>Qsr});var fQe=B(require("lodash/chunk"));async function Qsr(){let e=await x.automations.fetch(),t=await x.workspaceApps.fetch(),r={},n=[],i=await x.tables.getAllInternalTables(),s=await x.rowActions.getAll();n.push(...i.map(d=>({id:d._id,idToSearch:d._id,name:d.name,type:"table"})));let a=await x.datasources.fetch();n.push(...a.filter(d=>d._id!==Nn).map(d=>({id:d._id,idToSearch:d._id,name:d.name,type:"datasource"}))),n.push(...e.map(d=>({id:d._id,idToSearch:d._id,name:d.name,type:"automation"})));let u=await x.queries.fetch();if(n.push(...u.map(d=>({id:d._id,idToSearch:d._id,name:d.name,type:"query"}))),s.length){let d=await x.rowActions.getNames(Object.values(s).flatMap(p=>Object.values(p.actions)));for(let p of s){let h=Object.entries(p.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(p.actions))for(let y of[m,nqe(p._id)])n.push({id:p._id,idToSearch:y,name:d[g.automationId],type:"row_action",extraDependencies:h})}}let c=o((d,p)=>{let h=JSON.stringify(p);r[d]??={dependencies:[]};for(let m of n)if(h.includes(m.idToSearch)&&!r[d].dependencies.find(g=>g.id===m.id)){r[d].dependencies.push({id:m.id,name:m.name,type:m.type});let g=[...m.extraDependencies||[],...r[m.id]?.dependencies||[]].filter(({id:y})=>!r[d].dependencies.some(b=>b.id===y));r[d].dependencies.push(...g)}},"searchForUsages");for(let d of i)c(d._id,d);for(let d of e)c(d._id,d);for(let d of u)c(d._id,d);let l=await x.screens.fetch(),f={};for(let d of l)d.workspaceAppId&&(f[d.workspaceAppId]||(f[d.workspaceAppId]=[]),f[d.workspaceAppId].push(d));for(let d of t){let p=f[d._id]||[];r[d._id]??={dependencies:[]},r[d._id].dependencies.push(...p.map(h=>({id:h._id,name:h.name,type:"screen"})));for(let h of p)c(d._id,h)}for(let d of Object.values(r).flatMap(p=>p.dependencies).filter(p=>p.type==="row_action")){let p=s.find(h=>h._id===d.id);if(p)for(let h of Object.values(p.actions)){if(r[d.id]?.dependencies.some(g=>g.id===h.automationId))continue;let m=e.find(g=>g._id===h.automationId);m&&(r[d.id]??={dependencies:[]},r[d.id].dependencies.push({id:m._id,name:m.name,type:"automation"}))}}return r}o(Qsr,"getResourcesInfo");async function Ksr(e){let t=U.getDB(U.getDevWorkspaceID(e),{skip_setup:!0});if(!await t.exists())throw new V("Destination workspace does not exist",400);return t}o(Ksr,"getDestinationDb");var zsr={datasource:Yn("datasource"),table:Yn("ta"),row_action:Yn("ra"),query:Yn("query"),automation:Yn("au"),workspace_app:Yn("workspace_app"),screen:Yn("screen")};function cM(e){return Object.entries(zsr).find(([r,n])=>e.startsWith(n))?.[0]}o(cM,"getResourceType");function cQe(e){return e._id?cM(e._id)==="automation":!1}o(cQe,"isAutomation");function Ysr(e){return e._id?cM(e._id)==="workspace_app":!1}o(Ysr,"isWorkspaceApp");function Jsr(e){return e._id?cM(e._id)==="table":!1}o(Jsr,"isTable");var Xsr=new Set(["attachment","attachment_single","signature_single"]),Zsr=o(e=>!!e?.type&&Xsr.has(e.type),"isAttachmentColumn"),ear=o(e=>e.schema?Object.entries(e.schema).filter(([,t])=>Zsr(t)).map(([t,r])=>({field:t,type:r.type})):[],"getAttachmentColumns"),tar=o((e,t,r)=>{if(!e?.startsWith(`${t}/`)||t===r)return e;let n=e.slice(t.length);return`${r}${n}`},"buildDestinationAttachmentKey");async function rar(e,t,r){if(!e||e===t)return e;r.has(e)||r.set(e,(async()=>{try{if(await ge.objectExists(mr.APPS,t))return t}catch(i){Ne.logWarn("Resource duplication: failed to check attachment existence",{err:i,key:e,destinationKey:t})}try{let{stream:i,contentType:s}=await ge.getReadStream(mr.APPS,e);return await ge.streamUpload({bucket:mr.APPS,stream:i,filename:t,type:s}),t}catch(i){Ne.logWarn("Resource duplication: failed to copy attachment",{err:i,key:e,destinationKey:t});return}})());let n=await r.get(e);return n===void 0&&r.delete(e),n}o(rar,"copyAttachmentToWorkspace");async function lQe(e,t){if(!e?.key||!t.sourceProdWorkspaceId||!t.destinationProdWorkspaceId||t.sourceProdWorkspaceId===t.destinationProdWorkspaceId)return e;let r=tar(e.key,t.sourceProdWorkspaceId,t.destinationProdWorkspaceId);if(!r||r===e.key)return e;let n=await rar(e.key,r,t.cache);return n?{...e,key:n,url:""}:e}o(lQe,"remapAttachmentValue");async function nar(e,t,r){if(!t.length)return;let n=e;for(let i of t){let s=n[i.field];if(s)if(i.type==="attachment"&&Array.isArray(s)){let a=[];for(let u of s){let c=await lQe(u,r);a.push(c)}n[i.field]=a}else(i.type==="attachment_single"||i.type==="signature_single")&&s&&(n[i.field]=await lQe(s,r))}}o(nar,"remapRowAttachments");var uM=1e3,iar=250,A9=3,oar=o(e=>new Promise(t=>setTimeout(t,e)),"delay");async function sar(e,t){let r=C.getWorkspaceDB(),n={include_docs:!0,limit:uM+(t?1:0)};t&&(n.startkey=t,n.skip=1);let s=(await r.allDocs(tn(e,null,n))).rows.map(c=>c.doc).filter(c=>!!c),a=s.length>uM?s.slice(0,uM):s,u=a.length===uM?a[a.length-1]._id:void 0;return{rows:a,nextStartAfter:u}}o(sar,"fetchTableRowsPage");async function aar(e,t){let r=(0,fQe.default)(t,iar);for(let n of r){let i=n,s=0;for(;i.length&&s<A9;){s++;let a=await e.bulkDocs(i),u=[];if(a.forEach((c,l)=>{c.error&&u.push(i[l])}),!u.length)break;if(s>=A9)throw new Error(`Failed to copy ${u.length} row(s) after ${A9} attempts.`);await oar(s*250),i=u}}}o(aar,"bulkInsertRows");async function uar(e,t,r,n){if(!e.length)return;let i=U.getProdWorkspaceID(r),s=U.getProdWorkspaceID(n),a=new Map;for(let u of e){if(u.sourceId!==Nn)continue;if(!!(await t.allDocs(tn(u._id,null,{include_docs:!1,limit:1}))).rows.length){Ne.logWarn("Resource duplication: destination table already contains rows, skipping copy",{tableId:u._id,tableName:u.name});continue}let l=ear(u),f;do{let{rows:d,nextStartAfter:p}=await sar(u._id,f);if(f=p,!d.length)break;let h=[];for(let m of d){await nar(m,l,{sourceProdWorkspaceId:i,destinationProdWorkspaceId:s,cache:a});let g={...m,fromWorkspace:r};delete g._rev,delete g.createdAt,delete g.updatedAt,h.push(g)}await aar(t,h)}while(f)}}o(uar,"duplicateInternalTableRows");async function car(e,t,r){e=Array.from(new Set(e).keys());let n=await Ksr(t),i=await n.getMultiple(e,{allowMissing:!0}),s=new Set(i.map(p=>p._id)),a=e.filter(p=>!s.has(p)),u=await C.getWorkspaceDB().getMultiple(e,{allowMissing:!1}),c=u.filter(p=>p._id&&a.includes(p._id)),l=C.getWorkspaceId();if(!l)throw new Error("Could not get workspaceId");if(c.length&&await n.bulkDocs(c.map(p=>{let h={...p,fromWorkspace:l};return delete h._rev,delete h.createdAt,delete h.updatedAt,(cQe(h)||Ysr(h))&&(h.disabled=!0),cQe(h)&&(h.appId=t),h})),(r?.copyRows??!0)&&await uar(u.filter(Jsr),n,l,t),!c.length)return;let f=(await x.workspaces.metadata.tryGet())?.name||l,d=await C.doInContext(t,async()=>(await x.workspaces.metadata.tryGet())?.name||t);for(let p of c){let h,m;switch(cM(p._id)){case"automation":h=p.name,m="Automation";break;case"datasource":h=p.name||"Unknown",m="Datasource";break;case"query":h=p.name,m="Query";break;case"row_action":h=p._id,m="Row action";break;case"table":h=p.name,m="Table";break;case"screen":h=p.name||"Unkown",m="Screen";break;case"workspace_app":h=p.name,m="App";break;case void 0:throw new Error("Resource type could not be infered");default:throw new Error("Unreachable")}let y={id:p._id,name:h,type:m};await Le.resource.duplicatedToWorkspace({resource:y,fromWorkspace:f,toWorkspace:d})}}o(car,"duplicateResourcesToWorkspace");var O9={};$(O9,{create:()=>far,deleteAll:()=>par,deleteAllForDatasource:()=>Ear,docExists:()=>har,get:()=>dQe,getAll:()=>dar,getAllForTable:()=>lM,getNames:()=>hQe,remove:()=>_ar,run:()=>war,setTablePermission:()=>mar,setViewPermission:()=>yar,unsetTablePermission:()=>gar,unsetViewPermission:()=>bar});async function lar(e,t,r){let n=await hQe(Object.values(e.actions));if(t=t.toLowerCase().trim(),Object.entries(n).find(([i,s])=>s.toLowerCase().trim()===t&&i!==r))throw new V("A row action with the same name already exists.",409)}o(lar,"ensureUniqueAndThrow");async function far(e,t){let r={name:t.name.trim()},n=C.getWorkspaceDB(),i=$N(e),s=await n.tryGet(i);s||(s={_id:i,actions:{}}),await lar(s,r.name);let a=C.getWorkspaceId();if(!a)throw new Error("Could not get the current appId");let u=`row_action${ue}${Je.newid()}`,c=await gu.create({name:r.name,appId:a,definition:{trigger:{id:"trigger",...Ge.triggers.definitions.ROW_ACTION,stepId:"ROW_ACTION",inputs:{tableId:e,rowActionId:u}},steps:[]}});return s.actions[u]={automationId:c._id,permissions:{table:{runAllowed:!0},views:{}}},await n.put(s),{id:u,name:c.name,...s.actions[u]}}o(far,"create");async function dQe(e,t){let n=(await lM(e))?.actions[t];if(!n)throw new V(`Row action '${t}' not found in '${e}'`,400);return n}o(dQe,"get");async function lM(e){let t=C.getWorkspaceDB(),r=$N(e);return await t.tryGet(r)}o(lM,"getAllForTable");async function dar(){return(await C.getWorkspaceDB().allDocs(Ze.getDocParams("ra",void 0,{include_docs:!0}))).rows.map(t=>t.doc)}o(dar,"getAll");async function par(e){let t=C.getWorkspaceDB(),r=await lM(e);if(!r)return;let n=Object.values(r.actions).map(s=>s.automationId),i=await t.getMultiple(n);for(let s of i)await x.automations.remove(s._id,s._rev);await t.remove(r)}o(par,"deleteAll");async function har(e){let t=C.getWorkspaceDB(),r=$N(e);return await t.exists(r)}o(har,"docExists");async function yA(e,t,r){let n=await lM(e);if(!n?.actions[t])throw new V(`Row action '${t}' not found in '${e}'`,400);let s=await r(n);return await C.getWorkspaceDB().put(s),{id:t,...s.actions[t]}}o(yA,"updateDoc");async function pQe(e,t){let r;if(an(t)&&(r=await x.views.get(t)),!r||r.tableId!==e)throw new V(`View '${t}' not found in '${e}'`,400)}o(pQe,"guardView");async function mar(e,t){return await yA(e,t,async r=>(r.actions[t].permissions.table.runAllowed=!0,r))}o(mar,"setTablePermission");async function gar(e,t){return await yA(e,t,async r=>(r.actions[t].permissions.table.runAllowed=!1,r))}o(gar,"unsetTablePermission");async function yar(e,t,r){return await pQe(e,r),await yA(e,t,async n=>(n.actions[t].permissions.views[r]={runAllowed:!0},n))}o(yar,"setViewPermission");async function bar(e,t,r){return await pQe(e,r),await yA(e,t,async n=>(delete n.actions[t].permissions.views[r],n))}o(bar,"unsetViewPermission");async function _ar(e,t){return await yA(e,t,async r=>{let{automationId:n}=r.actions[t],i=await gu.get(n);return await gu.remove(i._id,i._rev),delete r.actions[t],r})}o(_ar,"remove");async function war(e,t,r,n){let i=await x.tables.getTable(e);if(!i)throw new V("Table not found",404);let{automationId:s}=await dQe(e,t),a=await x.automations.get(s),u=await x.rows.find(e,r);await kc(a,{fields:{id:u._id,revision:u._rev,row:u,table:i},user:n,appId:C.getWorkspaceId()},{getResponses:!0})}o(war,"run");async function hQe(e){return(await x.automations.find(e.map(({automationId:n})=>n))).reduce((n,i)=>(n[i._id]=i.name,n),{})}o(hQe,"getNames");async function Ear(e){let r=(await x.tables.getAllTables()).filter(n=>n.sourceId===e);for(let n of Object.values(r))await x.rowActions.deleteAll(n._id)}o(Ear,"deleteAllForDatasource");var C9={};$(C9,{FIND_LIMIT:()=>I9,getRowsWithAttachments:()=>Tar});var I9=25;function Sar(e,t,r){let n={selector:{$or:t.map(i=>({[i]:{$exists:!0}})),_id:{$regex:`^ro${wt}${e}`}},limit:I9};return r&&(n.bookmark=r),n}o(Sar,"generateAttachmentFindParams");async function Tar(e,t){let r=U.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,s=0,a=[];do{let u=Sar(t._id,n,i),c=await r.find(u);i=c.bookmark,s=c.docs.length;let l=c.docs;a=a.concat(l)}while(s===I9);return{rows:a,columns:n}}o(Tar,"getRowsWithAttachments");var D9={};$(D9,{find:()=>Car,getAllInternalRows:()=>Oar,save:()=>Iar});var bA={};$(bA,{find:()=>Rar,getRow:()=>x9,save:()=>Aar});var mQe=B(require("lodash/fp/cloneDeep"));async function x9(e,t,r){let n;return typeof e=="string"?an(e)?n=await x.views.get(e):n=await x.tables.getTable(e):n=e,((await Ii("READ",n,{id:Dn(t),includeSqlRelationships:r?.relationships?1:0}))?.rows||[])[0]}o(x9,"getRow");async function Aar(e,t,r){let{tableId:n,viewId:i}=Oh(e),s;if(i?s=await x.views.get(i):s=await x.tables.getTable(n),x.views.isView(s)&&fe.views.isCalculationView(s))throw new V("Cannot insert rows through a calculation view",400);let a=await fa(r,(0,mQe.default)(s),t),u=await x.rows.utils.validate({row:a,source:s});if(!u.valid)throw{validation:u.errors};let c=await Ii("CREATE",s,{row:a}),l=c.row._id;if(l){let f=await x9(s,l,{relationships:!0});return{...c,row:await zt(s,f,{preserveLinks:!0,squash:!0})}}else return c}o(Aar,"save");async function Rar(e,t){let{tableId:r,viewId:n}=Oh(e),i;n?i=await x.views.get(n):i=await x.tables.getTable(r);let s=await x9(i,t,{relationships:!0});if(!s)throw new V("Row not found",404);return await zt(i,s,{squash:!0,preserveLinks:!0})}o(Rar,"find");async function Oar(e){let t;return e?t=U.getDB(e):t=C.getWorkspaceDB(),(await t.allDocs(tn(null,null,{include_docs:!0}))).rows.map(n=>n.doc)}o(Oar,"getAllInternalRows");function gQe(e){let t=e;return an(e)&&(t=Kr(e)),Pt(t)?bA:u7}o(gQe,"pickApi");async function Iar(e,t,r,n){return gQe(e).save(e,t,r,n)}o(Iar,"save");async function Car(e,t){return gQe(e).find(e,t)}o(Car,"find");var j9={};$(j9,{exportRows:()=>Jar,fetch:()=>Xar,fetchLegacyView:()=>eur,fetchRaw:()=>Zar,isValidFilter:()=>_qe,search:()=>Yar});var U9={};$(U9,{exportRows:()=>jar,fetch:()=>CQe,fetchLegacyView:()=>M9,fetchRaw:()=>k9,sqs:()=>_A});var _A={};$(_A,{buildInternalFieldList:()=>N9,search:()=>OQe});var EQe=B(require("dd-trace")),SQe=require("lodash"),TQe=B(require("lodash/pick"));var yQe=require("lodash");var xar=["CREATE","UPDATE","DELETE"],Dar=["mysql2","mssql","oracledb"],Par=["CREATE_TABLE","UPDATE_TABLE","DELETE_TABLE"],P9=class e{static{o(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}},Dh=class{static{o(this,"AliasTables")}constructor(t){this.tableNames=t,this.aliases={},this.tableAliases={},this.charSeq=new P9}isAliasingEnabled(t,r){let n=t.resource?.fields?.length;if(!n||n<=0||Par.includes(t.operation))return!1;if(!r)return!0;try{let i=bJ(r),s=xar.includes(t.operation),a=Dar.includes(i);if(s&&a)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("."),s=i.join("."),a=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});a&&(t=`${n.replace(a,this.getAlias(a))}.${s}`)}return t}reverse(t){let r=new Map,n=o(i=>{let s={};for(let a of Object.keys(i)){let u=r.get(a);if(!u){let c=a.indexOf(".");if(c===-1)u=a;else{let l=a.slice(0,c),f=a.slice(c+1);u=`${this.tableAliases[l]||l}.${f}`}r.set(a,u)}s[u]=i[a]}return s},"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,s;if(i?s=this.isAliasingEnabled(t):s=this.isAliasingEnabled(t,n),s){if(t=(0,yQe.cloneDeep)(t),t.resource?.fields&&(t.resource.fields=t.resource.fields.map(c=>this.aliasField(c))),t.filters){let c=o(l=>{for(let[f,d]of Object.entries(l)){if(typeof d!="object")continue;let p={};for(let h of Object.keys(d))p[this.aliasField(h)]=d[h];l[f]=p}return Et.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 a=await r(t);return Array.isArray(a)&&s?this.reverse(a):a}};function Nar(e,t,r){if(t){for(let n of Object.values(t))if(typeof n=="object")for(let[i,s]of Object.entries(n))i.endsWith(e)&&(n[i]=r(s))}}o(Nar,"findColumnInQueries");function bQe(e,t){Nar(e,t,r=>{let n=Array.isArray(r);if(!(typeof r=="string")&&!n)return r;let s=o(a=>{let u="ro"+ue;return a.startsWith(u)?U.getGlobalIDFromUserMetadataID(a):a},"processString");return n?r.map(a=>typeof a=="string"?s(a):a):s(r)})}o(bQe,"userColumnMapping");function fM(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":bQe(r,t);break;default:We.unreachable(i)}break}case"bb_reference":{bQe(r,t);break}}return Et.recurseLogicalOperators(t,r=>fM(e,r))}o(fM,"checkFilters");function _Qe(e,t){return t.query&&(t.query=fM(e,t.query)),t}o(_Qe,"searchInputMapping");function dM(e){for(let t of Object.values(e)){if(typeof t!="object")continue;if(Object.keys(t).find(n=>U.removeKeyNumbering(n)==="_id"&&t[n]))return!0}return!1}o(dM,"isSearchingByRowID");var vQe=new He.Sql("sqlite3"),Lar=2e3,AQe=new RegExp("no such column: .+"),kar=new RegExp("no such table: .+"),Mar=new RegExp("duplicate column name: .+");async function N9(e,t,r){let{relationships:n,allowedFields:i,includeHiddenFields:s}=r||{},a=[],u=x.views.isView(e),c;u?c=await x.views.getTable(e.id):c=e,u?a=Object.keys(fe.views.basicFields(e)):a=Object.keys(e.schema).filter(p=>s||e.schema[p].visible!==!1);let l=a.some(p=>c.schema[p]?.type==="formula");l?a=Object.keys(c.schema):i&&(a=a.filter(p=>i.includes(p)));let f=[],d=o((p,h)=>{let m=[];return h.forEach(g=>{m.push(`${Sf(c._id,p._id)}.${g}`)}),m},"getJunctionFields");if(x.tables.isTable(e))for(let p of Hr)i&&!i.includes(p)||f.push(`${c._id}.${p}`);for(let p of a){let h=c.schema[p];if(!h)continue;let m=h.type==="link";if(!(!n&&m))if(!m)f.push(`${c._id}.${hu(p)}`);else{let g=h,y=t.find(w=>w._id===g.tableId);if(!y)continue;let b=(await N9(y,t,{includeHiddenFields:l})).concat(d(y,["doc1.fieldName","doc2.fieldName"]));if(b.length+f.length>Lar)break;f=f.concat(b)}}if(!u||!fe.views.isCalculationView(e))for(let p of Hr)f.push(`${c._id}.${p}`);return[...new Set(f)]}o(N9,"buildInternalFieldList");function Uar(e,t){let r={};for(let a of t)for(let u of Object.keys(a.schema))Wf(u)||(r[u]=hu(u));let n=o(a=>Wf(a)?!1:t.some(u=>u.schema[a]),"keyInAnyTable"),i=new Et.ColumnSplitter(t),s=o(a=>{for(let u of Object.keys(a))if(Fc(u))for(let c of a[u].conditions)s(c);else{let c=a[u];if(typeof c!="object")continue;for(let l of Object.keys(c)){let{numberPrefix:f,relationshipPrefix:d,column:p}=i.run(l);n(p)&&(c[`${f||""}${d||""}${hu(p)}`]=c[l],delete c[l])}}},"prefixFilters");return s(e),e}o(Uar,"cleanupFilters");function RQe(e,t){let r=mb.length;return e.map(n=>{let i={};for(let s of Object.keys(n)){t?.schema[s]?.type==="link"&&typeof n[s]=="string"&&(n[s]=RQe(JSON.parse(n[s])));let a=s.indexOf(mb);if(a!==-1){let u=s.slice(0,a)+s.slice(a+r),c=fe.schema.decodeNonAscii(u);i[c]=n[s]}else i[s]=n[s]}return i})}o(RQe,"reverseUserColumnMapping");async function wQe(e,t,r,n){let i=r.map(c=>c.through),s=new Dh(t.map(c=>c._id).concat(i));n?.countTotalRows&&(e.operation="COUNT");let a=o(async c=>{let l=vQe._query(c,{disableReturning:!0});if(Array.isArray(l))throw new Error("SQS cannot currently handle multiple queries");let f=l.sql,d=l.bindings,p=o(m=>["doc1","doc2"].forEach(g=>{f=f.replaceAll(`\`${g}\`.\`${m}\``,`\`${g}.${m}\``)}),"fixJunctionDocs");if(p("rowId"),p("fieldName"),Array.isArray(l))throw new Error("SQS cannot currently handle multiple queries");let h=C.getWorkspaceDB();return await EQe.default.trace("sqs.runSqlQuery",async m=>(m?.addTags({sql:f}),await h.sql(f,d)))},"processSQLQuery"),u=await s.queryWithAliasing(e,a);return n?.countTotalRows?Wv(u):Array.isArray(u)?RQe(u,e.table):u}o(wQe,"runSqlQuery");function Far(e,t){return e===400&&t?.match(kar)||e===400&&t?.match(AQe)||e===400&&t?.match(Mar)||e===404&&t?.includes(Ln)}o(Far,"resyncDefinitionsRequired");async function OQe(e,t,r){let{paginate:n,query:i,...s}=(0,SQe.cloneDeep)(e),a;x.views.isView(t)?a=await x.views.getTable(t.id):a=t;let u=await x.tables.getAllInternalTables(),c=u.reduce((g,y)=>(g[y._id]=y,g),{});if(a._id&&(a=c[a._id]),!a)throw new Error("Unable to find table");let l=fje(a,u),f={...Uar(i,u),documentType:"ro"},d=[];if(x.views.isView(t)&&fe.views.isCalculationView(t)){let g=fe.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?d.push({name:y,distinct:!0,field:hu(b.field),calculationType:b.calculationType}):d.push({name:y,calculationType:b.calculationType,field:hu(b.field)}):d.push({name:y,field:hu(b.field),calculationType:b.calculationType}))}let p={endpoint:{datasourceId:Xc,entityId:a._id,operation:"READ"},filters:f,meta:{columnPrefix:mb,sqliteUseLikeWithoutLower:!0},resource:{fields:await N9(t,u,{relationships:l,allowedFields:e.fields}),aggregations:d},relationships:l};if(s.sort){let g=a.schema[s.sort];if(d.some(b=>b.name===s.sort))p.sort={[s.sort]:{direction:s.sortOrder||"ascending",type:"number"}};else if(g){let w=(bM(g)?g.responseType:g.type)==="number"?"number":"string";p.sort={[hu(g.name)]:{direction:s.sortOrder||"ascending",type:w}}}else throw new Error(`Unable to sort by ${s.sort}`)}if(s.bookmark&&typeof s.bookmark!="number")throw new Error("Unable to paginate with string based bookmarks");let h=s.bookmark||0;!dM(f)&&s.limit&&(n=!0,p.paginate={limit:s.limit+1,offset:h});let m=await Rh(p);try{let[g,y]=await Promise.all([wQe(m,u,l),e.countRows?wQe(m,u,l,{countTotalRows:!0}):Promise.resolve(void 0)]),b=vQe.convertJsonStringColumns(a,await KL(g,t,c,l,{sqs:!0})),w=!1;n&&s.limit&&g.length>s.limit&&(w=!0,b.length>s.limit&&b.pop());let E=await zt(t,b,{preserveLinks:!0,squash:!0}),T=[...e.fields||Object.keys(t.schema||{}).filter(A=>t.schema?.[A].visible!==!1),...Hr];E=E.map(A=>(0,TQe.default)(A,T));let R={rows:E};return y!=null&&(R.totalRows=y),n&&w&&(R.hasNextPage=!0,R.bookmark=h+b.length),n&&!w&&(R.hasNextPage=!1),R}catch(g){let y=typeof g=="string"?g:g.message;if(!r?.retrying&&Far(g.status,y))return await jn.doWithLock({type:"auto_extend",name:"sys_sync_definitions",resource:C.getWorkspaceId()},x.tables.sqs.syncDefinition),OQe(e,t,{retrying:!0});if(g.status===400&&y?.match(AQe))return{rows:[]};throw new Error(`Unable to search by SQL - ${y}`,{cause:g})}}o(OQe,"search");var Bar=U.getPouch({inMemory:!0});async function IQe(view,calculation,group,data){let db=new Bar(Je.newid());try{if(await db.bulkDocs(data.map(e=>({...e,_rev:void 0}))),!view.meta)throw new Error("Legacy view metadata is missing");let groupByMulti=view.meta.groupByMulti??view.meta.schema?.group?.type==="array",rebuiltView=Nf(view.meta,groupByMulti),fn=o((e,t)=>t(e._id),"fn");eval("fn = "+rebuiltView?.map?.replace("function (doc)","function (doc, emit)"));let queryFns={meta:rebuiltView.meta,map:fn};rebuiltView.reduce&&(queryFns.reduce=rebuiltView.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 U.closePouchDB(db)}}o(IQe,"runView");async function jar(e){let{tableId:t,format:r,rowIds:n,columns:i,query:s,sort:a,sortOrder:u,delimiter:c,customHeaders:l}=e,f=C.getWorkspaceDB(),d=await x.tables.getTable(t),p=[];if(n){let b=(await f.allDocs({include_docs:!0,keys:n.map(w=>{let E=Dn(w);if(E.length>1)throw new V("Export data does not support composite keys.",400);return E[0]})})).rows.map(w=>w.doc);p=await zt(d,b)}else p=(await x.rows.search({tableId:t,query:s||{},sort:a,sortOrder:u})).rows;let h=[],m=d.schema,g;if(p=Var(p,m),i&&i.length){for(let b=0;b<p.length;b++){h[b]={};for(let w of i)h[b][w]=p[b][w]}g=i}else h=p;let y=x.rows.utils.cleanExportRows(h,m,r,i,l);if(r==="csv")return{fileName:"export.csv",content:dk(g??Object.keys(h[0]),y,c,l)};if(r==="json")return{fileName:"export.json",content:pk(y)};if(r==="jsonWithSchema")return{fileName:"export.json",content:hk(m,y)};throw"Format not recognised"}o(jar,"exportRows");async function CQe(e){let t=await War(e),r=await k9(e);return await zt(t,r)}o(CQe,"fetch");async function War(e){try{return await x.tables.getTable(e)}catch(t){if(t.status!==404)throw t;let i=await $ar(e);if(!i)throw t;return i}}o(War,"getTableForFetch");async function $ar(e){let t=C.getWorkspaceId();if(!t||!_f(t))return;let r=C.getDevWorkspaceId();return await C.doInWorkspaceContext(r,async()=>{if(await x.tables.doesTableExist(e))return await x.tables.getTable(e)})}o($ar,"getDevTableWhenProdMissing");async function k9(e,t){let r=C.getWorkspaceDB(),n;return e===$t.USER_METADATA?n=await x.users.fetchMetadata():n=(await r.allDocs(tn(e,null,{include_docs:!0,limit:t}))).rows.map(s=>s.doc),n}o(k9,"fetchRaw");async function M9(e,t){if(e.startsWith("ta"))return CQe(e);let r=C.getWorkspaceDB(),{calculation:n,group:i,field:s}=t,a=await Gar(r,e),u;if(ne.SELF_HOSTED)u=await r.query(`database/${e}`,{include_docs:!n,group:!!i});else{let l=a.meta.tableId,f=await k9(l);u=await IQe(a,n,!!i,f)}let c=[];if(!n){u.rows=u.rows.map(f=>f.doc);let l;try{l=await x.tables.getTable(a.meta.tableId)}catch{throw new Error("Unable to retrieve view table.")}c=await zt(l,u.rows)}return n===L9.STATS&&(u.rows=u.rows.map(l=>({group:l.key,field:s,...l.value,avg:l.value.sum/l.value.count})),c=u.rows),(n===L9.COUNT||n===L9.SUM)&&(c=u.rows.map(l=>({group:l.key,field:s,value:l.value}))),c}o(M9,"fetchLegacyView");var L9={SUM:"sum",COUNT:"count",STATS:"stats"};async function Gar(e,t){let r=ne.SELF_HOSTED?vJ:AJ,n=ne.SELF_HOSTED?AJ:vJ,i=ne.SELF_HOSTED?gVe:mVe,s,a=!1;try{s=await r(e,t)}catch(u){u.status!==404?s=null:(s=await n(e,t),a=!!s)}if(a&&await i(e,t),!s)throw"View does not exist.";return s}o(Gar,"getView");function Var(e,t){let r=["_id",...Object.keys(t)];return e.map(i=>Object.keys(i).filter(s=>r.includes(s)).reduce((s,a)=>({...s,[a]:i[a]}),{}))}o(Var,"trimFields");var F9={};$(F9,{exportRows:()=>Qar,fetch:()=>Kar,fetchRaw:()=>zar,search:()=>pM});var xQe=B(require("lodash/pick"));function Har(e,t,r,n){let i;if(!dM(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}}o(Har,"getPaginationAndLimitParameters");async function pM(e,t){let{countRows:r,paginate:n,query:i,...s}=e,{limit:a}=s,u=s.bookmark&&parseInt(s.bookmark)||void 0;n&&!u&&(u=0);let c=Har(i,n,u,a),l;if(s.sort){let f=s.sortOrder==="descending"?"descending":"ascending";l={[s.sort]:{direction:f}}}if(i?.oneOf?._id){let f=i.oneOf._id;i.oneOf._id=f.map(d=>Dn(d)[0])}try{let f={filters:i,sort:l,paginate:c,includeSqlRelationships:1},[{rows:d,rawResponseSize:p},h]=await Promise.all([Ii("READ",t,f),r?Ii("COUNT",t,f):Promise.resolve(void 0)]),m=await zt(t,d,{preserveLinks:!0,squash:!0}),g=!1;n&&a&&p>a&&(g=!0,m.length>a&&m.pop());let b=[...e.fields||Object.keys(t.schema||{}).filter(E=>t.schema?.[E].visible!==!1),...no];m=m.map(E=>(0,xQe.default)(E,b));let w={rows:m,hasNextPage:g};return g&&u!=null&&(w.bookmark=u+m.length),h!=null&&(w.totalRows=h),n&&!g&&(w.hasNextPage=!1),w}catch(f){throw f.message&&f.message.includes("does not exist")?new Error(`Table updated externally, please re-fetch - ${f.message}`,{cause:f}):f}}o(pM,"search");async function Qar(e){let{tableId:t,format:r,columns:n,rowIds:i,query:s,sort:a,sortOrder:u,delimiter:c,customHeaders:l}=e;if(!t)throw new V("No table ID for search provided.",400);let{datasourceId:f,tableName:d}=gr(t),p={};i?.length?p={oneOf:{_id:i.map(R=>{let A=Dn(R);return A.length>1?A:A[0]})}}:p=s||{};let h=await x.datasources.get(f),m=await x.tables.getTable(t);if(!h||!h.entities)throw new V("Datasource has not been configured for plus API.",400);let g=await pM({tableId:m._id,query:p,sort:a,sortOrder:u},m),y=[],b;if(n&&n.length){for(let R=0;R<g.rows.length;R++){y[R]={};for(let A of n)y[R][A]=g.rows[R][A]}b=n}else y=g.rows;let w=h.entities[d].schema,E=x.rows.utils.cleanExportRows(y,w,r,n,l),S;switch(r){case"csv":S=dk(b??Object.keys(w),E,c,l);break;case"json":S=pk(E);break;case"jsonWithSchema":S=hk(w,E);break;default:throw We.unreachable(r)}return{fileName:`export.${r}`,content:S}}o(Qar,"exportRows");async function Kar(e){let t=await x.tables.getTable(e),r=await Ii("READ",t,{includeSqlRelationships:1});return await zt(t,r.rows,{preserveLinks:!0,squash:!0})}o(Kar,"fetch");async function zar(e,t){let r=await x.tables.getTable(e),n;return t&&(n={limit:t}),(await Ii("READ",r,{includeSqlRelationships:1,paginate:n})).rows}o(zar,"fetchRaw");var PQe=B(require("dd-trace"));var B9=o((e,t)=>{t=t.map(r=>r.toLowerCase());for(let r of Object.keys(e||{}))if(Fc(r)){let n=e[r];if(!n)continue;for(let i of n.conditions)B9(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(U.removeKeyNumbering(i).toLowerCase()))throw new V(`Invalid filter field: ${i}`,400)}},"validateFilters"),DQe=o(async(e,t)=>{let r=o(async(i,s,a,u)=>{let c=[];FJ({table:i})&&c.push("_id");for(let l of Object.keys(i.schema).filter(f=>s.includes(f)&&i.schema[f].visible!==!1)){let f=i.schema[l],d=f.type==="link";if(!(d&&(u?.noRelationships||a.includes(f.tableId))))if(d){c.push(l);try{let p=await x.tables.getTable(f.tableId),h=await r(p,Object.keys(p.schema),[...a,f.tableId],{noRelationships:!0});c.push(...h.flatMap(m=>[`${f.name}.${m}`,`${p.name}.${m}`]))}catch(p){if(p.status!==404)throw p}}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 q9(e){return Pt(e)?F9:U9}o(q9,"pickApi");async function Yar(e,t){return await PQe.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 x.views.get(e.viewId),i=await x.views.getTable(n);else if(e.tableId)n=await x.tables.getTable(e.tableId),i=n;else throw new Error("Must supply either a view ID or a table ID");let s=Pt(i._id);if(e.query){let u=(e.fields||Object.keys(i.schema)).filter(l=>i.schema[l]?.visible!==!1),c=await DQe(i,u);B9(e.query,c)}else e.query={};if(t&&(e.query=await vh(e.query,t)),e=_Qe(i,e),e.viewId){let c=await vh(n.query||{},t);Array.isArray(c)&&(c=Et.buildQuery(c)),c=fM(i,c);let l=c?[c]:[];e.query={$and:{conditions:[...l,e.query]}},c.onEmptyFilter&&(e.query.onEmptyFilter=c.onEmptyFilter)}if(e.query=Et.cleanupQuery(e.query),e.query=Et.fixupFilterArrays(e.query),r.addTags({cleanedQuery:e.query}),!Et.hasFilters(e.query)&&e.query.onEmptyFilter==="none")return r.addTags({emptyQuery:!0}),{rows:[]};e.sortOrder&&(e.sortOrder=e.sortOrder.toLowerCase());let a;return s?(r?.addTags({searchType:"external"}),a=await pM(e,n)):(r?.addTags({searchType:"sqs"}),a=await _A.search(e,n)),r.addTags({foundRows:a.rows.length,totalRows:a.totalRows}),a})}o(Yar,"search");async function Jar(e){return q9(e.tableId).exportRows(e)}o(Jar,"exportRows");async function Xar(e){return q9(e).fetch(e)}o(Xar,"fetch");async function Zar(e,t){return q9(e).fetchRaw(e,t)}o(Zar,"fetchRaw");async function eur(e,t){return M9(e,t)}o(eur,"fetchLegacyView");var NQe={...C9,...D9,...j9,utils:wJ,external:bA,AliasTables:Dh};var W9={};$(W9,{create:()=>rur,ensureHomepageUniqueness:()=>iur,fetch:()=>tur,update:()=>nur});async function tur(e=C.getWorkspaceDB()){let t=(await e.allDocs(X2e(null,{include_docs:!0}))).rows.map(n=>n.doc),r=t.filter(n=>!n.workspaceAppId);if(r.length){let n=await x.workspaceApps.fetch(),i=n.find(s=>s.isDefault)||n[0];i&&r.forEach(s=>{s.workspaceAppId=i._id})}return t}o(tur,"fetch");async function rur(e){let r=await C.getWorkspaceDB().put({...e,_id:J2e()});return{...e,_id:r.id,_rev:r.rev}}o(rur,"create");async function nur(e){let r=await C.getWorkspaceDB().put(e);return{...e,_rev:r.rev}}o(nur,"update");async function iur(e){let n=(await x.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 x.screens.update(i)}o(iur,"ensureHomepageUniqueness");var $9={};$($9,{create:()=>uur,duplicate:()=>cur,fetch:()=>kQe,get:()=>MQe,getMatchedWorkspaceApp:()=>dur,remove:()=>fur,update:()=>lur});async function LQe(e,t){if((await kQe()).find(n=>n.name===e&&n._id!==t))throw new V(`App with name '${e}' is already taken.`,400)}o(LQe,"guardName");var our=o(async(e,t)=>{let n=(await x.screens.fetch()).filter(s=>s.workspaceAppId===e),i=[];for(let s=0;s<n.length;s++){let a=n[s],u=await x.screens.create({layoutId:a.layoutId,showNavigation:a.showNavigation,width:a.width,routing:a.routing,props:a.props,name:a.name,pluginAdded:a.pluginAdded,onLoad:a.onLoad,variant:a.variant,workspaceAppId:t});i.push(u)}return i},"duplicateScreens"),sur=o(async e=>{let t=await x.workspaceApps.fetch(),r=fe.duplicateName(e.name,t.map(i=>i.name)),n={name:r,url:`/${aur(r)}`,disabled:!0,navigation:e.navigation,isDefault:!1};return x.workspaceApps.create(n)},"createDuplicatedApp"),aur=o(e=>e.toLowerCase().replaceAll(" ","-"),"slugify");async function kQe(e=C.getWorkspaceDB()){return(await e.allDocs(Ze.getWorkspaceAppParams(null,{include_docs:!0}))).rows.map(n=>({...n.doc,_id:n.doc._id,_rev:n.doc._rev}))}o(kQe,"fetch");async function MQe(e){return await C.getWorkspaceDB().tryGet(e)}o(MQe,"get");async function uur(e){let t=C.getWorkspaceDB();return await LQe(e.name),(await t.put({...e,_id:Ze.generateWorkspaceAppID()},{returnDoc:!0})).doc}o(uur,"create");async function cur(e){let t=await sur(e);return await our(e._id,t._id),t}o(cur,"duplicate");async function lur(e){let t=C.getWorkspaceDB(),r=await MQe(e._id);if(!r)throw new V(`Project app with id '${e._id}' not found.`,404);e.name!==r.name&&await LQe(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}o(lur,"update");async function fur(e,t){let r=C.getWorkspaceDB();try{let i=await r.tryGet(e);if(!i)throw new V(`Project app with id '${e}' not found.`,404);await r.remove(e,t),Le.workspace.deleted(i,C.getWorkspaceId())}catch(i){throw i.status===404?new V(`Project app with id '${e}' not found.`,404):i}let n=(await x.screens.fetch()).filter(i=>i.workspaceAppId===e);await r.bulkRemove(n)}o(fur,"remove");async function dur(e){let t=await x.workspaces.metadata.get(),r=e.split("?")[0],n=U.isProdWorkspaceID(t.appId)?`/app/${t.url}`.replace("//","/"):`/${t.appId}`,i=U.isProdWorkspaceID(t.appId)?`/app-chat/${t.url}`.replace("//","/"):`/app-chat/${t.appId}`,s=U.isProdWorkspaceID(t.appId)?`/embed/${t.url}`.replace("//","/"):null,a=await x.workspaceApps.fetch(),u=a.filter(h=>!h.disabled),c=o(()=>u.find(h=>h.isDefault)||u[0]||a.find(h=>h.isDefault)||a[0],"getDefaultWorkspaceApp");function l(h,{url:m,isDefault:g}){return h.replace(/\/$/,"")===`${n}${m.replace(/\/$/,"")}`||s&&h.replace(/\/$/,"")===`${s}${m.replace(/\/$/,"")}`||!h&&g}o(l,"isWorkspaceAppMatch");let f=o(h=>a.find(m=>l(h,m)),"findWorkspaceApp");if(r.replace(/\/$/,"")===i.replace(/\/$/,"")||r.startsWith(`${i.replace(/\/$/,"")}/`))return c();let d=f(r);if(d)return d;let p=r.replace(/\/_chat(?:\/.*)?$/,"");return p!==r?f(p):d}o(dur,"getMatchedWorkspaceApp");var G9={};$(G9,{updateWithExport:()=>yur});var UQe=[ad.SQLITE,"_design/migrations"];async function pur(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}`)}}o(pur,"getNewWorkspaceMetadata");function hur(e,t,r){let n=[];for(let s of t){let a=e.find(u=>u._id===s._id);a?a._rev=s._rev:n.push(s)}return[...e,...n,r]}o(hur,"mergeUpdateAndDeleteDocuments");async function mur(e){let t=[];for(let s of mM)t.push(e.allDocs(U.getDocParams(s)));let r=[];for(let s of await Promise.all(t))r=r.concat(s.rows.map(a=>({_id:a.id,_rev:a.value.rev})));let n=await e.getMultiple(UQe,{allowMissing:!0});r.push(...n.map(s=>({_id:s._id,_rev:s._rev})));let i=new Map;return r.forEach(s=>{i.set(s._id,s)}),Array.from(i.values()).map(s=>({_deleted:!0,...s}))}o(mur,"removeImportableDocuments");async function gur(e){let t=[];for(let s of mM)t.push(e.allDocs(U.getDocParams(s,null,{include_docs:!0})));let r=[];for(let s of await Promise.all(t))r=r.concat(s.rows.map(a=>a.doc));let n=await e.getMultiple(UQe,{allowMissing:!0});r.push(...n);let i=new Map;return r.forEach(s=>{delete s._rev,i.set(s._id,s)}),Array.from(i.values())}o(gur,"getImportableDocuments");async function yur(e,t,r){let n=U.getDevWorkspaceID(e),i=`temp_${n}`,s=U.getDB(i),a=U.getDB(n);try{let u={file:{type:t.type,path:t.path,password:r}};await sM.importApp(n,s,u,{updateAttachmentColumns:!0});let c=await pur(s,a),l=await gur(s),f=await mur(a);if((await a.bulkDocs(hur(l,f,c))).some(p=>p.error))throw new V("Error importing documents",500);await Ue.destroy(Bk(n)),await N7(n)}finally{await s.destroy()}}o(yur,"updateWithExport");var V9={};$(V9,{get:()=>bur,tryGet:()=>_ur});async function bur(e){return await(e?.production?C.getProdWorkspaceDB():C.getWorkspaceDB()).get("app_metadata")}o(bur,"get");async function _ur(e){return await(e?.production?C.getProdWorkspaceDB():C.getWorkspaceDB()).tryGet("app_metadata")}o(_ur,"tryGet");var H9={};$(H9,{enrichWithDefaultWorkspaceAppUrl:()=>Eur,fetch:()=>wur,filterAppList:()=>FQe});function FQe(e,t){let r=[],n=Object.keys(e.roles);if(tt.hasAppBuilderPermissions(e))r=e.builder?.apps||[],r=r.concat(n);else if(!tt.isAdminOrBuilder(e))r=n;else return t;return t.filter(i=>r.includes(U.getProdWorkspaceID(i.appId)))}o(FQe,"filterAppList");async function wur(e,t){let r=e==="development",n=e==="all",i=await U.getAllWorkspaces({dev:r,all:n}),s={...t,roles:t?.roles||{}},a=await Kn.enrichUserRolesFromGroups(s);i=FQe(a,i);let u=i.filter(l=>l.status==="development").map(l=>l.appId);if(r||n){let l=await sje(u);for(let f of i){let d=l[f.appId];d?f.lockedBy=d:delete f.lockedBy}}let c=await xY(i);return await Y3e(c)}o(wur,"fetch");async function Eur(e){let t=[];for(let r of e){let n=await U.doWithDB(r.appId,i=>x.workspaceApps.fetch(i));t.push({...r,defaultWorkspaceAppUrl:n[0]?.url||""})}return t}o(Eur,"enrichWithDefaultWorkspaceAppUrl");var BQe={...sJ,...Tz,...H9,...G9,metadata:V9};var Sur={backups:sM,tables:Ih,automations:gu,workspaces:BQe,rows:NQe,users:$$e,datasources:pu,queries:uQe,plugins:OY,screens:W9,views:Yv,permissions:GJ,links:X4e,rowActions:O9,common:b9,oauth2:S9,ai:a9,workspaceApps:$9,navigation:E9,resources:R9,deployment:J4e,dev:Oz,workspace:_9},x=Sur;var bu=require("undici");var wA={path:{type:"string",display:"URL"},queryString:{type:"string"},headers:{type:"object"},enabledHeaders:{type:"object"},requestBody:{type:"json"},bodyType:{type:"string",enum:Object.values(Uh)},pagination:{type:"object"}},Tur={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:wA},read:{displayName:"GET",readable:!0,type:"fields",fields:wA},update:{displayName:"PUT",readable:!0,type:"fields",fields:wA},patch:{displayName:"PATCH",readable:!0,type:"fields",fields:wA},delete:{displayName:"DELETE",type:"fields",fields:wA}}},z9=o(e=>Object.prototype.toString.call(e)==="[object Object]","isPlainRecord"),vur=o(e=>{if(e==null)return{bodyString:"",bodyObject:{},jsonValue:void 0};if(typeof e=="string")try{let t=JSON.parse(e);return z9(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()}:z9(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"),Y9=class{constructor(t){this.headers={};this.startTimeMs=hM.performance.now();this.config=t}static{o(this,"RestIntegration")}async parseResponse(t,r){let n,i,s={},a,{contentType:u,contentDisposition:c}=Hqe(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&&(a=WQe.default.basename((0,jQe.parse)(c).parameters?.filename)||"");let d=!1,p;try{if(a)return Eqe(t,a,this.startTimeMs);{p=t.text?await t.text():"",!l&&p&&(l=Buffer.byteLength(p,"utf8").toString());let y=l&&parseInt(l)>0||p.length>0;if(t.status===204)n=[],i="";else if(y&&u.includes("application/json"))d=!0,n=JSON.parse(p),i=p;else if(y&&u.includes("text/xml")||u.includes("application/xml")){d=!0;let b=await wqe(p);n=b.data,i=b.rawXml}else n=p,i=p}}catch(y){if(d)n=p,i=p;else throw new Error(`Failed to parse response body: ${y}`)}let h=fe.formatBytes(l||"0"),m=`${Math.round(hM.performance.now()-this.startTimeMs)}ms`;for(let[y,b]of t.headers.entries())s[y]=b;let g;return r?.responseParam&&(g=(0,qQe.default)(n,r.responseParam)),{data:n,info:{code:t.status,size:h,time:m},extra:{raw:i,headers:s},pagination:{cursor:g}}}getUrl(t,r,n,i){if(n?.location==="query"&&i){let{pageParam:u,sizeParam:c}=n,l=new K9.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=Q9.default.decode(r),c={};for(let[l,f]of Object.entries(u))f!==""&&f!=null&&(c[l]=f);Object.keys(c).length>0?r="?"+Q9.default.encode(c):r=""}let s=`${t}${r}`,a=s;return this.config.url&&!s.startsWith("http")&&(a=this.config.url?`${this.config.url}/${s}`:s),a.startsWith("http")||(a=`http://${a}`),a}addBody(t,r,n,i,s){if(n.headers||(n.headers={}),t==="none")return n;let a,u={},c="",l;if(r!=null){let{bodyString:d,bodyObject:p,parseError:h,jsonValue:m}=vur(r);c=d,u=p,a=h,l=m}let f=o(d=>{i?.location==="body"&&(i?.pageParam&&s?.page!=null&&d(i.pageParam,s.page),i?.sizeParam&&s?.limit!=null&&d(i.sizeParam,s.limit))},"addPaginationToBody");switch(t){case"text":n.body=c;break;case"encoded":{let d=new K9.URLSearchParams;for(let[p,h]of Object.entries(u))d.append(p,String(h));f((p,h)=>{h!=null&&d.append(p,String(h))}),n.body=d;break}case"form":{let d=new bu.FormData,p=o((y,b)=>{if(b==null){d.append(y,"");return}if(typeof b=="string"){d.append(y,b);return}if(b instanceof Blob){d.append(y,b);return}if(Buffer.isBuffer(b)){d.append(y,Buffer.from(b).toString());return}if(b instanceof Uint8Array){d.append(y,Buffer.from(b).toString());return}d.append(y,String(b))},"appendFormValue");for(let[y,b]of Object.entries(u))p(y,b);f((y,b)=>{b!=null&&p(y,b)});let m=o(()=>n.headers?Array.isArray(n.headers)?n.headers.reduce((b,[w,E])=>(b[w]=E,b),{}):n.headers instanceof bu.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=d;break}case"xml":u!=null&&Object.keys(u).length&&(c=new $Qe.Builder().buildObject(u)),n.body=c,n.headers["Content-Type"]="application/xml";break;case"json":{if(a)throw"Invalid JSON for request body";let d;if(typeof l<"u")d=l;else if(c)try{d=JSON.parse(c)}catch{d=u}else d=u;if(i?.location==="body"&&z9(d)){let p={...d};i.pageParam&&s?.page!=null&&(p[i.pageParam]=s.page),i.sizeParam&&s?.limit!=null&&(p[i.sizeParam]=s.limit),d=p}else if(i?.location==="body"){let p={...u};i.pageParam&&s?.page!=null&&(p[i.pageParam]=s.page),i.sizeParam&&s?.limit!=null&&(p[i.sizeParam]=s.limit),Object.keys(p).length>0&&(d=p)}n.body=typeof d=="string"?d:JSON.stringify(d),n.headers["Content-Type"]="application/json";break}}return n}async getAuthHeaders(t,r){if(!t)return{};if(r==="oauth2")return{Authorization:await x.oauth2.getToken(t)};if(!this.config.authConfigs)return{};let n={},i=this.config.authConfigs.filter(s=>s._id===t)[0];if(i){let{type:s,config:a}=i;switch(s){case"basic":n.Authorization=`Basic ${Buffer.from(`${a.username}:${a.password}`).toString("base64")}`;break;case"bearer":n.Authorization=`Bearer ${a.token}`;break;default:throw We.unreachable(s)}}return n}async _req(t,r=!0){let{path:n="",queryString:i="",headers:s={},method:a="GET",disabledHeaders:u,bodyType:c="none",requestBody:l,authConfigId:f,authConfigType:d,pagination:p,paginationValues:h}=t,m=await this.getAuthHeaders(f,d);if(this.headers={...this.config.defaultHeaders||{},...s,...m},u)for(let T of Object.keys(this.headers))u[T]&&delete this.headers[T];let g={method:a,headers:this.headers};g=this.addBody(c,l,g,p,h),this.config.legacyHttpParser&&(g.extraHttpOptions={insecureHTTPParser:!0}),this.startTimeMs=hM.performance.now();let y=this.getUrl(n,i,p,h);if(await PP.isBlacklisted(y))throw new Error("Cannot connect to URL.");let b=this.config.rejectUnauthorized===void 0?ne.REST_REJECT_UNAUTHORIZED:this.config.rejectUnauthorized;(0,bu.getGlobalDispatcher)()instanceof bu.MockAgent||(g.dispatcher=Cqe({rejectUnauthorized:b,url:y}));let S;try{S=await(0,bu.fetch)(y,g)}catch(T){let R=T;throw console.log("[rest integration] Fetch error details",{url:y,error:R.message,cause:R.cause?.message,code:R.cause?.code,hasDispatcher:!!g.dispatcher,isHttpsUrl:y.startsWith("https://"),rejectUnauthorized:b}),R.cause?.code==="UNABLE_TO_VERIFY_LEAF_SIGNATURE"||R.cause?.code==="CERT_UNTRUSTED"||R.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: ${R.message}`):R.cause?.code==="ECONNREFUSED"&&g.dispatcher?new Error(`Connection refused when using proxy. Check proxy configuration and ensure the proxy server is accessible. Original error: ${R.message}`):R}return S.status===401&&d==="oauth2"&&r?(await x.oauth2.cleanStoredToken(f),await this._req(t,!1)):await this.parseResponse(S,p)}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"})}},J9={schema:Tur,integration:Y9};var GQe=require("@google-cloud/firestore");var Aur={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}}},X9=class{static{o(this,"FirebaseIntegration")}constructor(t){this.config=t,this.client=new GQe.Firestore({projectId:t.projectId,databaseId:t.databaseId||"(default)",credentials:{client_email:t.email,private_key:t.privateKey?.replace(/\\n/g,`
998
998
  `)}})}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(s=>i.push(s.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}}},Z9={schema:Aur,integration:X9};var VQe=B(require("ioredis"));var Rur={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:li},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"}}},eX=class{static{o(this,"RedisIntegration")}constructor(t){this.config=t,this.client=new VQe.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(`
999
999
  `),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]})})}},tX={schema:Rur,integration:eX};var HQe=B(require("snowflake-sdk")),QQe=require("util");var Our={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",warningMessage:"Snowflake has announced upcoming security policy changes that will disallow passwords for all non-human service by October 2026. In order to avoid any disruption, please consider using key pair authentication.",type:"Relational",features:{connection:!0},datasource:{account:{type:"string",required:!0},username:{type:"string",required:!0},password:{type:"password",required:!1,deprecated:!0},privateKey:{display:"Private Key (PEM)",type:"sensitiveLongForm",required:!1},authenticator:{type:"string",required:!1,hidden:"true"},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"}}},rX=class{static{o(this,"SnowflakePromise")}constructor(t){this.config=t}async connect(){return this.client?.isUp()?void 0:(this.config.authenticator="SNOWFLAKE",this.config.privateKey&&(this.config.authenticator="SNOWFLAKE_JWT",this.config.privateKey=this.config.privateKey?.trim()),this.client=HQe.default.createConnection(this.config),(0,QQe.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,s,a){if(i)return n(i);r(a)}})})}},nX=class{static{o(this,"SnowflakeIntegration")}constructor(t){this.client=new rX(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)}},iX={schema:Our,integration:nX};var Bf=B(require("oracledb"));var Iur=He.Sql;Bf.default.outFormat=Bf.default.OUT_FORMAT_OBJECT;var Cur={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:li,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"}}},xur=["BLOB","NCLOB"],oX={PRIMARY:"P",NOT_NULL_OR_CHECK:"C",FOREIGN_KEY:"R",UNIQUE:"U"},sX=class e extends Iur{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,s=await Bf.default.getConnection(n);return await s.execute(`ALTER SESSION SET TIME_ZONE = '${i}'`),s};this.config=r}static{o(this,"OracleIntegration")}static{this.COLUMNS_SQL=`
1000
1000
  SELECT