@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
@@ -496,7 +496,7 @@ l2HXiAD1Q2rlHNW9wDaYyKb1F5f+v4RyqCAyzlkwRdksmkLeECTboojNnmRCrE3C
496
496
  d/o3ZWE1TTj1zYwlCLN5qRKr3hU8nC3xEYNEbkB9SfTRaOq9Q7P8WmfLkoCPm3pR
497
497
  mwIDAQAB
498
498
  -----END PUBLIC KEY-----
499
- `;function IT(e){return y6.default.verify(e,xQt,{algorithms:["RS256"]})}o(IT,"verifyLicenseToken");function DQt(e,t){return y6.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}o(DQt,"sign");var KP={};$(KP,{getOfflineFeatures:()=>b6});var PQt={free:[...ea.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 b6(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(PQt)}o(b6,"getOfflineFeatures");var zP={};$(zP,{UNLIMITED:()=>X,getQuotas:()=>_6});var F=hf,BMe=ea,X=-1,ls=o(e=>e*1e6,"millions"),NQt={free:{...BMe.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(ls(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(ls(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(ls(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(ls(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(ls(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(ls(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(ls(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)}}},LQt={free:{...BMe.SELF_FREE_LICENSE.quotas},premium:void 0,premium_plus:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ls(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(ls(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(ls(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(ls(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(ls(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 _6(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(LQt);break;case"cloud":r=n(NQt);break}return JSON.parse(JSON.stringify(r))}o(_6,"getQuotas");var w6={};$(w6,{encoding:()=>wy,workspaceExists:()=>kQt});async function kQt(e){return(await U.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}o(kQt,"workspaceExists");var wy={};$(wy,{base64ToObject:()=>UQt,objectToBase64:()=>MQt});function MQt(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}o(MQt,"objectToBase64");function UQt(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}o(UQt,"base64ToObject");var qMe=B(require("lodash/union")),jMe=B(require("lodash/merge"));async function FQt(e){await us.save({offlineLicenseToken:e}),await Hp()}o(FQt,"activateOfflineLicenseToken");async function BQt(){await us.save({offlineLicenseToken:void 0}),await Hp()}o(BQt,"deleteOfflineLicenseToken");async function WMe(){return(await us.get()).offlineLicenseToken}o(WMe,"getOfflineLicenseToken");async function E6(){let t=(await Xl.getInstall()).installId,r=C.getTenantId(),n=await Le.identification.getUniqueTenantId(r);return{installId:t,tenantId:n}}o(E6,"getIdentifier");async function qQt(){let e=await E6();return wy.objectToBase64(e)}o(qQt,"getIdentifierBase64");function jQt(e){return wy.base64ToObject(e)}o(jQt,"getIdentifierFromBase64");function $Me(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($Me,"verifyExpiry");async function GMe(e){let t=await E6();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}o(GMe,"verifyInstallation");function VMe(e){let t=e.plan.type,r="self",n=b6(t),i=_6(r,t);return e.features=(0,qMe.default)(e.features,n),e.quotas=(0,jMe.default)(e.quotas,i),e}o(VMe,"enrichLicense");async function S6(){try{let e=await WMe();if(e){let t=await IT(e);return $Me(t),await GMe(t),VMe(t)}}catch(e){console.error("Error retrieving offline license",e)}}o(S6,"getOfflineLicense");var DT={};$(DT,{deleteDevLicense:()=>HQt,getOfflineLicense:()=>GQt,writeDevLicenseToDisk:()=>VQt});var v6=require("path"),HMe=require("os"),Qp=B(require("fs"));var WQt=L.isTest()?".budibase-test":".budibase",T6=(0,v6.join)((0,HMe.tmpdir)(),WQt),$Qt="dev_license.txt",xT=(0,v6.join)(T6,$Qt);if(!Qp.default.existsSync(T6))try{Qp.default.mkdirSync(T6)}catch{}function GQt(){try{if(Qp.default.existsSync(xT)){let e=Qp.default.readFileSync(xT,{encoding:"utf-8"});return IT(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}o(GQt,"getOfflineLicense");function VQt(e){console.log(`Writing license to: ${xT}`),Qp.default.writeFileSync(xT,e,{encoding:"utf-8"})}o(VQt,"writeDevLicenseToDisk");function HQt(){Qp.default.rmSync(xT,{force:!0})}o(HQt,"deleteDevLicense");var QMe=require("dd-trace");var A6=o(async()=>await QMe.tracer.trace("getLicense",async e=>{if(L.OFFLINE_MODE)return e.addTags({offline:!0}),S6();let t=await _y();return t||(e.addTags({offlineFallback:!0}),t=DT.getOfflineLicense()),t}),"getLicense"),KMe=o(e=>m6(e),"getLicenseFromKey"),R6=o(()=>L.SELF_HOSTED?ea.SELF_FREE_LICENSE:ea.CLOUD_FREE_LICENSE,"getFreeLicense");var I6={};$(I6,{activateLicenseKey:()=>QQt,deleteLicenseKey:()=>KQt,getLicenseKey:()=>JP});var O6=B(require("dd-trace"));async function QQt(e){await g6(e),await us.save({licenseKey:e}),await Hp()}o(QQt,"activateLicenseKey");async function JP(){return await O6.default.trace("getLicenseKey",async e=>{let t=await us.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}o(JP,"getLicenseKey");async function KQt(){return await O6.default.trace("deleteLicenseKey",async()=>{await us.save({licenseKey:void 0}),await Hp()})}o(KQt,"deleteLicenseKey");var PT,YQt=o(async()=>{PT=await Mn.init(Qa.utils.Databases.LICENSES)},"init"),JQt=o(async()=>{PT&&await PT.finish()},"shutdown");process.on("exit",async()=>{await JQt()});var XP=o(async()=>(PT||await YQt(),PT),"getClient");var x6=Wt.fromHours(1).toSeconds(),YMe=Wt.fromHours(1).toSeconds(),ZQt=x6+YMe,Hp=o(async()=>{await ZMe(),await XMe()},"refresh"),zMe=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 XP(),n=await r.get(e);if(n&&!JMe(n))return n;let i=await ZP.default.trace("populateLicense",async()=>await A6());return i||(i=ZP.default.trace("populateFreeLicense",()=>R6())),i.refreshedAt=new Date().toISOString(),await r.store(e,i,ZQt),i});return t},"populateAndStoreLicense"),JMe=o(e=>{let t=e.refreshedAt?Date.parse(e.refreshedAt):0;return Date.now()-t>=x6*1e3},"shouldRefreshLicense"),C6=o(async()=>await ZP.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 XP()).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}),JMe(i)&&zMe(r).catch(()=>{}),i):(i=await fe.retry(()=>zMe(r)),e.addTags({refreshedAt:i.refreshedAt,features:i.features,plan:i.plan,quotas:i.quotas,expirySeconds:x6,staleGraceSeconds:YMe}),i)}),"_getCachedLicense");L.isJest()&&(C6=jest.fn().mockImplementation(C6));var XMe=C6,ZMe=o(async()=>{let e=Ee.getTenantId();await(await XP()).delete(e)},"invalidate");async function bn(e,t){Array.isArray(e)||(e=[e]),t||(t=await ta.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}o(bn,"areFeaturesEnabled");async function D6(e,t){if(!await bn(e,t))throw new fy(e)}o(D6,"checkFeature");async function eUe(e,t){if(!await bn(e,t)){let r=e.join(", ");throw new fy(r)}}o(eUe,"checkFeatures");function vi(e){return async(...t)=>(await D6("appBackups"),e(...t))}o(vi,"checkBackups");async function P6(){return bn("appBackups")}o(P6,"isBackupsEnabled");async function N6(){return bn("branding")}o(N6,"isBrandingEnabled");async function tUe(){return bn("enforceableSSO")}o(tUe,"isEnforceableSSO");async function eKt(){return bn("syncAutomations")}o(eKt,"isSyncAutomationsEnabled");async function tKt(){return bn("triggerAutomationRun")}o(tKt,"isTriggerAutomationRunEnabled");async function eN(){return bn("auditLogs")}o(eN,"isAuditLogsEnabled");async function L6(){return bn("userGroups")}o(L6,"isUserGroupsEnabled");function rKt(){return bn("pwa")}o(rKt,"isPWAEnabled");function nKt(){return bn("recaptcha")}o(nKt,"isRecaptchaEnabled");var iKt=o(()=>bn("pkceOidc"),"isPkceOidcEnabled");async function oKt(){return bn("translations")}o(oKt,"isTranslationsEnabled");async function Ey(){return bn("expandedPublicApi")}o(Ey,"isExpandedPublicApiEnabled");async function sKt(){return bn("workspaceImportExport")}o(sKt,"isWorkspaceImportExportEnabled");async function tN(){return bn(["expandedPublicApi","workspaceImportExport"])}o(tN,"isWorkspaceImportExportPublicApiEnabled");async function aKt(e){if(L.ENABLE_SSO_MAINTENANCE_MODE||!await tUe())return!1;let r;return e?.config?r=e.config:r=await gn.getSettingsConfig(),!!r.isSSOEnforced}o(aKt,"isSSOEnforced");var rUe=o(async()=>{let e="scim",t=await bn(e),r=await gn.getSCIMConfig();if(!t||!r?.enabled)throw new fy(e);return!0},"checkSCIM");async function uKt(){return bn("viewPermissions")}o(uKt,"isViewPermissionEnabled");async function cKt(){return bn("viewReadonlyColumns")}o(cKt,"isViewReadonlyColumnsEnabled");var lKt={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 fKt(e){return await N6()?{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}:lKt}o(fKt,"getBrandingConfig");var U6={};$(U6,{enrichAIConfig:()=>M6});var dKt="budibase_ai";async function M6(e){if(L.SELF_HOSTED)return e;for(let t of Object.values(e.config))if(t.provider==="BudibaseAI")return e;return e.config[dKt]={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(M6,"enrichAIConfig");var It={};$(It,{addAction:()=>gKt,addApp:()=>yKt,addAutomation:()=>TKt,addGroup:()=>B6,addPlugin:()=>j6,addRow:()=>_Kt,addRows:()=>EKt,addUsers:()=>nN,bustCache:()=>t6,decrement:()=>dc,decrementMany:()=>NT,getCurrentUsageValues:()=>uMe,getLicensedQuota:()=>rN,getQuotaUsage:()=>Gp,increment:()=>Io,incrementBudibaseAICredits:()=>sN,incrementMany:()=>zp,removeApp:()=>bKt,removeGroup:()=>q6,removePlugin:()=>W6,removeRow:()=>wKt,removeRows:()=>SKt,removeUsers:()=>Ty,set:()=>LT,setAllUsage:()=>n6,setAppUsageValue:()=>r6,setBudibaseAICredits:()=>oUe,setUsage:()=>oMe,setUsagePerApp:()=>sMe,throwIfBudibaseAICreditsExceeded:()=>aN,updatePluginCount:()=>$6,updateUsage:()=>Sy,usageLimitIsExceeded:()=>F6,utils:()=>cT});var Kp=require("dd-trace");var Io=o(async(e,t,r)=>await Kp.tracer.trace("quotas.increment",async n=>(n.addTags({name:e,type:t}),await nUe({change:1,name:e,type:t,opts:r}))),"increment"),zp=o(e=>Kp.tracer.trace("quotas.incrementMany",async()=>nUe(e)),"incrementMany"),nUe=o(async e=>await Kp.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await Sy(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 Kp.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 Sy(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"),dc=o((e,t,r={})=>Sy({usageChange:-1,name:e,type:t,opts:r}),"decrement"),NT=o(e=>{let t=Array.isArray(e)?e:[e];return Sy(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),LT=o(async(e,t,r)=>Zs.setUsage(r,e,t),"set"),pKt=o((e,t,r)=>{if(e=="static"){let n=r.usageQuota.triggers;return n?n[t]||{}:{}}else{let n=Zs.utils.getCurrentMonthString(),i=r.monthly[n].triggers;return i?i[t]||{}:{}}},"getExistingTriggers"),hKt=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 gf.triggerQuota(i)})}catch(i){Ne.logAlert("Error triggering quota",i)}},"triggerQuota"),mKt=o(async(e,t,r,n)=>{let i=await Gp(),s=e==="monthly"?i.quotaReset:void 0,a=await pKt(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!==hf.UNLIMITED){if(!a[f]){a[f]=new Date().toISOString();let p=u[l+1]||100;(!(c>=p)||c===f)&&await hKt(t,n,c,s)}}else a[f]=void 0;return a},"checkTriggers"),Sy=o(async e=>{await Kp.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 Kp.tracer.trace("quotas.updateUsage.action",async h=>{h.addTags({actionName:p.name,actionType:p.type,actionUsageChange:p.usageChange});try{i=C.getWorkspaceId()}catch{}if(Ph.includes(p.name)&&!i)throw new Error("App context required for quota update");try{s=await rN("usage",p.name,p.type),a.push(s);let{total:g,app:y,breakdown:b}=await Zs.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 mKt(p.type,p.name,g,s),f={...f,[p.name]:w}),s.value!==hf.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 Zs.setAllUsage(d)})},"updateUsage"),rN=o(async(e,t,r)=>{let n=await ta.getCachedLicense();if(!n){let i=Ee.getTenantId();throw new Error("License not found for tenant id "+i)}if(r&&pX(e,r,t))return n.quotas[e][r][t];if(r&&hX(e,r,t))return n.quotas[e][r][t];if(mX(e,t))return n.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),F6=o(async({name:e,type:t,usageChange:r})=>{try{return await Sy({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(n){if(n.code==="usage_limit_exceeded")return!0;throw n}},"usageLimitIsExceeded");var gKt=o(async e=>Io("actions","monthly",{fn:e}),"addAction");var iUe=o(async()=>{let e=await U.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),yKt=o(async(e,{appId:t}={})=>Io("apps","static",{fn:e,valueFn:iUe,id:t}),"addApp"),bKt=o(async({appId:e}={})=>dc("apps","static",{valueFn:iUe,id:e}),"removeApp");var _Kt=o(async(e,{tableId:t}={})=>Io("rows","static",{fn:e,id:t}),"addRow"),wKt=o(async({tableId:e}={})=>dc("rows","static",{id:e}),"removeRow"),EKt=o(async(e,t,{tableId:r}={})=>zp({change:e,name:"rows",type:"static",opts:{fn:t,id:r}}),"addRows"),SKt=o(async(e,{tableId:t}={})=>NT({change:e,name:"rows",type:"static",opts:{id:t}}),"removeRows");var TKt=o(async(e,{automationId:t}={})=>Io("automations","monthly",{fn:e,id:t}),"addAutomation");var B6=o(async e=>Io("userGroups","static",{fn:e}),"addGroup"),q6=o(async()=>dc("userGroups","static"),"removeGroup");var j6=o(async e=>Io("plugins","static",{fn:e}),"addPlugin"),W6=o(async()=>dc("plugins","static"),"removePlugin"),$6=o(async e=>LT("plugins","static",e),"updatePluginCount");var nN=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 zp(n);return await _y(),i},"addUsers"),Ty=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 NT(r),await _y()},"removeUsers");var iN=class extends V{static{o(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}},oN=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 sN=o(async e=>{try{return await zp({change:e,name:"budibaseAICredits",type:"monthly"})}catch(t){throw t.code==="usage_limit_exceeded"&&await vKt().catch(()=>{}),t}},"incrementBudibaseAICredits"),vKt=o(async()=>{let e=await rN("usage","budibaseAICredits","monthly");e.value>=0&&await oUe(e.value)},"capBudibaseAICreditsAtLimit"),aN=o(async()=>{if(await F6({name:"budibaseAICredits",type:"monthly",usageChange:1}))throw new oN},"throwIfBudibaseAICreditsExceeded"),oUe=o(async e=>LT("budibaseAICredits","monthly",e),"setBudibaseAICredits");var H6={};$(H6,{db:()=>ra});var Gn={};$(Gn,{addUsers:()=>IKt,adjustGroupCreatorsQuotas:()=>PKt,cleanupApp:()=>DKt,enrichUserRolesFromGroups:()=>RKt,fetch:()=>V6,get:()=>lUe,getBulk:()=>fUe,getGroupBuilderAppIds:()=>cUe,getGroupRoleId:()=>AKt,remove:()=>OKt,removeUsers:()=>CKt,save:()=>dUe,updateGroupApps:()=>xKt});async function G6(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(G6,"findHighestRole");async function uUe(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await Dr.getBulk(e,{enriched:!1}),t}o(uUe,"groupList");async function cUe(e,t){if(!e.userGroups)return[];let r=await uUe(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(cUe,"getGroupBuilderAppIds");async function AKt(e,t,r){if(!e.userGroups)return null;let n=await uUe(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?G6(n,t):await C.doInWorkspaceContext(t,async()=>G6(n,t)))}o(AKt,"getGroupRoleId");async function RKt(e){if(!e||!e.userGroups)return e;let t=await fUe(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 G6(t,i);s&&(e.roles[i]=s)});let n=await cUe(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(RKt,"enrichUserRolesFromGroups");async function V6(){return await Dr.fetch()}o(V6,"fetch");async function lUe(e){return await Dr.get(e)}o(lUe,"get");async function fUe(e,t={enriched:!0}){return Dr.getBulk(e,t)}o(fUe,"getBulk");async function sUe(e){if(await Dr.getByName(e))throw new iN(e)}o(sUe,"guardNameAvailability");async function aUe(e){let t=await Dr.getGroupUsers(e._id);if(!t.length)return 0;let n=await Ee.getGlobalDB().getMultiple(t.map(s=>s._id));return(await ef.creatorsInList(n)).filter(s=>s).length}o(aUe,"getCreatorsCountInGroup");async function dUe(e){let t=[],r=!e._id,n=0;if(!e._id)e._id=Dr.generateUserGroupID(),await sUe(e.name),t.push(Le.group.created(e));else{let u=await Dr.get(e._id);if(u.name!==e.name&&await sUe(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 aUe(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(()=>Dr.save(s),"saveGroup");if(r)return await B6(a);{let u=await a();if(n>0)await nN(0,n);else if(n<0){let c=await aUe(e),l=Math.abs(n)-c;l>0&&await Ty(0,l)}return u}}o(dUe,"save");async function OKt(e,t){let r;try{r=await Dr.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 Dr.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 ef.creatorsInList(l)).filter(h=>h).length,p=u.length-d;p&&(i=o(()=>Ty(0,p),"recalculateCreatorsQuotasFn"))}let s=await Dr.destroy(e,t);return await Le.group.deleted(r),await q6(),await i(),s}o(OKt,"remove");async function IKt(e,t){let r=await Dr.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 ef.creatorsInList(i)).filter(d=>d).length,f=i.length-l;f&&await nN(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(IKt,"addUsers");async function CKt(e,t){let r=await Dr.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 ef.creatorsInList(i)).filter(f=>f).length,l=i.length-c;l&&await Ty(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(CKt,"removeUsers");async function xKt(e,t){let r=await lUe(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 dUe(r)}o(xKt,"updateGroupApps");async function DKt(e){let t=await V6(),r=[];for(let n of t)!n.roles||!n.roles[e]||(delete n.roles[e],r.push(n));return await Dr.bulkSave(r)}o(DKt,"cleanupApp");async function PKt(){if(!await L6()){let e=Ee.getGlobalDB(),r=(await V6()||[]).filter(n=>Object.values(n?.roles||{}).includes("CREATOR"));for(let n of r){let i=await Dr.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 ef.creatorsInList(a)).filter(f=>f).length,l=i.length-c;await Dr.save({...n,roles:{}}),l&&await Ty(0,l)}}}o(PKt,"adjustGroupCreatorsQuotas");tt.UserDB.init(It,Gn,Ki);var ra=tt.UserDB;var vy={};$(vy,{logs:()=>Z6});var Z6={};$(Z6,{logSearch:()=>jKt,oldestLogDate:()=>yUe,storeLog:()=>WKt});async function pUe(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(pUe,"backOff");var{SEPARATOR:pc,UNICODE_MAX:NKt,DocumentType:hUe,AutomationViewMode:Q6,ViewName:LKt,getQueryIndex:kKt}=U,MKt=new Date(0).toISOString(),UKt=100,uN=10,K6=o(async()=>jP("automationLogRetentionDays"),"oldestLogDate");function mUe(e,t,{status:r,automationId:n}={},i={}){let s=n?`${n}${pc}`:"",a=r?`${r}${pc}`:"",u;return r&&n?u=`${Q6.ALL}${pc}${a}${s}`:r?u=`${Q6.STATUS}${pc}${a}`:n?u=`${Q6.AUTOMATION}${pc}${s}`:u=`${hUe.AUTOMATION_LOG}${pc}`,{...i,descending:!0,startkey:`${u}${t}${NKt}`,endkey:`${u}${e}`}}o(mUe,"getAutomationLogParams");function FKt(e,t,r){return`${hUe.AUTOMATION_LOG}${pc}${e}${pc}${r}${pc}${t}`}o(FKt,"generateAutomationLogID");async function z6(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?uN+1:void 0,a=mUe(e,t,i,{include_docs:r.docs,limit:s});r?.page&&(a.startkey=r.page);let u=await n.allDocs(a),c=RT(u,{paginate:r?.paginate,pageSize:uN});return{...c,totalLogs:c.totalRows}}o(z6,"getAllLogs");async function Y6(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=mUe(e,t,a,{include_docs:!0,limit:uN+1});r?.page&&(u.startkey=r.page),i=await n.query(kKt(LKt.AUTOMATION_LOGS),u)}catch(a){if(a!=null&&(a.name==="not_found"||a.error==="not_found"))return await RMe(),Y6(e,t,r);throw a}let s=RT(i,{paginate:!0,pageSize:uN});return{...s,totalLogs:s.totalRows/3}}o(Y6,"getLogsByView");async function gUe(e,t){let r=C.getProdWorkspaceDB(),n=e._id,i=e.name,s=new Date().toISOString(),a=FKt(s,t.status,n),u={...t,automationId:n,status:t.status,automationName:i,createdAt:s,_id:a};return await r.put(u),a}o(gUe,"writeLog");async function J6(e,{clearing:t}={clearing:!1}){let r=C.getProdWorkspaceDB();await pUe(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(J6,"updateAppMetadataWithErrors");async function BKt(){let e=await K6();try{return await z6(MKt,e,{docs:!1,paginate:!1,limit:UKt})}catch{return{data:[],hasNextPage:!1,totalLogs:0}}}o(BKt,"getExpiredLogs");async function X6(){let e=C.getProdWorkspaceDB();try{let t=await BKt();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 J6(n,{clearing:!0})}catch(t){Ne.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}o(X6,"clearOldHistory");var yUe=K6;async function qKt(e,t,r,n){let i,s=new Date().toISOString(),a=await yUe();return(!e||e<a)&&(e=a),r||t?i=await Y6(e,s,{automationId:r,status:t,page:n}):i=await z6(e,s,{status:t,page:n,docs:!0,paginate:!0}),i}o(qKt,"getLogs");async function jKt(e){return await X6(),await qKt(e.startDate,e.status,e.automationId,e.page)}o(jKt,"logSearch");async function WKt(e,t){if(!U.isProdWorkspaceID(C.getWorkspaceId()))return;let r=await gUe(e,t);t.status==="error"&&await J6([r]),await X6()}o(WKt,"storeLog");var e8={};$(e8,{checkPluginQuotas:()=>VKt,deletePlugin:()=>GKt,storePlugin:()=>$Kt});var bUe=B(require("fs")),_Ue=require("path");function wUe(e,t){return bUe.default.readFileSync((0,_Ue.join)(e,t),"utf8")}o(wUe,"loadJSFile");async function $Kt(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=wUe(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 j6(write)}o($Kt,"storePlugin");async function GKt(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 W6()}catch(r){let n=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${n}`)}}o(GKt,"deletePlugin");async function VKt(){let e=Ee.getGlobalDB();try{let r=(await e.allDocs(U.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await $6(r)}catch(t){Ne.logAlert("Unable to retrieve plugins for quota check",t)}}o(VKt,"checkPluginQuotas");var MT={};$(MT,{fetch:()=>KKt,fetchValues:()=>zKt,isEncryptionKeyAvailable:()=>QKt,isValid:()=>SUe,remove:()=>JKt,update:()=>YKt});function QKt(){return!!L.ENCRYPTION_KEY}o(QKt,"isEncryptionKeyAvailable");async function KKt(){let e=await Vp.get();return Object.keys(e.variables)}o(KKt,"fetch");async function zKt(e){let r=(await Vp.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(zKt,"fetchValues");async function EUe(e){if(!(await Qi.cache.getCachedLicense()).features.includes("environmentVariables"))throw new Error("User does not have access to environment variables feature.");let r=await Vp.get();r.variables=e(r.variables),await Vp.update(r)}o(EUe,"changeValues");async function YKt(e,t){if(SUe(e))await EUe(n=>(n[e]=t,n));else throw new Error("Variable name has characters that are not allowed")}o(YKt,"update");async function JKt(e){await EUe(t=>(delete t[e],t))}o(JKt,"remove");function SUe(e){return/^[a-zA-Z0-9-_]+$/.test(e)}o(SUe,"isValid");var zz={};$(zz,{definitions:()=>i7t,download:()=>n7t,fetch:()=>r7t,write:()=>e7t});var TUe=require("memorystream"),vUe=new He.Sql("sqlite3");async function XKt(e,t,r){let n={operation:"READ",table:AT.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:"descending",type:"string"}}},i=vUe._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(XKt,"getAuditLogSqlQuery");function ZKt(e){return`al${ue}${e}${ue}${Je.newid()}`}o(ZKt,"generateAuditLogID");async function AUe(e){e._id||(e._id=ZKt(e.timestamp)),e.type||(e.type=Uf);try{let r=await C.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){Ne.logAlert("Failed to write audit log",t)}}o(AUe,"save");async function t8(e,t,r){t||(t=1);let n=C.getAuditLogsDB();try{let i=9+1,s=await XKt(e,t,i),a=AT.searchTable(),u=vUe.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 e6t(),await cMe(),await t8(e,t,{isRetry:!0});throw i}}o(t8,"searchSQL");async function e6t(){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:Uf}));await e.bulkDocs(r)}o(e6t,"migrate");function RUe(e){let t=C.getAuditLogsDB(),r=new TUe,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 TUe;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)+`
499
+ `;function IT(e){return y6.default.verify(e,xQt,{algorithms:["RS256"]})}o(IT,"verifyLicenseToken");function DQt(e,t){return y6.default.sign(t,e,{encoding:"utf-8",algorithm:"RS256"})}o(DQt,"sign");var KP={};$(KP,{getOfflineFeatures:()=>b6});var PQt={free:[...ea.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 b6(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(PQt)}o(b6,"getOfflineFeatures");var zP={};$(zP,{UNLIMITED:()=>X,getQuotas:()=>_6});var F=hf,BMe=ea,X=-1,ls=o(e=>e*1e6,"millions"),NQt={free:{...BMe.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(ls(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(ls(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(ls(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(ls(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(ls(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(ls(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(ls(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)}}},LQt={free:{...BMe.SELF_FREE_LICENSE.quotas},premium:void 0,premium_plus:{usage:{monthly:{...F.queries(X),...F.automations(X),...F.budibaseAICredits(ls(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(ls(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(ls(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(ls(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(ls(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 _6(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(LQt);break;case"cloud":r=n(NQt);break}return JSON.parse(JSON.stringify(r))}o(_6,"getQuotas");var w6={};$(w6,{encoding:()=>wy,workspaceExists:()=>kQt});async function kQt(e){return(await U.getAllWorkspaces({all:!0,idsOnly:!0})).includes(e)}o(kQt,"workspaceExists");var wy={};$(wy,{base64ToObject:()=>UQt,objectToBase64:()=>MQt});function MQt(e){let t=JSON.stringify(e);return Buffer.from(t).toString("base64")}o(MQt,"objectToBase64");function UQt(e){let t=Buffer.from(e,"base64").toString();return JSON.parse(t)}o(UQt,"base64ToObject");var qMe=B(require("lodash/union")),jMe=B(require("lodash/merge"));async function FQt(e){await us.save({offlineLicenseToken:e}),await Hp()}o(FQt,"activateOfflineLicenseToken");async function BQt(){await us.save({offlineLicenseToken:void 0}),await Hp()}o(BQt,"deleteOfflineLicenseToken");async function WMe(){return(await us.get()).offlineLicenseToken}o(WMe,"getOfflineLicenseToken");async function E6(){let t=(await Xl.getInstall()).installId,r=C.getTenantId(),n=await Le.identification.getUniqueTenantId(r);return{installId:t,tenantId:n}}o(E6,"getIdentifier");async function qQt(){let e=await E6();return wy.objectToBase64(e)}o(qQt,"getIdentifierBase64");function jQt(e){return wy.base64ToObject(e)}o(jQt,"getIdentifierFromBase64");function $Me(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($Me,"verifyExpiry");async function GMe(e){let t=await E6();if(e.identifier.installId!==t.installId||e.identifier.tenantId!==t.tenantId)throw new Error("Invalid offline license")}o(GMe,"verifyInstallation");function VMe(e){let t=e.plan.type,r="self",n=b6(t),i=_6(r,t);return e.features=(0,qMe.default)(e.features,n),e.quotas=(0,jMe.default)(e.quotas,i),e}o(VMe,"enrichLicense");async function S6(){try{let e=await WMe();if(e){let t=await IT(e);return $Me(t),await GMe(t),VMe(t)}}catch(e){console.error("Error retrieving offline license",e)}}o(S6,"getOfflineLicense");var DT={};$(DT,{deleteDevLicense:()=>HQt,getOfflineLicense:()=>GQt,writeDevLicenseToDisk:()=>VQt});var v6=require("path"),HMe=require("os"),Qp=B(require("fs"));var WQt=L.isTest()?".budibase-test":".budibase",T6=(0,v6.join)((0,HMe.tmpdir)(),WQt),$Qt="dev_license.txt",xT=(0,v6.join)(T6,$Qt);if(!Qp.default.existsSync(T6))try{Qp.default.mkdirSync(T6)}catch{}function GQt(){try{if(Qp.default.existsSync(xT)){let e=Qp.default.readFileSync(xT,{encoding:"utf-8"});return IT(e)}}catch(e){console.error("Error retrieving offline license from disk",e)}}o(GQt,"getOfflineLicense");function VQt(e){console.log(`Writing license to: ${xT}`),Qp.default.writeFileSync(xT,e,{encoding:"utf-8"})}o(VQt,"writeDevLicenseToDisk");function HQt(){Qp.default.rmSync(xT,{force:!0})}o(HQt,"deleteDevLicense");var QMe=require("dd-trace");var A6=o(async()=>await QMe.tracer.trace("getLicense",async e=>{if(L.OFFLINE_MODE)return e.addTags({offline:!0}),S6();let t=await _y();return t||(e.addTags({offlineFallback:!0}),t=DT.getOfflineLicense()),t}),"getLicense"),KMe=o(e=>m6(e),"getLicenseFromKey"),R6=o(()=>L.SELF_HOSTED?ea.SELF_FREE_LICENSE:ea.CLOUD_FREE_LICENSE,"getFreeLicense");var I6={};$(I6,{activateLicenseKey:()=>QQt,deleteLicenseKey:()=>KQt,getLicenseKey:()=>JP});var O6=B(require("dd-trace"));async function QQt(e){await g6(e),await us.save({licenseKey:e}),await Hp()}o(QQt,"activateLicenseKey");async function JP(){return await O6.default.trace("getLicenseKey",async e=>{let t=await us.get();return e.addTags({licenseKey:t.licenseKey}),t.licenseKey})}o(JP,"getLicenseKey");async function KQt(){return await O6.default.trace("deleteLicenseKey",async()=>{await us.save({licenseKey:void 0}),await Hp()})}o(KQt,"deleteLicenseKey");var PT,YQt=o(async()=>{PT=await Mn.init(Qa.utils.Databases.LICENSES)},"init"),JQt=o(async()=>{PT&&await PT.finish()},"shutdown");process.on("exit",async()=>{await JQt()});var XP=o(async()=>(PT||await YQt(),PT),"getClient");var x6=Wt.fromHours(1).toSeconds(),YMe=Wt.fromHours(1).toSeconds(),ZQt=x6+YMe,Hp=o(async()=>{await ZMe(),await XMe()},"refresh"),zMe=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 XP(),n=await r.get(e);if(n&&!JMe(n))return n;let i=await ZP.default.trace("populateLicense",async()=>await A6());return i||(i=ZP.default.trace("populateFreeLicense",()=>R6())),i.refreshedAt=new Date().toISOString(),await r.store(e,i,ZQt),i});return t},"populateAndStoreLicense"),JMe=o(e=>{let t=e.refreshedAt?Date.parse(e.refreshedAt):0;return Date.now()-t>=x6*1e3},"shouldRefreshLicense"),C6=o(async()=>await ZP.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 XP()).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}),JMe(i)&&zMe(r).catch(()=>{}),i):(i=await fe.retry(()=>zMe(r)),e.addTags({refreshedAt:i.refreshedAt,features:i.features,plan:i.plan,quotas:i.quotas,expirySeconds:x6,staleGraceSeconds:YMe}),i)}),"_getCachedLicense");L.isJest()&&(C6=jest.fn().mockImplementation(C6));var XMe=C6,ZMe=o(async()=>{let e=Ee.getTenantId();await(await XP()).delete(e)},"invalidate");async function bn(e,t){Array.isArray(e)||(e=[e]),t||(t=await ta.getCachedLicense());for(let r of e)if(!t?.features.includes(r))return!1;return!0}o(bn,"areFeaturesEnabled");async function D6(e,t){if(!await bn(e,t))throw new fy(e)}o(D6,"checkFeature");async function eUe(e,t){if(!await bn(e,t)){let r=e.join(", ");throw new fy(r)}}o(eUe,"checkFeatures");function vi(e){return async(...t)=>(await D6("appBackups"),e(...t))}o(vi,"checkBackups");async function P6(){return bn("appBackups")}o(P6,"isBackupsEnabled");async function N6(){return bn("branding")}o(N6,"isBrandingEnabled");async function tUe(){return bn("enforceableSSO")}o(tUe,"isEnforceableSSO");async function eKt(){return bn("syncAutomations")}o(eKt,"isSyncAutomationsEnabled");async function tKt(){return bn("triggerAutomationRun")}o(tKt,"isTriggerAutomationRunEnabled");async function eN(){return bn("auditLogs")}o(eN,"isAuditLogsEnabled");async function L6(){return bn("userGroups")}o(L6,"isUserGroupsEnabled");function rKt(){return bn("pwa")}o(rKt,"isPWAEnabled");function nKt(){return bn("recaptcha")}o(nKt,"isRecaptchaEnabled");var iKt=o(()=>bn("pkceOidc"),"isPkceOidcEnabled");async function oKt(){return bn("translations")}o(oKt,"isTranslationsEnabled");async function Ey(){return bn("expandedPublicApi")}o(Ey,"isExpandedPublicApiEnabled");async function sKt(){return bn("workspaceImportExport")}o(sKt,"isWorkspaceImportExportEnabled");async function tN(){return bn(["expandedPublicApi","workspaceImportExport"])}o(tN,"isWorkspaceImportExportPublicApiEnabled");async function aKt(e){if(L.ENABLE_SSO_MAINTENANCE_MODE||!await tUe())return!1;let r;return e?.config?r=e.config:r=await gn.getSettingsConfig(),!!r.isSSOEnforced}o(aKt,"isSSOEnforced");var rUe=o(async()=>{let e="scim",t=await bn(e),r=await gn.getSCIMConfig();if(!t||!r?.enabled)throw new fy(e);return!0},"checkSCIM");async function uKt(){return bn("viewPermissions")}o(uKt,"isViewPermissionEnabled");async function cKt(){return bn("viewReadonlyColumns")}o(cKt,"isViewReadonlyColumnsEnabled");var lKt={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 fKt(e){return await N6()?{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}:lKt}o(fKt,"getBrandingConfig");var U6={};$(U6,{enrichAIConfig:()=>M6});var dKt="budibase_ai";async function M6(e){if(L.SELF_HOSTED)return e;for(let t of Object.values(e.config))if(t.provider==="BudibaseAI")return e;return e.config[dKt]={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(M6,"enrichAIConfig");var It={};$(It,{addAction:()=>gKt,addApp:()=>yKt,addAutomation:()=>TKt,addGroup:()=>B6,addPlugin:()=>j6,addRow:()=>_Kt,addRows:()=>EKt,addUsers:()=>nN,bustCache:()=>t6,decrement:()=>dc,decrementMany:()=>NT,getCurrentUsageValues:()=>uMe,getLicensedQuota:()=>rN,getQuotaUsage:()=>Gp,increment:()=>Io,incrementBudibaseAICredits:()=>sN,incrementMany:()=>zp,removeApp:()=>bKt,removeGroup:()=>q6,removePlugin:()=>W6,removeRow:()=>wKt,removeRows:()=>SKt,removeUsers:()=>Ty,set:()=>LT,setAllUsage:()=>n6,setAppUsageValue:()=>r6,setBudibaseAICredits:()=>oUe,setUsage:()=>oMe,setUsagePerApp:()=>sMe,throwIfBudibaseAICreditsExceeded:()=>aN,updatePluginCount:()=>$6,updateUsage:()=>Sy,usageLimitIsExceeded:()=>F6,utils:()=>cT});var Kp=require("dd-trace");var Io=o(async(e,t,r)=>await Kp.tracer.trace("quotas.increment",async n=>(n.addTags({name:e,type:t}),await nUe({change:1,name:e,type:t,opts:r}))),"increment"),zp=o(e=>Kp.tracer.trace("quotas.incrementMany",async()=>nUe(e)),"incrementMany"),nUe=o(async e=>await Kp.tracer.trace("quotas.tryIncrement",async t=>{let r=Array.isArray(e)?e:[e];t.addTags({numActions:r.length}),await Sy(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 Kp.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 Sy(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"),dc=o((e,t,r={})=>Sy({usageChange:-1,name:e,type:t,opts:r}),"decrement"),NT=o(e=>{let t=Array.isArray(e)?e:[e];return Sy(t.map(r=>({usageChange:-r.change,name:r.name,type:r.type,opts:r.opts})))},"decrementMany"),LT=o(async(e,t,r)=>Zs.setUsage(r,e,t),"set"),pKt=o((e,t,r)=>{if(e=="static"){let n=r.usageQuota.triggers;return n?n[t]||{}:{}}else{let n=Zs.utils.getCurrentMonthString(),i=r.monthly[n].triggers;return i?i[t]||{}:{}}},"getExistingTriggers"),hKt=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 gf.triggerQuota(i)})}catch(i){Ne.logAlert("Error triggering quota",i)}},"triggerQuota"),mKt=o(async(e,t,r,n)=>{let i=await Gp(),s=e==="monthly"?i.quotaReset:void 0,a=await pKt(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!==hf.UNLIMITED){if(!a[f]){a[f]=new Date().toISOString();let p=u[l+1]||100;(!(c>=p)||c===f)&&await hKt(t,n,c,s)}}else a[f]=void 0;return a},"checkTriggers"),Sy=o(async e=>{await Kp.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 Kp.tracer.trace("quotas.updateUsage.action",async h=>{h.addTags({actionName:p.name,actionType:p.type,actionUsageChange:p.usageChange});try{i=C.getWorkspaceId()}catch{}if(Ph.includes(p.name)&&!i)throw new Error("App context required for quota update");try{s=await rN("usage",p.name,p.type),a.push(s);let{total:g,app:y,breakdown:b}=await Zs.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 mKt(p.type,p.name,g,s),f={...f,[p.name]:w}),s.value!==hf.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 Zs.setAllUsage(d)})},"updateUsage"),rN=o(async(e,t,r)=>{let n=await ta.getCachedLicense();if(!n){let i=Ee.getTenantId();throw new Error("License not found for tenant id "+i)}if(r&&pX(e,r,t))return n.quotas[e][r][t];if(r&&hX(e,r,t))return n.quotas[e][r][t];if(mX(e,t))return n.quotas[e][t];throw new Error("Invalid quota type")},"getLicensedQuota"),F6=o(async({name:e,type:t,usageChange:r})=>{try{return await Sy({usageChange:r,name:e,type:t,opts:{dryRun:!0}}),!1}catch(n){if(n.code==="usage_limit_exceeded")return!0;throw n}},"usageLimitIsExceeded");var gKt=o(async e=>Io("actions","monthly",{fn:e}),"addAction");var iUe=o(async()=>{let e=await U.getAllWorkspaces({dev:!0});return e?e.length:0},"getDevAppsCount"),yKt=o(async(e,{appId:t}={})=>Io("apps","static",{fn:e,valueFn:iUe,id:t}),"addApp"),bKt=o(async({appId:e}={})=>dc("apps","static",{valueFn:iUe,id:e}),"removeApp");var _Kt=o(async(e,{tableId:t}={})=>Io("rows","static",{fn:e,id:t}),"addRow"),wKt=o(async({tableId:e}={})=>dc("rows","static",{id:e}),"removeRow"),EKt=o(async(e,t,{tableId:r}={})=>zp({change:e,name:"rows",type:"static",opts:{fn:t,id:r}}),"addRows"),SKt=o(async(e,{tableId:t}={})=>NT({change:e,name:"rows",type:"static",opts:{id:t}}),"removeRows");var TKt=o(async(e,{automationId:t}={})=>Io("automations","monthly",{fn:e,id:t}),"addAutomation");var B6=o(async e=>Io("userGroups","static",{fn:e}),"addGroup"),q6=o(async()=>dc("userGroups","static"),"removeGroup");var j6=o(async e=>Io("plugins","static",{fn:e}),"addPlugin"),W6=o(async()=>dc("plugins","static"),"removePlugin"),$6=o(async e=>LT("plugins","static",e),"updatePluginCount");var nN=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 zp(n);return await _y(),i},"addUsers"),Ty=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 NT(r),await _y()},"removeUsers");var iN=class extends V{static{o(this,"GroupNameUnavailableError")}constructor(t){super(`Group name "${t}" is unavailable`,409)}},oN=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 sN=o(async e=>{try{return await zp({change:e,name:"budibaseAICredits",type:"monthly"})}catch(t){throw t.code==="usage_limit_exceeded"&&await vKt().catch(()=>{}),t}},"incrementBudibaseAICredits"),vKt=o(async()=>{let e=await rN("usage","budibaseAICredits","monthly");e.value>=0&&await oUe(e.value)},"capBudibaseAICreditsAtLimit"),aN=o(async()=>{if(await F6({name:"budibaseAICredits",type:"monthly",usageChange:1}))throw new oN},"throwIfBudibaseAICreditsExceeded"),oUe=o(async e=>LT("budibaseAICredits","monthly",e),"setBudibaseAICredits");var H6={};$(H6,{db:()=>ra});var Gn={};$(Gn,{addUsers:()=>IKt,adjustGroupCreatorsQuotas:()=>PKt,cleanupApp:()=>DKt,enrichUserRolesFromGroups:()=>RKt,fetch:()=>V6,get:()=>lUe,getBulk:()=>fUe,getGroupBuilderAppIds:()=>cUe,getGroupRoleId:()=>AKt,remove:()=>OKt,removeUsers:()=>CKt,save:()=>dUe,updateGroupApps:()=>xKt});async function G6(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(G6,"findHighestRole");async function uUe(e,t){return t?t=t.filter(r=>e.includes(r._id)):t=await Dr.getBulk(e,{enriched:!1}),t}o(uUe,"groupList");async function cUe(e,t){if(!e.userGroups)return[];let r=await uUe(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(cUe,"getGroupBuilderAppIds");async function AKt(e,t,r){if(!e.userGroups)return null;let n=await uUe(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?G6(n,t):await C.doInWorkspaceContext(t,async()=>G6(n,t)))}o(AKt,"getGroupRoleId");async function RKt(e){if(!e||!e.userGroups)return e;let t=await fUe(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 G6(t,i);s&&(e.roles[i]=s)});let n=await cUe(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(RKt,"enrichUserRolesFromGroups");async function V6(){return await Dr.fetch()}o(V6,"fetch");async function lUe(e){return await Dr.get(e)}o(lUe,"get");async function fUe(e,t={enriched:!0}){return Dr.getBulk(e,t)}o(fUe,"getBulk");async function sUe(e){if(await Dr.getByName(e))throw new iN(e)}o(sUe,"guardNameAvailability");async function aUe(e){let t=await Dr.getGroupUsers(e._id);if(!t.length)return 0;let n=await Ee.getGlobalDB().getMultiple(t.map(s=>s._id));return(await ef.creatorsInList(n)).filter(s=>s).length}o(aUe,"getCreatorsCountInGroup");async function dUe(e){let t=[],r=!e._id,n=0;if(!e._id)e._id=Dr.generateUserGroupID(),await sUe(e.name),t.push(Le.group.created(e));else{let u=await Dr.get(e._id);if(u.name!==e.name&&await sUe(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 aUe(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(()=>Dr.save(s),"saveGroup");if(r)return await B6(a);{let u=await a();if(n>0)await nN(0,n);else if(n<0){let c=await aUe(e),l=Math.abs(n)-c;l>0&&await Ty(0,l)}return u}}o(dUe,"save");async function OKt(e,t){let r;try{r=await Dr.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 Dr.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 ef.creatorsInList(l)).filter(h=>h).length,p=u.length-d;p&&(i=o(()=>Ty(0,p),"recalculateCreatorsQuotasFn"))}let s=await Dr.destroy(e,t);return await Le.group.deleted(r),await q6(),await i(),s}o(OKt,"remove");async function IKt(e,t){let r=await Dr.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 ef.creatorsInList(i)).filter(d=>d).length,f=i.length-l;f&&await nN(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(IKt,"addUsers");async function CKt(e,t){let r=await Dr.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 ef.creatorsInList(i)).filter(f=>f).length,l=i.length-c;l&&await Ty(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(CKt,"removeUsers");async function xKt(e,t){let r=await lUe(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 dUe(r)}o(xKt,"updateGroupApps");async function DKt(e){let t=await V6(),r=[];for(let n of t)!n.roles||!n.roles[e]||(delete n.roles[e],r.push(n));return await Dr.bulkSave(r)}o(DKt,"cleanupApp");async function PKt(){if(!await L6()){let e=Ee.getGlobalDB(),r=(await V6()||[]).filter(n=>Object.values(n?.roles||{}).includes("CREATOR"));for(let n of r){let i=await Dr.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 ef.creatorsInList(a)).filter(f=>f).length,l=i.length-c;await Dr.save({...n,roles:{}}),l&&await Ty(0,l)}}}o(PKt,"adjustGroupCreatorsQuotas");tt.UserDB.init(It,Gn,Ki);var ra=tt.UserDB;var vy={};$(vy,{logs:()=>Z6});var Z6={};$(Z6,{logSearch:()=>jKt,oldestLogDate:()=>yUe,storeLog:()=>WKt});async function pUe(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(pUe,"backOff");var{SEPARATOR:pc,UNICODE_MAX:NKt,DocumentType:hUe,AutomationViewMode:Q6,ViewName:LKt,getQueryIndex:kKt}=U,MKt=new Date(0).toISOString(),UKt=100,uN=10,K6=o(async()=>jP("automationLogRetentionDays"),"oldestLogDate");function mUe(e,t,{status:r,automationId:n}={},i={}){let s=n?`${n}${pc}`:"",a=r?`${r}${pc}`:"",u;return r&&n?u=`${Q6.ALL}${pc}${a}${s}`:r?u=`${Q6.STATUS}${pc}${a}`:n?u=`${Q6.AUTOMATION}${pc}${s}`:u=`${hUe.AUTOMATION_LOG}${pc}`,{...i,descending:!0,startkey:`${u}${t}${NKt}`,endkey:`${u}${e}`}}o(mUe,"getAutomationLogParams");function FKt(e,t,r){return`${hUe.AUTOMATION_LOG}${pc}${e}${pc}${r}${pc}${t}`}o(FKt,"generateAutomationLogID");async function z6(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?uN+1:void 0,a=mUe(e,t,i,{include_docs:r.docs,limit:s});r?.page&&(a.startkey=r.page);let u=await n.allDocs(a),c=RT(u,{paginate:r?.paginate,pageSize:uN});return{...c,totalLogs:c.totalRows}}o(z6,"getAllLogs");async function Y6(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=mUe(e,t,a,{include_docs:!0,limit:uN+1});r?.page&&(u.startkey=r.page),i=await n.query(kKt(LKt.AUTOMATION_LOGS),u)}catch(a){if(a!=null&&(a.name==="not_found"||a.error==="not_found"))return await RMe(),Y6(e,t,r);throw a}let s=RT(i,{paginate:!0,pageSize:uN});return{...s,totalLogs:s.totalRows/3}}o(Y6,"getLogsByView");async function gUe(e,t){let r=C.getProdWorkspaceDB(),n=e._id,i=e.name,s=new Date().toISOString(),a=FKt(s,t.status,n),u={...t,automationId:n,status:t.status,automationName:i,createdAt:s,_id:a};return await r.put(u),a}o(gUe,"writeLog");async function J6(e,{clearing:t}={clearing:!1}){let r=C.getProdWorkspaceDB();await pUe(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(J6,"updateAppMetadataWithErrors");async function BKt(){let e=await K6();try{return await z6(MKt,e,{docs:!1,paginate:!1,limit:UKt})}catch{return{data:[],hasNextPage:!1,totalLogs:0}}}o(BKt,"getExpiredLogs");async function X6(){let e=C.getProdWorkspaceDB();try{let t=await BKt();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 J6(n,{clearing:!0})}catch(t){Ne.logAlert(`Failed to cleanup automation log history - Database "${e.name}"`,t)}}o(X6,"clearOldHistory");var yUe=K6;async function qKt(e,t,r,n){let i,s=new Date().toISOString(),a=await yUe();return(!e||e<a)&&(e=a),r||t?i=await Y6(e,s,{automationId:r,status:t,page:n}):i=await z6(e,s,{status:t,page:n,docs:!0,paginate:!0}),i}o(qKt,"getLogs");async function jKt(e){return await X6(),await qKt(e.startDate,e.status,e.automationId,e.page)}o(jKt,"logSearch");async function WKt(e,t){if(!U.isProdWorkspaceID(C.getWorkspaceId()))return;let r=await gUe(e,t);t.status==="error"&&await J6([r]),await X6()}o(WKt,"storeLog");var e8={};$(e8,{checkPluginQuotas:()=>VKt,deletePlugin:()=>GKt,storePlugin:()=>$Kt});var bUe=B(require("fs")),_Ue=require("path");function wUe(e,t){return bUe.default.readFileSync((0,_Ue.join)(e,t),"utf8")}o(wUe,"loadJSFile");async function $Kt(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=wUe(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 j6(write)}o($Kt,"storePlugin");async function GKt(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 W6()}catch(r){let n=r?.message?r?.message:r;throw new Error(`Failed to delete plugin: ${n}`)}}o(GKt,"deletePlugin");async function VKt(){let e=Ee.getGlobalDB();try{let r=(await e.allDocs(U.getPluginParams())).rows.length;console.log(`Syncing plugin count: ${r}`),await $6(r)}catch(t){Ne.logAlert("Unable to retrieve plugins for quota check",t)}}o(VKt,"checkPluginQuotas");var MT={};$(MT,{fetch:()=>KKt,fetchValues:()=>zKt,isEncryptionKeyAvailable:()=>QKt,isValid:()=>SUe,remove:()=>JKt,update:()=>YKt});function QKt(){return!!L.ENCRYPTION_KEY}o(QKt,"isEncryptionKeyAvailable");async function KKt(){let e=await Vp.get();return Object.keys(e.variables)}o(KKt,"fetch");async function zKt(e){let r=(await Vp.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(zKt,"fetchValues");async function EUe(e){if(!(await Qi.cache.getCachedLicense()).features.includes("environmentVariables"))throw new Error("User does not have access to environment variables feature.");let r=await Vp.get();r.variables=e(r.variables),await Vp.update(r)}o(EUe,"changeValues");async function YKt(e,t){if(SUe(e))await EUe(n=>(n[e]=t,n));else throw new Error("Variable name has characters that are not allowed")}o(YKt,"update");async function JKt(e){await EUe(t=>(delete t[e],t))}o(JKt,"remove");function SUe(e){return/^[a-zA-Z0-9-_]+$/.test(e)}o(SUe,"isValid");var zz={};$(zz,{definitions:()=>i7t,download:()=>n7t,fetch:()=>r7t,write:()=>e7t});var TUe=require("memorystream"),vUe=new He.Sql("sqlite3");async function XKt(e,t,r){let n={operation:"READ",table:AT.searchTable(),tables:{},paginate:{limit:r||9,page:t},filters:e,resource:{fields:[]},sort:{timestamp:{direction:"descending",type:"string"}}},i=vUe._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(XKt,"getAuditLogSqlQuery");function ZKt(e){return`al${ue}${e}${ue}${Je.newid()}`}o(ZKt,"generateAuditLogID");async function AUe(e){e._id||(e._id=ZKt(e.timestamp)),e.type||(e.type=Uf);try{let r=await C.getAuditLogsDB().put(e);return{...e,_rev:r.rev}}catch(t){Ne.logAlert("Failed to write audit log",t)}}o(AUe,"save");async function t8(e,t,r){t||(t=1);let n=C.getAuditLogsDB();try{let i=9+1,s=await XKt(e,t,i),a=AT.searchTable(),u=vUe.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 e6t(),await cMe(),await t8(e,t,{isRetry:!0});throw i}}o(t8,"searchSQL");async function e6t(){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:Uf}));await e.bulkDocs(r)}o(e6t,"migrate");function RUe(e){let t=C.getAuditLogsDB(),r=new TUe,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 TUe;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)+`
500
500
  `;i.write(u)}}),r.on("end",()=>{i.end()}),{promise:n,stream:i}}o(RUe,"dump");var uje=B(CUe()),cje=B(require("vm")),Wz=B(YT());var bc=class{static{o(this,"Helper")}constructor(t,r,n=!0){this.name=t,this.fn=r,this.useValueFallback=n}register(t){t.registerHelper(this.name,(r,n)=>{let i={};n&&n.data&&n.data.root&&(i=n.data.root);let s=this.fn(r,i);return s??(this.useValueFallback?r:null)})}unregister(t){t.unregisterHelper(this.name)}};var fL=B(YT());var xz=B(Tqe());var Kn=B(require("dayjs")),vqe=B(require("dayjs/plugin/duration")),Aqe=B(require("dayjs/plugin/advancedFormat")),Rqe=B(require("dayjs/plugin/isoWeek")),Oqe=B(require("dayjs/plugin/weekYear")),Iqe=B(require("dayjs/plugin/weekOfYear")),Cqe=B(require("dayjs/plugin/relativeTime")),xqe=B(require("dayjs/plugin/utc")),Dqe=B(require("dayjs/plugin/timezone"));Kn.default.extend(vqe.default);Kn.default.extend(Aqe.default);Kn.default.extend(Rqe.default);Kn.default.extend(Oqe.default);Kn.default.extend(Iqe.default);Kn.default.extend(Cqe.default);Kn.default.extend(xqe.default);Kn.default.extend(Dqe.default);function ch(e){return typeof e=="object"&&typeof e.hash=="object"}o(ch,"isOptions");function Oz(e){return typeof e=="object"&&typeof e.options=="object"&&typeof e.app=="object"}o(Oz,"isApp");function Iz(e,t,r){if(ch(e))return Iz({},t,e);if(ch(t))return Iz(e,r,t);let n=Oz(e)?e.context:{};r=r||{},ch(r)||(t=Object.assign({},t,r)),ch(r)&&r.hash.root===!0&&(t=Object.assign({},r.data.root,t));let i=Object.assign({},n,t,r.hash);return Oz(e)||(i=Object.assign({},e,i)),Oz(e)&&e.view&&e.view.data&&(i=Object.assign({},i,e.view.data)),i}o(Iz,"getContext");function Cz(e,t,r){return ch(t)&&(r=t,t=Nqe),ch(e)&&(r=e,t=null,e=null),{str:e,pattern:t,options:r}}o(Cz,"initialConfig");function Pqe(e,t,r){let n=Cz(e,t,r),i={lang:"en",date:new Date(n.str)},s=Iz(this,i,{});Kn.default.locale(s.lang||s.language)}o(Pqe,"setLocale");var Nqe="MMMM DD, YYYY",oL=o((e,t,r)=>{let n=Cz(e,t,r);if(n.str==null&&n.pattern==null)return Kn.default.locale("en"),(0,Kn.default)().format(Nqe);Pqe(n.str,n.pattern,n.options);let i=(0,Kn.default)(new Date(n.str));return typeof n.options=="string"?i=n.options.toLowerCase()==="utc"?i.utc():i.tz(n.options):i=i.tz(Kn.default.tz.guess()),n.pattern===""?i.toISOString():i.format(n.pattern)},"date"),cv=o((e,t,r)=>{let n=Cz(e,t);Pqe(n.str,n.pattern);let i=Kn.default.duration(n.str,n.pattern);return r&&!ch(r)?i.format(r):i.humanize()},"duration"),lv=o((e,t,r)=>(0,Kn.default)(new Date(e)).diff((0,Kn.default)(new Date(t)),r),"difference"),sL=o(e=>{let t=lv(e,new Date().toISOString(),"ms");return cv(t,"ms")},"durationFromNow");var aL=["#if","#unless","#each","#with","lookup","log","blockHelperMissing","each","helperMissing","if","unless","log","lookup","with"],Lqe=["math","array","number","url","string","comparison","object","regex","uuid"],lh={OBJECT:"object",ALL:"all",LITERAL:"literal",JS:"js",DECODE_ID:"decodeId"},qy="%LITERAL%";var kqe={date:oL,duration:cv,difference:lv,durationFromNow:sL};function Mqe(e){for(let[r,n]of Object.entries(kqe))e.registerHelper(r,n);let t=[];for(let r of Lqe){let n=xz.default[r]();for(let i of Object.entries(n)){let s=i[0];aL.indexOf(s)!==-1||t.indexOf(s)!==-1||t.push(s)}xz.default[r]({handlebars:e})}Dz=t.concat(Object.keys(kqe))}o(Mqe,"registerAll");var Dz=[];function DJt(){return process.env.NODE_ENV==="jest"||process.env.JEST_WORKER_ID!=null&&process.env.JEST_WORKER_ID!=="null"}o(DJt,"isJest");function fh(){return DJt()}o(fh,"isTest");var Uqe=o(()=>process&&process.env.BACKEND_JS,"isTestingBackendJS"),Pz=o(()=>{process.env.BACKEND_JS="1"},"setTestingBackendJS");var PJt=/^[A-Za-z0-9]+$/g,fv=/{{([^{].*?)}}/g,Nz=/{?{{([^{].*?)}}}?/g,NJt=/{{{([^{].*?)}}}/g,dv=o(()=>fh()&&Uqe()?!0:fh()?!1:typeof window>"u","isBackendService"),Fqe=o(()=>process&&!process.env.NO_JS,"isJSAllowed"),Bqe=o(e=>{let t=e,r=new RegExp(fv),n=new RegExp(NJt),i=t.match(n);i&&i.forEach(a=>{t=t.replace(a,"")});let s=t.match(r);return s||[]},"findDoubleHbsInstances"),qqe=o(e=>e.match(PJt),"isAlphaNumeric"),Lz=o((e,t,r,n)=>e.slice(0,t)+n+e.slice(t+r),"swapStrings");var uL=o(e=>Buffer.from(e,"base64").toString("utf-8"),"atob"),jqe=o((e,t,r)=>{let n=t.map(s=>s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),i=new RegExp(`\\b(${n.join("|")})\\b`,"g");return e.replace(i,`${r}$1`)},"prefixStrings");function cL(e){return`
501
501
  result = {
502
502
  result: null,
@@ -1003,7 +1003,7 @@ Example: return $("Score") + $("Weight")
1003
1003
  if (${h} ${f}) {
1004
1004
  ${d}
1005
1005
  }
1006
- }`,...m}}o(Pf,"default");function pVe(e){return e?.groupByMulti??e?.schema?.group?.type==="array"}o(pVe,"getGroupByMulti");async function hVe(){let e=C.getWorkspaceDB(),t=[];if(ne.SELF_HOSTED){let r=await e.get("_design/database");for(let n of Object.keys(r.views||{})){if(Object.values(Ac).indexOf(n)!==-1)continue;let s=r.views?.[n];s&&t.push({name:n,...s})}}else{let r=(await e.allDocs(wWe({include_docs:!0}))).rows.map(n=>n.doc);for(let n of r)t.push({name:n.name,...n.view})}return t}o(hVe,"getViews");async function LJ(e,t,r){let n=C.getWorkspaceDB();if(ne.SELF_HOSTED){let i=await n.get("_design/database");i.views={...i.views,[t]:r},e&&delete i.views[e],await n.put(i)}else{let i=Rv(t),s=e?Rv(e):null,a={_id:i,view:r,name:t,tableId:r.meta.tableId};try{let u=await n.get(i);if(s){let c=await n.get(s);await n.remove(c._id,c._rev)}u&&u._rev&&(a._rev=u._rev)}catch{}await n.put(a)}}o(LJ,"saveView");async function mVe(e,t){let r=await e.get("_design/database"),n=r.views?.[t].meta;if(!n)throw new Error("Unable to migrate view - no metadata");let i=Pf(n,pVe(n));delete r.views?.[t],await e.put(r),await LJ(null,t,i)}o(mVe,"migrateToInMemoryView");async function gVe(e,t){let r=await e.get(Rv(t)),n=await e.get("_design/database"),i=r.view.meta;if(!i)throw new Error("Unable to migrate view - no metadata");n.views||(n.views={}),n.views[t]=Pf(i,pVe(i)),await e.put(n),await e.remove(r._id,r._rev)}o(gVe,"migrateToDesignView");async function kJ(e,t){let n=(await e.get("_design/database")).views?.[t];if(n==null)throw{status:404,message:"Unable to get view"};return n}o(kJ,"getFromDesignDoc");async function MJ(e,t){let r=await e.get(Rv(t));if(r)return r.view;throw{status:404,message:"Unable to get view"}}o(MJ,"getFromMemoryDoc");var bVe=require("lodash/fp"),qJ=B(require("lodash/isEqual")),_Ve=B(require("lodash/uniq"));var ob=require("lodash/fp"),yVe=B(require("lodash/isEqual"));function Qer(e,t){let r=(0,ob.merge)(e,t);for(let n of Object.keys(t))t[n]===void 0&&delete r[n];return r}o(Qer,"mergeRows");async function yk(e,t){let r=C.getWorkspaceDB();if(!e.relatedFormula)return;let n=[];for(let i of Array.isArray(t)?t:[t]){let s={};for(let[a,u]of Object.entries(i)){let c=e.schema[a];if(c&&c.type==="link"){let l=c.tableId;s[l]||(s[l]=[]);let f=s[l].map(p=>p._id),d=u.filter(p=>!f.includes(p._id));s[l]=s[l].concat(d)}}for(let a of e.relatedFormula){let u;try{if(!s[a]||s[a].length===0)continue;u=await r.get(a)}catch{}for(let c of Object.values(u.schema))if(c.type==="formula"&&c.formulaType==="static"){n=n.concat(s[a].map(l=>Gv(u,l,{updateFormula:!1,updateAIColumns:!1})));break}}}await Promise.all(n)}o(yk,"updateRelatedFormula");async function UJ(e){let t=C.getWorkspaceDB(),r=(await t.allDocs(tn(e._id,null,{include_docs:!0}))).rows.map(s=>s.doc),n=await zt(e,(0,ob.cloneDeep)(r),{squash:!1}),i=[];for(let s of r){let a=n.find(u=>u._id===s._id);if(a){let u=await au(e,(0,ob.cloneDeep)(s),{dynamic:!1,contextRows:[a]});(0,yVe.default)(u,s)||i.push(u)}}await t.bulkDocs(i)}o(UJ,"updateAllFormulasInTable");async function Gv(e,t,r){let n=C.getWorkspaceDB(),{updateFormula:i=!0,updateAIColumns:s=!0}=r||{},a=P.views.isView(e)?await P.views.getTable(e.id):e;t.type="row";let u=await zt(e,(0,ob.cloneDeep)(t),{squash:!1});t=await au(a,t,{dynamic:!1,contextRows:[u]}),s&&(t=await R$e(a,t,{contextRows:[u]})),await n.put(t);let c=await n.tryGet(t._id);if(!c)throw new Error(`Unable to retrieve row ${t._id} after saving.`);delete u._rev,u=Qer(c,u),u=await au(a,u,{dynamic:!1}),i&&await yk(a,u);let l=await jL(e,u);return{row:u,squashed:l,table:a}}o(Gv,"finaliseRow");function wVe(e){return e.type==="formula"&&e.formulaType==="static"}o(wVe,"isStaticFormula");function FJ(e,t){let r=[];t=Array.isArray(t)?t:[t];for(let n of Object.values(e.schema))wVe(n)&&dje(n?.formula??"",t)&&r.push(n.name);return r}o(FJ,"getFormulaThatUseColumn");async function Ker(e,{oldTable:t,deletion:r}){let n=(await P.tables.getAllInternalTables()).filter(a=>a._id!==e._id),i=t?t.schema:e.schema,s=Object.values(i).filter(a=>r||!e.schema[a.name]);for(let a of s){let u=e;if(a.type==="link"){let l=a.tableId;u=n.find(f=>f._id===l)}if(!u)continue;let c=FJ(u,a.name);if(c.length>0&&await BJ(e,c),!!e.relatedFormula)for(let l of e.relatedFormula){let f=Object.values(e.schema).filter(p=>p.type==="link"&&p.tableId===l),d=n.find(p=>p._id===l);if(d&&f&&a.type!=="link"){let p=[];for(let h of f)p=p.concat(FJ(d,[h.fieldName,a.name]));p.length>0&&await BJ(d,(0,_Ve.default)(p))}}}}o(Ker,"checkIfFormulaNeedsCleared");async function zer(e,{deletion:t}={}){let r=e._id,n=C.getWorkspaceDB(),i=(await P.tables.getAllInternalTables()).filter(u=>u._id!==r),s=(0,bVe.cloneDeep)(i),a=Object.values(e.schema).filter(Of);for(let u of i){if(!u.relatedFormula)continue;let c=u.relatedFormula.indexOf(r);c!==-1&&u.relatedFormula.splice(c,1)}if(!t)for(let u of a){let c=FJ(e,u.name);if(!c||c.length===0)continue;let l=i.find(f=>f._id===u.tableId);l&&(!l.relatedFormula||!l.relatedFormula.includes(r))&&(l.relatedFormula=l.relatedFormula?[...l.relatedFormula,r]:[r])}for(let u of s){let c=i.find(l=>u._id===l._id);c&&!(0,qJ.default)(u,c)&&await n.put(c)}}o(zer,"updateRelatedFormulaLinksOnTables");async function Yer(e,{oldTable:t}){Object.values(e.schema).find(n=>wVe(n)&&(!t||!t.schema[n.name]||!(0,qJ.default)(t.schema[n.name],n)))!=null&&await UJ(e)}o(Yer,"checkIfFormulaUpdated");async function bk(e,{oldTable:t,deletion:r}){await zer(e,{deletion:r}),await Ker(e,{oldTable:t,deletion:r}),r||await Yer(e,{oldTable:t})}o(bk,"runStaticFormulaChecks");async function BJ(e,t){let r=C.getWorkspaceDB(),n=await r.allDocs(tn(e._id,null,{include_docs:!0}));return await r.bulkDocs(n.rows.map(({doc:i})=>(t.forEach(s=>delete i[s]),i)))}o(BJ,"clearColumns");async function Jer(e,t,r){let n=C.getWorkspaceDB(),i=[],s=[];if(t&&t.schema&&e.schema&&(s=Object.keys(t.schema).filter(a=>e.schema[a]==null)),r||s.length!==0){let u=(await n.allDocs(tn(e._id,null,{include_docs:!0}))).rows.map(({doc:c})=>c);i=u.map(c=>{if(c=(0,EVe.cloneDeep)(c),r){let l=c[r.updated]!==void 0,f=c[r.old]!==void 0;!l&&f&&(c[r.updated]=c[r.old]),delete c[r.old]}else s.length!==0&&s.forEach(l=>delete c[l]);return c}),await Ic.tableUpdate(e,u,{oldTable:t,rename:r}),await ttr(e,s,r)}return{rows:i,table:e}}o(Jer,"checkForColumnUpdates");function Xer(e,t){if(!e)return t;t._rev=e._rev;let r,n;for([r,n]of Object.entries(e.schema))if(n.autocolumn&&n.subtype==="autoID"&&t.schema[r]){let i=t.schema[r];i.lastID=n.lastID}return t}o(Xer,"makeSureTableUpToDate");async function TVe(e,t,r,n){let i=t,s=[],a=!!n?.keepCouchId;for(let u=0;u<e.length;u++){let c=e[u];c._id=a&&c._id||fWe(t._id),c.type="row",c.tableId=t._id,c=await la(r,t,c,{noAutoRelationships:!0});for(let[l,f]of Object.entries(i.schema)){if(f.type==="link"&&e.find(d=>d[l]))throw new V(`Can't bulk import relationship fields for internal databases, found value in field "${l}"`,400);if((f.type==="options"||f.type==="array")&&c[l]){let d=Array.isArray(c[l]),p=d?c[l]:[c[l]],h=[...f.constraints.inclusion,...p],m=new Set(h);f.constraints.inclusion=Array.from(m),f.constraints.inclusion.sort(),!d&&f.type==="array"&&(c[l]=p)}}s.push(c)}return s}o(TVe,"importToRows");async function WJ(e,t){let r=e.schema,n=t?.identifierFields||[],i=t?.importRows;if(!i||!gk(i)||!mk(r))return e;let s=C.getWorkspaceDB(),a=PJ(i,e),u=await TVe(a,e,t?.userId,{keepCouchId:n.includes("_id")}),c=u.length;return n.length>0&&(await s.allDocs(tn(e._id,null,{include_docs:!0}))).rows.map(f=>f.doc).forEach(f=>{u.forEach(d=>{let p=!0;for(let h of n)if(d[h]!==f[h]){p=!1;break}p&&(d._id=f._id,d._rev=f._rev,c--)})}),await It.addRows(c,()=>s.bulkDocs(u),{tableId:e._id}),await Le.rows.imported(e,u.length),e}o(WJ,"handleDataImport");async function Zer(e){let t=C.getWorkspaceDB();if(e.indexes&&e.indexes.length>0){let r=await t.getIndexes(),n=`search:${e._id}`,i=r.indexes.find(s=>s.name===n);if(i){let s=i.def.fields.map(a=>Object.keys(a)[0]);(0,SVe.default)(s,e.indexes)||(await t.deleteIndex(i),await t.createIndex({index:{fields:e.indexes,name:n,ddoc:"search_ddoc",type:"json"}}))}else await t.createIndex({index:{fields:e.indexes,name:n,ddoc:"search_ddoc",type:"json"}})}return e}o(Zer,"handleSearchIndexes");function etr(e){if(e._id===$t.USER_METADATA)for(let[t,r]of Object.entries(Hje.schema))e.schema[t]==null&&(e.schema[t]=r);return e}o(etr,"checkStaticTables");var jJ=class{static{o(this,"TableSaveFunctions")}constructor({userId:t,oldTable:r,importRows:n}){this.db=C.getWorkspaceDB(),this.userId=t,this.oldTable=r,this.importRows=n,this.rows=[]}async before(t){return this.oldTable&&(t=Xer(this.oldTable,t)),t=etr(t),t}async mid(t,r){let n=await Jer(t,this.oldTable,r);return this.rows=this.rows.concat(n.rows),t}async after(t){return t=await Zer(t),t=await WJ(t,{importRows:this.importRows,userId:this.userId}),await P.tables.sqs.addTable(t),t}getUpdatedRows(){return this.rows}};async function ttr(e,t,r){let i=(await hVe()).filter(s=>s.meta?.tableId===e._id);for(let s of i){let a=!1,u=s.meta;if(u&&(r?(u.field===r.old&&(u.field=r.updated,a=!0),u.groupBy===r.old&&(u.groupBy=r.updated,a=!0),u.filters&&u.filters.forEach(c=>{c.key===r.old&&(c.key=r.updated,a=!0)})):t&&t.forEach(c=>{if(u.field===c&&(delete u.field,delete u.calculation,delete u.groupBy,a=!0),u.groupBy===c&&(delete u.groupBy,a=!0),u.filters&&u.filters.length){let l=u.filters.length;u.filters=u.filters.filter(f=>f.key!==c),l!==u.filters.length&&(a=!0)}}),a)){let c=Object.values(e.schema).find(d=>d.name==s.groupBy),l=Pf(u,c?.type==="array"),f=s.name;await LJ(null,f,l),l.meta?.schema||(l.meta.schema=e.schema),e.views?.[f]&&(e.views[f]=l.meta)}}}o(ttr,"checkForViewUpdates");function vVe(e,t){let r=e?[...e]:[];return r.push(t),r}o(vVe,"mergePendingColumnRenames");function AVe(e,t){return`fk_${t.name}_${e.fieldName}`}o(AVe,"generateForeignKey");function RVe(e,t,r){return`jt_${t.name}_${r.name}_${e.name}_${e.fieldName}`}o(RVe,"generateJunctionTableName");function Vv(e,t){let r={type:"number",constraints:{},name:e};return t&&(r.meta=t),r}o(Vv,"foreignKeyStructure");function rtr(e,t){if(O5.indexOf(e)===-1&&O5.indexOf(t)===-1)return!1;for(let r of R5){let n=r.indexOf(e),i=r.indexOf(t);if(n!==-1&&i!==-1&&n!==i)return!0}return!1}o(rtr,"areSwitchableTypes");function _k(e,t){if(!t)return!1;for(let[r,n]of Object.entries(t.schema)){if(!e.schema[r])continue;let i=n.type,s=e.schema[r].type;if(i!==s&&!rtr(i,s))return!0}return!1}o(_k,"hasTypeChanged");function OVe(e,t){return t&&e.source==="GOOGLE_SHEETS"&&(t.primary=[Tv],delete t.schema?.id),t}o(OVe,"setStaticSchemas");async function IVe(e,t){let r=C.getWorkspaceDB(),n=e._id;if(!ne.isTest()||ne.COUCH_DB_URL){let s=(await r.getIndexes()).indexes.find(a=>a.name===`search:${n}`);s&&await r.deleteIndex(s)}await bk(e,{deletion:!0}),t&&await Ic.tableDelete(e,t),await P.tables.sqs.removeTable(e)}o(IVe,"internalTableCleanup");var CVe=jJ;var $J=require("lodash/fp");function GJ(e,t,r){let n=r?.oldTable,i=n||e;for(let[s,a]of Object.entries(i.schema))if(a.type==="link"&&(r?.deleting||n?.schema[s]!=null)&&e.schema[s]==null){let u=a.tableId,c=Object.values(t).find(f=>f._id===u),l=a.relationshipType!=="many-to-many"&&a.foreignKey;if(!c||!l)continue;for(let[f,d]of Object.entries(c.schema)){if(d.type!=="link")continue;let p=d.name===a.name;d.fieldName===l&&!p&&delete c.schema[f]}}}o(GJ,"cleanupRelationships");function ntr(e){return e==="many-to-many"?"many-to-many":e==="one-to-many"?"many-to-one":"one-to-many"}o(ntr,"otherRelationshipType");function xVe(e,t,r,n){if(!r.primary||!n.primary){let l=r.primary?n.name:r.name;throw new Error(`Unable to generate many link schema, "${l}" does not have a primary key`)}let i=r.name+r.primary[0],s=n.name+n.primary[0],a=RVe(t,r,n),u=e._id,c={type:"table",_id:Ji(u,a),name:a,primary:[i,s],constrained:[i,s],sourceId:u,sourceType:"external",schema:{[i]:Vv(i,{toTable:r.name,toKey:r.primary[0]}),[s]:Vv(s,{toTable:n.name,toKey:n.primary[0]})}};return t.through=c._id,t.throughFrom=s,t.throughTo=i,t.fieldName=s,c}o(xVe,"generateManyLinkSchema");function DVe(e,t,r,n){if(!t.primary||!r.primary)throw new Error("Unable to generate link schema, no primary keys");let i=n==="one-to-many",s=i?r.primary[0]:t.primary[0],a=AVe(e,r);return e.relationshipType=n,e.foreignKey=i?a:s,e.fieldName=i?s:a,a}o(DVe,"generateLinkSchema");function PVe(e,t,r,n){let i;if(!(e.relationshipType==="many-to-many")&&e.foreignKey)i=(0,$J.cloneDeep)(e),i.fieldName=e.foreignKey,i.foreignKey=e.fieldName;else{let a=e;i=(0,$J.cloneDeep)(e),i.fieldName=a.throughTo,i.throughTo=a.throughFrom,i.throughFrom=a.throughTo}i.relationshipType=ntr(e.relationshipType),i.tableId=r._id,i.name=n,t.schema[n]=i}o(PVe,"generateRelatedSchema");function NVe(e){return e.foreignKey||e.through}o(NVe,"isRelationshipSetup");var zv={};$(zv,{allowedFields:()=>Otr,create:()=>vtr,enrichSchema:()=>ab,get:()=>dtr,getAllEnriched:()=>htr,getEnriched:()=>ptr,getTable:()=>mtr,isInternal:()=>ytr,isV2:()=>qr,isView:()=>gtr,remove:()=>Rtr,renameLinkedViews:()=>Itr,syncSchema:()=>Kv,update:()=>Atr});var VJ={};$(VJ,{create:()=>otr,get:()=>kVe,getEnriched:()=>itr,remove:()=>atr,update:()=>str});var Hv=require("lodash");function LVe(e){return e&&(0,Hv.isPlainObject)(e)&&Object.keys(e).length===0}o(LVe,"isEmptyObject");function Xi(e){let t=(0,Hv.cloneDeep)(e);if(!t.queryUI&&t.query&&!LVe(t.query)){if(!Array.isArray(t.query))throw new V("view is missing queryUI field",400);t.queryUI=We.processSearchFilters(t.query)}return t}o(Xi,"ensureQueryUISet");function sb(e){let t=(0,Hv.cloneDeep)(e);return t.queryUI&&!LVe(t.queryUI)&&(t.query=Et.buildQuery(t.queryUI)),t}o(sb,"ensureQuerySet");async function kVe(e){let t=Kr(e),{datasourceId:r,tableName:n}=mr(t),s=(await P.datasources.get(r)).entities[n],u=Object.values(s.views).filter(qr).find(c=>c.id===e);if(!u)throw new Error("No view found");return Xi(u)}o(kVe,"get");async function itr(e){let t=Kr(e),{datasourceId:r,tableName:n}=mr(t),s=(await P.datasources.get(r)).entities[n],u=Object.values(s.views).filter(qr).find(c=>c.id===e);if(u)return await ab(Xi(u),s.schema)}o(itr,"getEnriched");async function otr(e,t){let r={...t,id:xL(e),version:2};r=sb(r),r=Xi(r);let n=C.getWorkspaceDB(),{datasourceId:i,tableName:s}=mr(e),a=await P.datasources.get(i);return a.entities[s].views??={},a.entities[s].views[r.name]=r,await n.put(a),r}o(otr,"create");async function str(e,t){let r=C.getWorkspaceDB(),{datasourceId:n,tableName:i}=mr(e),s=await P.datasources.get(n);s.entities[i].views??={};let a=s.entities[i].views,u=Object.values(a).find(c=>qr(c)&&c.id===t.id);if(!u||!u.name)throw new V(`View ${t.id} not found in table ${e}`,404);if(qr(u)&&u.type!==t.type)throw new V("Cannot update view type after creation",400);return t=sb(t),t=Xi(t),delete a[u.name],a[t.name]=t,await r.put(s),{view:t,existingView:u}}o(str,"update");async function atr(e){let t=C.getWorkspaceDB(),r=await kVe(e);if(!r)throw new V(`View ${e} not found`,404);let{datasourceId:n,tableName:i}=mr(r.tableId),s=await P.datasources.get(n);return delete s.entities[i].views[r?.name],await t.put(s),r}o(atr,"remove");var HJ={};$(HJ,{create:()=>ctr,get:()=>MVe,getEnriched:()=>utr,remove:()=>ftr,update:()=>ltr});async function MVe(e){let t=Kr(e),r=await P.tables.getTable(t),i=Object.values(r.views).filter(qr).find(s=>s.id===e);if(!i)throw new Error("No view found");return Xi(i)}o(MVe,"get");async function utr(e){let t=Kr(e),r=await P.tables.getTable(t),i=Object.values(r.views).filter(qr).find(s=>s.id===e);if(i)return await ab(Xi(i),r.schema)}o(utr,"getEnriched");async function ctr(e,t){let r={...t,id:xL(e),version:2};r=sb(r),r=Xi(r);let n=C.getWorkspaceDB(),i=await P.tables.getTable(e);return i.views??={},i.views[r.name]=r,await n.put(i),r}o(ctr,"create");async function ltr(e,t){let r=C.getWorkspaceDB(),n=await P.tables.getTable(e);n.views??={};let i=Object.values(n.views).find(s=>qr(s)&&s.id===t.id);if(!i||!i.name)throw new V(`View ${t.id} not found in table ${e}`,404);if(qr(i)&&i.type!==t.type)throw new V("Cannot update view type after creation",400);return t=sb(t),t=Xi(t),delete n.views[i.name],n.views[t.name]=t,await r.put(n),{view:t,existingView:i}}o(ltr,"update");async function ftr(e){let t=C.getWorkspaceDB(),r=await MVe(e),n=await P.tables.getTable(r?.tableId);if(!r)throw new V(`View ${e} not found`,404);return delete n.views[r?.name],await t.put(n),r}o(ftr,"remove");function Qv(e){return Pt(e)?VJ:HJ}o(Qv,"pickApi");async function dtr(e){let t=Kr(e);return Qv(t).get(e)}o(dtr,"get");async function ptr(e){let t=Kr(e);return Qv(t).getEnriched(e)}o(ptr,"getEnriched");async function htr(){let e=await P.tables.getAllTables(),t=[];for(let r of e){if(!r.views||Object.keys(r.views).length===0)continue;let n=Object.values(r.views).filter(qr),i=await Promise.all(n.map(s=>ab(Xi(s),r.schema,e)));t=t.concat(i)}return t}o(htr,"getAllEnriched");async function mtr(e){let t=typeof e=="string"?e:e.id,r=C.getTableForView(t);if(r)return r;let n=Kr(t),i=await P.tables.getTable(n);return C.setTableForView(t,i),i}o(mtr,"getTable");function gtr(e){return e.id&&sn(e.id)&&e.version===2}o(gtr,"isView");function ytr(e){if(!sn(e))return!1;let t=Kr(e);return!Pt(t)}o(ytr,"isInternal");function btr(e){let t={},r=fe.views.calculationFields(e);for(let n of Object.keys(r)){let i=r[n],s=i.calculationType==="count",a="distinct"in i;if(!(s&&a)){if(t[i.field]?.[i.calculationType])throw new V(`Duplicate calculation on field "${i.field}", calculation type "${i.calculationType}"`,400);t[i.field]??={},t[i.field][i.calculationType]=!0}}}o(btr,"guardDuplicateCalculationFields");function _tr(e){let t={},r=fe.views.calculationFields(e);for(let n of Object.keys(r)){let i=r[n];if(!(!(i.calculationType==="count")||!("distinct"in i))){if(t[i.field]?.[i.calculationType])throw new V(`Duplicate calculation on field "${i.field}", calculation type "${i.calculationType} distinct"`,400);t[i.field]??={},t[i.field][i.calculationType]=!0}}}o(_tr,"guardDuplicateCountDistinctFields");async function wtr(e,t){let r=fe.views.calculationFields(t);if(btr(t),_tr(t),Object.keys(r).length>5)throw new V("Calculation views can only have a maximum of 5 fields",400);for(let i of Object.keys(r)){let s=r[i];if(!s.field)throw new V(`Calculation field "${i}" is missing a "field" property`,400);let a=e.schema[s.field];if(!a)throw new V(`Calculation field "${i}" references field "${s.field}" which does not exist in the table schema`,400);if(!(s.calculationType==="count")&&!gM(a.type)&&!OX(a))throw new V(`Calculation field "${i}" references field "${s.field}" which is not a numeric field`,400)}let n=fe.views.basicFields(t);for(let i of Object.keys(n)){let s=e.schema[i];if(!s)throw new V(`Group by field "${i}" does not exist in the table schema`,400);if(!IX(s))throw new V(`Grouping by fields of type "${s.type}" is not supported`,400)}}o(wtr,"guardCalculationViewSchema");async function UVe(e,t){let r=await P.tables.getTable(e);if(fe.views.isCalculationView(t))await wtr(r,t);else if(fe.views.hasCalculationFields(t))throw new V("Calculation fields are not allowed in non-calculation views",400);await Etr(r,t),fe.views.isCalculationView(t)||Ttr(r,t),Str(t)}o(UVe,"guardViewSchema");async function Etr(e,t){let r=t.schema||{};for(let n of Object.keys(r)){let i=r[n];if(fe.views.isCalculationField(i))continue;if(!e.schema[n])throw new V(`Field "${n}" is not valid for the requested table`,400);if(r[n].readonly&&!r[n].visible)throw new V(`Field "${n}" must be visible if you want to make it readonly`,400)}}o(Etr,"checkReadonlyFields");function Str(e){if(e.primaryDisplay&&!e.schema?.[e.primaryDisplay]?.visible)throw new V(`You can't hide "${e.primaryDisplay}" because it is the display column.`,400)}o(Str,"checkDisplayField");function Ttr(e,t){let r=e.views?.[t.name];for(let n of Object.values(e.schema)){if(!fe.schema.isRequired(n.constraints))continue;let i=t.schema?.[n.name],s=r?.schema?.[n.name];if(!(!i&&!s?.visible)){if(!i?.visible)throw new V(`You can't hide "${n.name}" because it is a required field.`,400);if(fe.views.isBasicViewField(i)&&i.readonly)throw new V(`You can't make "${n.name}" readonly because it is a required field.`,400)}}}o(Ttr,"checkRequiredFields");async function vtr(e,t){await UVe(e,t);let r=await Qv(e).create(e,t),n=await P.permissions.getResourcePerms(e);return await P.permissions.setPermissions(r.id,{writeRole:n.write.role,readRole:n.read.role}),r}o(vtr,"create");async function Atr(e,t){return await UVe(e,t),Qv(e).update(e,t)}o(Atr,"update");function qr(e){return fe.views.isV2(e)}o(qr,"isV2");async function Rtr(e){let t=Kr(e);return Qv(t).remove(e)}o(Rtr,"remove");function Otr(e,t){return[...Object.keys(e?.schema||{}).filter(r=>{if(!qr(e))return!0;let n=e.schema[r];return t==="WRITE"?n.visible&&!n.readonly:n.visible}),...ro,...Hr]}o(Otr,"allowedFields");async function ab(e,t,r){async function n(f,d){let p=r?r?.find(m=>m._id===f):await P.tables.getTable(f);if(!p)throw new Error("Cannot enrich relationship, table not found");let h={};for(let m of Object.keys(p.schema)){let g=p.schema[m];if(["link","formula","ai"].includes(g.type)||g.visible===!1)continue;let y=d[m],b=!!y?.visible,w=!!y?.readonly,E={visible:b,readonly:w,order:y?.order,width:y?.width,displayName:y?.displayName,icon:g.icon,type:g.type,subtype:g.subtype};!E.icon&&g.type==="bb_reference"&&g.subtype==="user"&&!fe.schema.isDeprecatedSingleUserColumn(g)&&(E.icon="users-three"),h[m]=E}return h}o(n,"populateRelTableSchema");let i={},s=e.schema||{},a=Object.values(s).some(f=>f.order!=null),u=Object.keys(s).filter(f=>fe.views.isCalculationField(s[f])?s[f].visible!==!1:f in t&&t[f].visible!==!1),c=Object.keys(t).filter(f=>t[f].visible!==!1),l=new Set([...u,...c]);for(let f of l){let d=s[f]||{visible:!1};i[f]={...t[f],...d,order:a?d?.order??void 0:t[f]?.order,columns:void 0},i[f].type==="link"&&(i[f].columns=await n(i[f].tableId,s[f]?.columns||{}))}return{...e,schema:i}}o(ab,"enrichSchema");function Kv(e,t,r={}){let{renameColumn:n,primaryDisplay:i,previousPrimaryDisplay:s}=r;if(n&&e.schema&&e.schema[n.old]!=null&&(e.schema[n.updated]||(e.schema[n.updated]=e.schema[n.old]),delete e.schema[n.old]),n&&e.primaryDisplay===n.old&&(e.primaryDisplay=n.updated),e.schema){for(let a of Object.keys(e.schema)){let u=e.schema[a];if(!u){delete e.schema[a];continue}!fe.views.isCalculationField(u)&&!t[a]&&delete e.schema[a]}for(let a of Object.keys(t))e.schema[a]||(e.schema[a]={visible:!1})}if(i&&(e.primaryDisplay==null||e.primaryDisplay===s)){e.primaryDisplay=i,e.schema??={};let a=e.schema[i]||{};e.schema[i]={...a,visible:!0,readonly:!1}}return e}o(Kv,"syncSchema");async function Itr(e,t){let r={};for(let n of Object.values(e.schema))n.type==="link"&&(r[n.tableId]??=await P.tables.getTable(n.tableId));for(let n of Object.values(r)){let i=!1,s=Object.values(n.views||{}).filter(P.views.isV2);if(s){for(let a of s)for(let u of Object.keys(a.schema||{}).filter(c=>{let l=n.schema[c];return!l||l.type!=="link"?!1:l.tableId===e._id})){let c=a.schema?.[u]?.columns;c&&c[t.old]&&(c[t.updated]=c[t.old],delete c[t.old],i=!0)}i&&await P.tables.saveTable(n)}}}o(Itr,"renameLinkedViews");var Yv="id";function BVe(e){return e.primary==null||e.primary.length===0}o(BVe,"noPrimaryKey");function Ctr(e,t){if(!t&&e.schema[Yv]&&BVe(e))throw new Error("External tables with no `primary` column set will define an `id` column, but we found an `id` column in the supplied schema. Either set a `primary` column or remove the `id` column.");if(_k(e,t))throw new Error("A column type has changed.");let r=Object.values(Bc);for(let[n,i]of Object.entries(e.schema))if(n!==Yv){if(i.type==="auto")throw new Error(`Column "${n}" has type "auto" - this is not supported.`);if(i.subtype&&r.includes(i.subtype))throw new Error(`Column "${n}" has subtype "${i.subtype}" - this is not supported.`);if(i.type==="datetime"){let s=t?.schema[n];if(s&&i.timeOnly!==s.timeOnly)throw new Error(`Column "${n}" can not change from time to datetime or viceversa.`)}}}o(Ctr,"validate");function xtr(e){if(!e)throw new Error("No table supplied");if(e.sourceId)return e.sourceId;if(!e._id)throw new Error("No table ID supplied");return mr(e._id).datasourceId}o(xtr,"getDatasourceId");async function QJ(e){let t=xtr(e),r={...e,created:!0};try{return(await wk(t,r)).table}catch(n){throw n instanceof Error?new V(n.message,400):new V(n?.message||n,n.status||500)}}o(QJ,"create");async function wk(e,t,r){let n={...t,type:"table",_id:Ji(e,t.name),sourceId:e},i=r?.tableId||t._id,s;i&&(s=await ub(i)),Ctr(n,s),!s&&BVe(n)&&(n.primary=[Yv],n.schema[Yv]={type:"number",autocolumn:!0,name:Yv});for(let h in n.views){let m=n.views[h];!m||!qr(m)||(n.views[h]=Kv(s.views[h],n.schema,{renameColumn:r?.renaming,primaryDisplay:n.primaryDisplay,previousPrimaryDisplay:s?.primaryDisplay}))}let a=C.getWorkspaceDB(),u=await du.get(e);u.entities||(u.entities={}),n=OVe(u,n);let c=(0,FVe.cloneDeep)(u.entities),l=u.entities,f=[];for(let h of Object.values(n.schema)){if(h.type!=="link"||NVe(h))continue;let m=h.tableId,g=Object.values(l).find(w=>w._id===m);if(!g)continue;let y=h.fieldName,b=h.relationshipType;if(b==="many-to-many"){let w=xVe(u,h,n,g);if(l[w.name])throw new Error("Junction table already exists, cannot create another relationship.");l[w.name]=w,f.push(w)}else{let w=b==="one-to-many"?n:g,E=DVe(h,n,g,b);if(w.schema[E]!=null)throw new Error(`Unable to generate foreign key - column ${E} already in use.`);w.schema[E]=Vv(E),w.constrained==null&&(w.constrained=[]),w.constrained.indexOf(E)===-1&&w.constrained.push(E),w._id!==n._id&&f.push(w)}PVe(h,g,n,y),l[g.name]=g,h.main=!0}l[n.name]=n,s&&GJ(n,l,{oldTable:s});let d=i?"UPDATE_TABLE":"CREATE_TABLE";await pk(u,d,n,s,r?.renaming);for(let h of f){let m=c[h.name],g=m?"UPDATE_TABLE":"CREATE_TABLE";await pk(u,g,h,m)}Array.isArray(n.constrained)&&(n.constrained=n.constrained.filter(h=>Object.keys(n.schema).includes(h))),delete n._rename,u.entities={...u.entities,...l},await a.put(Bv(u));let p=await du.get(u._id);return p.isSQL&&(n.sql=!0),{datasource:p,table:n,oldTable:s}}o(wk,"save");async function Dtr(e,t){let r=C.getWorkspaceDB(),n=await du.get(e),i=n.entities,s="DELETE_TABLE";return i&&(await pk(n,s,t),GJ(t,i,{deleting:!0}),delete i[t.name],n.entities=i),await r.put(Bv(n)),{datasource:await du.get(n._id),table:t}}o(Dtr,"destroy");var Xv={};$(Xv,{create:()=>KJ,destroy:()=>Ptr,save:()=>Ek});var jVe=require("lodash/fp"),WVe=B(require("lodash/isEqual"));function qVe(e,t){if(!e.schema)return e;for(let[r,n]of Object.entries(e.schema)){if(!n.autocolumn||n.subtype)continue;let i=t&&t.schema[r];i&&i.subtype?e.schema[r].subtype=i.subtype:e.schema[r]=Pv(n)}return e}o(qVe,"checkAutoColumns");async function KJ(e,t,r){let i={_id:P5(),...e,type:e.type||"table",sourceType:"internal"},s=!!t;i.views||(i.views={});try{let{table:a}=await Ek(i,{userId:r,rowsToImport:t,isImport:s});return a}catch(a){throw a instanceof Error?new V(a.message,400):new V(a.message||a,a.status||500)}}o(KJ,"create");async function Ek(e,t){let r=C.getWorkspaceDB(),n;if(t?.tableId&&(n=await ub(t.tableId)),_k(e,n))throw new Error("A column type has changed.");let i=wre(e);if(i.length)throw new Error(`Column(s) "${i.join(", ")}" are duplicated - check for other columns with these name (case in-sensitive)`);e=qVe(e,n);let s=new CVe({userId:t?.userId,oldTable:n,importRows:t?.rowsToImport});e=await s.before(e);let a=t?.renaming;if(a&&a.old===a.updated&&(a=void 0),a&&e.schema[a.updated]?.type==="link")throw new Error("Cannot rename a linked column.");let u=n?.pendingColumnRenames?n.pendingColumnRenames:[];a&&(u=vVe(u,a)),u.length>0?e.pendingColumnRenames=u:delete e.pendingColumnRenames,e=await s.mid(e,a);for(let p in e.views){let h=e.views[p];if(h){if(qr(h)){n?.views&&n.views[p]&&(e.views[p]=Kv(n.views[p],e.schema,{renameColumn:a,primaryDisplay:e.primaryDisplay,previousPrimaryDisplay:n?.primaryDisplay}));continue}h.schema.group||h.schema.field||(h.schema=e.schema)}}let c=await ca({eventType:n?"table:updated":"table:save",table:e,oldTable:n});c!=null&&c._rev&&(e._rev=c._rev);let l=s.getUpdatedRows();l&&l.length!==0&&await r.bulkDocs(l);let f=await r.put(e);e._rev=f.rev;let d=(0,jVe.cloneDeep)(e);return e=await s.after(e),(0,WVe.default)(d,e)||(f=await r.put(e),e._rev=f.rev),await bk(e,{oldTable:n,deletion:!1}),{table:e,oldTable:n}}o(Ek,"save");async function Ptr(e){let t=C.getWorkspaceDB(),r=e._id,n=(await t.allDocs(tn(r,null,{include_docs:!0}))).rows.map(i=>i.doc);return await t.bulkDocs(n.map(i=>({...i,_deleted:!0}))),await It.removeRows(n.length,{tableId:r}),await ca({eventType:"table:delete",table:e}),await t.remove(r,e._rev),await IVe(e,n),{table:e}}o(Ptr,"destroy");var YJ={};$(YJ,{isExternal:()=>cb,isInternal:()=>zJ,isTable:()=>Ntr});function cb(e){return e.table&&e.table.sourceType==="external"?!0:!!(e.tableId&&Pt(e.tableId))}o(cb,"isExternal");function zJ(e){return!cb(e)}o(zJ,"isInternal");function Ntr(e){return e._id&&vs(e._id)}o(Ntr,"isTable");var t7={};$(t7,{PermissionUpdateType:()=>GVe,getAllDBRoles:()=>HVe,getDependantResources:()=>ktr,getInheritablePermissions:()=>VVe,getResourcePerms:()=>ZJ,setPermissions:()=>e7,updatePermissionOnRole:()=>XJ});var JJ=[Ur.PermissionLevel.WRITE,Ur.PermissionLevel.READ,Ur.PermissionLevel.EXECUTE];function Ltr(e){switch(Lre(e)){case"view":return Ur.PermissionType.TABLE}switch(Nre(e)){case"ta":case"ro":case"datasource_plus":return Ur.PermissionType.TABLE;case"au":return Ur.PermissionType.AUTOMATION;case"wh":return Ur.PermissionType.WEBHOOK;case"query":case"datasource":return Ur.PermissionType.QUERY;default:return Ur.PermissionType.LEGACY_VIEW}}o(Ltr,"getPermissionType");function $Ve(e){let t=Ltr(e),r={};for(let[n,i]of Object.entries(_t.getBuiltinRoles())){if(!i.permissionId)continue;let s=Ur.getBuiltinPermissionByID(i.permissionId);if(!s)continue;let a=s.permissions.find(u=>u.type===t);if(a&&JJ.includes(a.level)){let u=a.level;r[u]=_t.lowerBuiltinRoleID(r[u],n),Ur.isPermissionLevelHigherThanRead(u)&&(r[Ur.PermissionLevel.READ]=_t.lowerBuiltinRoleID(r[Ur.PermissionLevel.READ],n))}}return r}o($Ve,"getBasePermissions");var GVe=(r=>(r.REMOVE="remove",r.ADD="add",r))(GVe||{});async function VVe(e){if(sn(e))return await ZJ(Kr(e))}o(VVe,"getInheritablePermissions");async function ZJ(e){let t=await _t.getAllRoles(),r={},n=await VVe(e);for(let s of JJ)for(let a of t)_t.checkForRoleResourceArray(a.permissions||{},e)[e]?.indexOf(s)>-1?r[s]={role:_t.getExternalRoleID(a._id,a.version),type:"EXPLICIT"}:!r[s]&&n&&n[s]&&(r[s]={role:n[s].role,type:"INHERITED"});let i=Object.entries($Ve(e)).reduce((s,[a,u])=>(s[a]={role:u,type:"BASE"},s),{});return Object.assign(i,r)}o(ZJ,"getResourcePerms");async function ktr(e){if(vs(e)){let t={},r=await P.tables.getTable(e),n=Object.values(r.views||{});for(let i of n){if(!qr(i))continue;let s=await ZJ(i.id);for(let[,a]of Object.entries(s))a.type==="INHERITED"&&(t.view??=new Set,t.view.add(i.id))}return Object.entries(t).reduce((i,[s,a])=>(i[s]=a.size,i),{})}}o(ktr,"getDependantResources");async function XJ({roleId:e,resourceId:t,level:r},n){let i=C.getWorkspaceDB(),s=n==="remove",a=_t.isBuiltin(e),u=_t.getDBRoleID(e),c=await HVe(i),l=[];if(a&&!c.some(d=>d._id===u)){let d=_t.getBuiltinRoles()[e];d._id=_t.getDBRoleID(d._id),c.push(d)}for(let d of c){let p=!1,h=d.permissions?d.permissions:{};if((!h[t]||!Array.isArray(h[t]))&&(h[t]=typeof h[t]=="string"?[h[t]]:[]),(d._id!==u||s)&&h[t].indexOf(r)!==-1&&(RWe(h[t],r),p=!0),!s&&d._id===u){let m=new Set(h[t]);h[t]=[...m.add(r)],p=!0}p&&(d.permissions=h,l.push(d))}return(await i.bulkDocs(l)).map(d=>{let p=l.find(m=>m._id===d.id)?.version;return{_id:_t.getExternalRoleID(d.id,p),rev:d.rev,error:d.error,reason:d.reason}})}o(XJ,"updatePermissionOnRole");async function e7(e,{writeRole:t,readRole:r}){await XJ({roleId:t,resourceId:e,level:"write"},"add"),await XJ({roleId:r,resourceId:e,level:"read"},"add")}o(e7,"setPermissions");async function HVe(e){return(await e.allDocs(lWe(null,{include_docs:!0}))).rows.map(r=>r.doc)}o(HVe,"getAllDBRoles");async function r7(e,t,r){let n;return cb({table:e})?n=await QJ(e):n=await KJ(e,t,r),await e7(n._id,{writeRole:_t.BUILTIN_ROLE_IDS.ADMIN,readRole:_t.BUILTIN_ROLE_IDS.ADMIN}),n}o(r7,"create");var i7={};$(i7,{external:()=>Jv,internal:()=>Xv,saveTable:()=>Mtr,update:()=>Utr});var QVe=require("lodash");async function Mtr(e){let t=C.getWorkspaceDB(),r;if(Pt(e._id)){let i=await P.datasources.get(e.sourceId);i.entities[e.name]=e,r=await t.put(i)}else r=await t.put(e);let n=(0,QVe.cloneDeep)(e);return n._rev=r.rev,n}o(Mtr,"saveTable");async function Utr(e,t){let r=e._id;if(cb({table:e})){let n=e.sourceId;await wk(n,e,{tableId:r,renaming:t})}else await Ek(e,{tableId:r,renaming:t})}o(Utr,"update");var KVe=require("lodash");async function zVe(e,t,r){if(r in e.schema)throw new Wn(`Column "${r}" already exists`);if(r==="")throw new Wn("Column name cannot be empty");if(Ff(r))throw new Wn("Column name cannot be a reserved column name");let n=e.schema[t];if(!n)throw new Wn(`Column "${t}" does not exist on table "${e.name}"`);if(n.type!=="link"||n.tableId!=="ta_users")throw new Wn("Only user relationship migration columns is currently supported");let i=n.relationshipType==="one-to-many"?"bb_reference_single":"bb_reference",s={name:r,type:i,subtype:"user"};s.type==="bb_reference"&&(s.constraints={type:"array"}),e.schema[s.name]=s,e=await P.tables.saveTable(e);let a=Ftr(e,n,s);try{return await a.doMigration()}catch(u){throw delete e.schema[s.name],await P.tables.saveTable(e),u}}o(zVe,"migrate");function Ftr(e,t,r){if(Pt(e._id))throw new Wn("External tables cannot be migrated");if(!(t.name in e.schema))throw new Wn(`Column "${t.name}" does not exist`);if(r.type!=="bb_reference_single"&&r.type!=="bb_reference")throw new Wn(`Column "${r.name}" is not a user column`);if(r.subtype!=="user")throw new Wn(`Column "${r.name}" is not a user column`);if(!DA(t))throw new Wn(`Column "${t.name}" is not a user relationship`);if(t.tableId!=="ta_users")throw new Wn(`Column "${t.name}" is not a user relationship`);if(t.relationshipType==="one-to-many"){if(r.type!=="bb_reference_single")throw new Wn(`Column "${t.name}" is a one-to-many column but "${r.name}" is not a single user column`);return new o7(e,t,r)}if(t.relationshipType==="many-to-many"||t.relationshipType==="many-to-one"){if(r.type!=="bb_reference")throw new Wn(`Column "${t.name}" is a ${t.relationshipType} column but "${r.name}" is not a multi user column`);return new s7(e,t,r)}throw new Wn("Unknown migration type")}o(Ftr,"getColumnMigrator");var Sk=class{constructor(t,r,n){this.table=t;this.oldColumn=r;this.newColumn=n}static{o(this,"UserColumnMigrator")}pickUserTableLinkSide(t){return t.doc1.tableId==="ta_users"?t.doc1:t.doc2}pickOtherTableLinkSide(t){return t.doc1.tableId==="ta_users"?t.doc2:t.doc1}async doMigration(){let t=(0,KVe.cloneDeep)(this.table),r=await P.rows.fetchRaw(this.table._id),n=r.reduce((u,c)=>(u[c._id]=c,u),{}),i=await P.links.fetchWithDocument(this.table._id);for(let u of i){let c=this.pickUserTableLinkSide(u),l=this.pickOtherTableLinkSide(u);if(l.tableId!==this.table._id||l.fieldName!==this.oldColumn.name||c.tableId!=="ta_users")continue;let f=n[l.rowId];f&&this.updateRow(f,c)}await C.getWorkspaceDB().bulkDocs(r),delete this.table.schema[this.oldColumn.name],this.table=await P.tables.saveTable(this.table),await ca({eventType:"table:updated",table:this.table,oldTable:t});let a=await P.tables.getTable(this.oldColumn.tableId);return{tablesUpdated:[this.table,a]}}},o7=class extends Sk{static{o(this,"SingleUserColumnMigrator")}updateRow(t,r){t[this.newColumn.name]=U.getGlobalIDFromUserMetadataID(r.rowId)}},s7=class extends Sk{static{o(this,"MultiUserColumnMigrator")}updateRow(t,r){t[this.newColumn.name]||(t[this.newColumn.name]=[]),t[this.newColumn.name].push(U.getGlobalIDFromUserMetadataID(r.rowId))}};var a7={};$(a7,{USER_COLUMN_PREFIX:()=>lb,addTable:()=>Htr,mapToUserColumn:()=>pu,removeTable:()=>Qtr,syncDefinition:()=>Vtr});var XVe=require("lodash");var Btr=require("lodash/fp");var SSn={_id:Gy,type:U.BUDIBASE_DATASOURCE_TYPE,name:"Sample Data",source:"BUDIBASE",config:{}};var Tk={"Created At":{name:"Created At",type:"datetime",subtype:"createdAt",icon:"ri-magic-line",autocolumn:!0,constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}}},"Updated At":{name:"Updated At",type:"datetime",subtype:"updatedAt",icon:"ri-magic-line",autocolumn:!0,constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}}}},qtr={_id:Kje,type:"table",views:{},sourceId:Gy,sourceType:"internal",primaryDisplay:"Item Name",name:"Inventory",schema:{"Item ID":{name:"Item ID",type:"number",subtype:"autoID",icon:"ri-magic-line",width:120,autocolumn:!0,constraints:{type:"number",presence:!1,numericality:{greaterThanOrEqualTo:"",lessThanOrEqualTo:""}}},"Item Name":{type:"string",constraints:{type:"string",length:{maximum:null},presence:{allowEmpty:!1}},name:"Item Name",width:160},"Item Tags":{type:"array",constraints:{type:"array",presence:{allowEmpty:!1},inclusion:["Electrical","Material","Vehicle","Office","Tools"]},name:"Item Tags",sortable:!1},Notes:{type:"longform",constraints:{type:"string",length:{},presence:!1},name:"Notes",useRichText:null,width:220},Status:{type:"options",constraints:{type:"string",presence:{allowEmpty:!1},inclusion:["Available","Repair","Broken"]},name:"Status",width:110,sortable:!1},SKU:{type:"barcodeqr",constraints:{type:"string",length:{},presence:!1},name:"SKU",width:130},"Purchase Date":{type:"datetime",constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}},name:"Purchase Date",ignoreTimezones:!0},"Purchase Price":{type:"number",constraints:{type:"number",presence:!1,numericality:{greaterThanOrEqualTo:null,lessThanOrEqualTo:""}},name:"Purchase Price",width:160},...Tk}},jtr={_id:x5,type:"table",views:{},name:"Employees",sourceId:Gy,sourceType:"internal",primaryDisplay:"First Name",schema:{"First Name":{name:"First Name",type:"string",constraints:{type:"string",length:{},presence:!1}},"Last Name":{name:"Last Name",type:"string",constraints:{type:"string",length:{},presence:!1}},Email:{name:"Email",type:"string",constraints:{type:"string",length:{},presence:!1}},Address:{name:"Address",type:"string",constraints:{type:"string",length:{},presence:!1}},City:{name:"City",type:"string",constraints:{type:"string",length:{},presence:!1}},Postcode:{name:"Postcode",type:"string",constraints:{type:"string",length:{},presence:!1}},Phone:{name:"Phone",type:"string",constraints:{type:"string",length:{},presence:!1}},"EMPLOYEE ID":{name:"EMPLOYEE ID",type:"number",subtype:"autoID",icon:"ri-magic-line",autocolumn:!0,constraints:{type:"number",presence:!1,numericality:{greaterThanOrEqualTo:"",lessThanOrEqualTo:""}}},"Employee Level":{type:"options",constraints:{type:"string",presence:!1,inclusion:["Manager","Junior","Senior","Apprentice","Contractor"]},name:"Employee Level",sortable:!1},"Badge Photo":{type:"attachment",constraints:{type:"array",presence:!1},name:"Badge Photo",sortable:!1},Jobs:{type:"link",constraints:{type:"array",presence:!1},fieldName:"Assigned",name:"Jobs",relationshipType:"many-to-many",tableId:C5},"Start Date":{type:"datetime",constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}},name:"Start Date",ignoreTimezones:!0},"End Date":{type:"datetime",constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}},name:"End Date",ignoreTimezones:!0},...Tk}},Wtr={_id:C5,type:"table",name:"Jobs",sourceId:Gy,sourceType:"internal",primaryDisplay:"Job ID",schema:{"Job ID":{name:"Job ID",type:"number",subtype:"autoID",icon:"ri-magic-line",autocolumn:!0,constraints:{type:"number",presence:!1,numericality:{greaterThanOrEqualTo:"",lessThanOrEqualTo:""}}},"Quote Date":{type:"datetime",constraints:{type:"string",length:{},presence:{allowEmpty:!1},datetime:{latest:"",earliest:""}},name:"Quote Date",ignoreTimezones:!0},"Quote Price":{type:"number",constraints:{type:"number",presence:{allowEmpty:!1},numericality:{greaterThanOrEqualTo:"",lessThanOrEqualTo:""}},name:"Quote Price"},"Works Start":{type:"datetime",constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}},name:"Works Start",ignoreTimezones:!0},Address:{type:"longform",constraints:{type:"string",length:{},presence:!1},name:"Address",useRichText:null},"Customer Name":{type:"string",constraints:{type:"string",length:{maximum:null},presence:!1},name:"Customer Name"},Notes:{type:"longform",constraints:{type:"string",length:{},presence:!1},name:"Notes",useRichText:null},"Customer Phone":{type:"string",constraints:{type:"string",length:{maximum:null},presence:!1},name:"Customer Phone"},"Customer Email":{type:"string",constraints:{type:"string",length:{maximum:null},presence:!1},name:"Customer Email"},Assigned:{name:"Assigned",type:"link",tableId:x5,fieldName:"Jobs",relationshipType:"many-to-many"},"Works End":{type:"datetime",constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}},name:"Works End",ignoreTimezones:!0},"Updated Price":{type:"number",constraints:{type:"number",presence:!1,numericality:{greaterThanOrEqualTo:"",lessThanOrEqualTo:""}},name:"Updated Price"},...Tk}},$tr={_id:zje,type:"table",views:{},name:"Expenses",sourceId:Gy,sourceType:"internal",primaryDisplay:"Expense ID",schema:{"Expense ID":{name:"Expense ID",type:"number",subtype:"autoID",icon:"ri-magic-line",autocolumn:!0,constraints:{type:"number",presence:!1,numericality:{greaterThanOrEqualTo:"",lessThanOrEqualTo:""}}},"Expense Tags":{type:"array",constraints:{type:"array",presence:{allowEmpty:!1},inclusion:["Fuel","Food","Materials","Repair","Equipment","Fees","Service","Office","Other"]},name:"Expense Tags",sortable:!1},Cost:{type:"number",constraints:{type:"number",presence:{allowEmpty:!1},numericality:{greaterThanOrEqualTo:"",lessThanOrEqualTo:""}},name:"Cost"},Notes:{type:"longform",constraints:{type:"string",length:{},presence:!1},name:"Notes",useRichText:null},"Payment Due":{type:"datetime",constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}},name:"Payment Due",ignoreTimezones:!0},"Date Paid":{type:"datetime",constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}},name:"Date Paid",ignoreTimezones:!0},Attachment:{type:"attachment",constraints:{type:"array",presence:!1},name:"Attachment",sortable:!1},...Tk}},YVe=[qtr,jtr,Wtr,$tr];var JVe={boolean:"NUMERIC",datetime:"VARCHAR",formula:"VARCHAR",ai:"VARCHAR",longform:"VARCHAR",number:"REAL",string:"VARCHAR",auto:"REAL",options:"VARCHAR",json:"BLOB",internal:"BLOB",barcodeqr:"BLOB",attachment:"BLOB",attachment_single:"BLOB",signature_single:"BLOB",array:"BLOB",link:"BLOB",bigint:"VARCHAR",bb_reference:"VARCHAR",bb_reference_single:"VARCHAR"};function Gtr(e,t){let r=e._id,n=t.tableId;return{tableId:Rf(r,n),definition:{"doc1.rowId":"VARCHAR","doc1.tableId":"VARCHAR","doc1.fieldName":"VARCHAR","doc2.rowId":"VARCHAR","doc2.tableId":"VARCHAR","doc2.fieldName":"VARCHAR",tableId:"VARCHAR"}}}o(Gtr,"buildRelationshipDefinitions");var lb="data_";function pu(e){return`${lb}${fe.schema.encodeNonAscii(e)}`}o(pu,"mapToUserColumn");function ZVe(e){let t={},r={},n=[];for(let[a,u]of Object.entries(e.schema)){if(u.type==="link"){let{tableId:l,definition:f}=Gtr(e,u);t[l]={fields:f}}if(!JVe[u.type])throw new Error(`Unable to map type "${u.type}" to SQLite type`);let c=a.toLowerCase();n.includes(c)||(n.push(c),r[pu(a)]={field:a,type:JVe[u.type]})}let i={};Hr.forEach(a=>{i[a]="VARCHAR"});let s={...i,...r};return t[e._id]={fields:s},t}o(ZVe,"mapTable");async function eHe(){let e=await vh.getAllInternalTables();for(let r of YVe)e.find(n=>n._id===r._id)||e.push(r);let t=He.designDoc.base("tableId");for(let r of e)t.sql.tables={...t.sql.tables,...ZVe(r)};return t}o(eHe,"buildBaseDefinition");async function Vtr(){let e=C.getWorkspaceDB(),t;try{t=await e.get(Ln)}catch(n){if(n.status!==404)throw n}let r=await eHe();t&&(r._rev=t._rev),(!t||!(0,XVe.isEqual)(t.sql,r.sql))&&await e.put(r)}o(Vtr,"syncDefinition");async function Htr(e){let t=C.getWorkspaceDB(),r;try{r=await t.get(Ln)}catch{r=await eHe()}r.sql.tables={...r.sql.tables,...ZVe(e)},await t.put(r)}o(Htr,"addTable");async function Qtr(e){let t=C.getWorkspaceDB();try{let[r,n]=await Promise.all([vh.getAllInternalTables(),t.get(Ln)]),i=r.map(a=>a._id).filter(a=>!a.includes(e._id)),s=!1;for(let a of Object.keys(n.sql?.tables||{}))i.find(u=>a.includes(u))||(delete n.sql.tables[a],s=!0);s&&(await t.put(n),await t.sqlDiskCleanup())}catch(r){if(r?.status===404)return;throw r}}o(Qtr,"removeTable");async function tHe(e,t){let r=await Zv(),i={name:fe.duplicateName(e.name,r.map(a=>a.name)),type:e.type,sourceType:e.sourceType,sourceId:e.sourceId,schema:{...e.schema},primaryDisplay:e.primaryDisplay,views:{},indexes:e.indexes?{...e.indexes}:void 0},s=await r7(i,void 0,t);return await Le.table.created(s),s}o(tHe,"duplicate");var vh={populateExternalTableSchemas:Bv,...n7,...i7,...u7,...YJ,migrate:zVe,sqs:a7,duplicate:tHe};function Ktr(e){let t={};for(let[r,n]of Object.entries(e))if(r.includes("."))t[r]="Table names containing dots are not supported.";else{let s=Object.keys(n.schema).find(a=>a.includes("."));s&&(t[r]=`Column '${s}' is not supported as it contains a dot.`)}return t}o(Ktr,"checkForSchemaErrors");async function rHe(e,t){let r=await ztr(e,t);if(!t)return r;let n={tables:{},errors:{}};for(let i in r.tables)t.some(s=>s.toLowerCase()===i.toLowerCase())&&(n.tables[i]=r.tables[i]);for(let i in r.errors)t.some(s=>s.toLowerCase()===i.toLowerCase())&&(n.errors[i]=r.errors[i]);return{...n,errors:{...n.errors,...Ktr(n.tables)}}}o(rHe,"buildFilteredSchema");async function ztr(e,t){return await(await nHe(e)).buildSchema(e._id,e.entities,t)}o(ztr,"buildSchemaHelper");async function nHe(e){let t=await rb(e.source);return e._id&&(e=await sk(e)),new t(e.config)}o(nHe,"getConnector");async function Ytr(e){if(e._id){let t=await ak(e._id);e=RJ(e,t)}return await sk(e)}o(Ytr,"getAndMergeDatasource");async function Jtr(e,t){let r=C.getWorkspaceDB(),n=await ak(e),{tables:i,errors:s}=await rHe(n,t),a=n.entities||{},u=Object.keys(a).filter(l=>!Object.keys(i).includes(l));for(let l of u)await P.rowActions.deleteAll(a[l]._id);n.entities=i,uk(n);let c=await r.put(vh.populateExternalTableSchemas(n));return n._rev=c.rev,{datasource:n,errors:s}}o(Jtr,"buildSchemaFromSource");var du={...ck,...c7};async function Ah(e){return await Zi.tracer.trace("processTable",async t=>{if(!e)return e;if(t.addTags({tableId:e._id}),e={...e},e.views){t.addTags({numViews:Object.keys(e.views).length});for(let[r,n]of Object.entries(e.views))qr(n)&&(e.views[r]=Xi(n))}return e._id&&Pt(e._id)?(t.addTags({isExternal:!0}),e.schema.id&&!e.schema.id.name&&(e.schema.id.name="id"),{...e,type:"table",sourceType:"external"}):(t.addTags({isExternal:!1}),{...e,type:"table",primary:["_id"],sourceId:e.sourceId||Nn,sourceType:"internal",sql:!0})})}o(Ah,"processTable");async function eA(e){return await Zi.tracer.trace("processTables",async t=>(t.addTags({numTables:e.length}),await Promise.all(e.map(r=>Ah(r)))))}o(eA,"processTables");async function Xtr(e){return await Zi.tracer.trace("processEntities",async t=>{t.addTags({numTables:Object.keys(e).length});for(let r of Object.keys(e))e[r]=await Ah(e[r]);return e})}o(Xtr,"processEntities");async function Zv(e){return await Zi.tracer.trace("getAllInternalTables",async t=>{e||(e=C.getWorkspaceDB()),t.addTags({db:e.name});let r=await e.allDocs(Af(null,{include_docs:!0}));return t.addTags({numTables:r.rows.length}),await eA(r.rows.map(n=>n.doc))})}o(Zv,"getAllInternalTables");async function Ztr(e){return await Zi.tracer.trace("getAllInternalTableIds",async t=>{let r=e||C.getWorkspaceDB();t.addTags({db:r.name});let{rows:n}=await r.allDocs(Af(null,{include_docs:!1})),i=n.map(({id:s})=>s);return t.addTags({numTableIds:i.length}),i})}o(Ztr,"getAllInternalTableIds");async function err(){let e=await Zv(),t=[];return C.doInWorkspaceContext(C.getProdWorkspaceId(),async()=>{let r=C.getWorkspaceDB(),n=o(async i=>{let a=0;for(;;){let{rows:u}=await r.allDocs(tn(i,null,{include_docs:!1,limit:25,skip:a}));if(u.length===0)return!1;if(u.some(l=>!l.value?.deleted))return!0;if(u.length<25)return!1;a+=25}},"hasNonDeletedRows");for(let i of e){if(i._id===$t.USER_METADATA||!i._id)continue;await n(i._id)||t.push(i._id)}return t})}o(err,"listEmptyProductionTables");async function iHe(){return await Zi.tracer.trace("getAllExternalTables",async e=>{let t=await P.datasources.fetch({enriched:!0});e.addTags({numDatasources:t.length});let r=t.filter(i=>i._id!==Nn).map(i=>i.entities);e.addTags({numEntities:r.length});let n=[];for(let i of r)i&&(n=n.concat(Object.values(i)));return n=n.filter(i=>i._id&&Pt(i._id)),e.addTags({numTables:n.length}),await eA(n)})}o(iHe,"getAllExternalTables");async function oHe(e,t){return await Zi.tracer.trace("getExternalTable",async r=>{r.addTags({datasourceId:e,tableName:t});let n=await sHe(e);if(!n[t])throw new Error(`Unable to find table named "${t}"`);let i=await Ah(n[t]);return i.sourceId||(i.sourceId=e),i})}o(oHe,"getExternalTable");async function ub(e){return await Zi.tracer.trace("getTable",async t=>{let r=C.getWorkspaceDB();t.addTags({tableId:e,db:r.name});let n;if(e&&Pt(e)){let{datasourceId:i,tableName:s}=mr(e);t.addTags({isExternal:!0,datasourceId:i,tableName:s});let a=await du.get(i);n={...await oHe(i,s),sql:Cf(a)},t.addTags({isSQL:Cf(a)})}else n=await r.get(e);return await Ah(n)})}o(ub,"getTable");async function l7(e){return await Zi.tracer.trace("doesTableExist",async t=>{t.addTags({tableId:e});try{let r=await ub(e);return t.addTags({tableExists:!!r}),!!r}catch{return t.addTags({tableExists:!1}),!1}})}o(l7,"doesTableExist");async function trr(){return await Zi.tracer.trace("getAllTables",async e=>{let[t,r]=await Promise.all([Zv(),iHe()]);return e.addTags({numInternalTables:t.length,numExternalTables:r.length}),await eA([...t,...r])})}o(trr,"getAllTables");async function sHe(e){return await Zi.tracer.trace("getExternalTablesInDatasource",async t=>{let r=await du.get(e,{enriched:!0});if(!r||!r.entities)throw new Error("Datasource is not configured fully.");return t.addTags({datasourceId:e,numEntities:Object.keys(r.entities).length}),await Xtr(r.entities)})}o(sHe,"getExternalTablesInDatasource");async function rrr(e){return Zi.tracer.trace("getTables",async t=>{t.addTags({numTableIds:e.length});let r=e.filter(s=>Pt(s)),n=e.filter(s=>!Pt(s)),i=[];if(r.length){let s=await iHe();i=i.concat(s.filter(a=>r.indexOf(a._id)!==-1))}if(n.length){let a=await C.getWorkspaceDB().getMultiple(n,{allowMissing:!0});i=i.concat(a)}return t.addTags({numTables:i.length}),await eA(i)})}o(rrr,"getTables");async function nrr(e){return await Zi.tracer.trace("enrichViewSchemas",async t=>{t.addTags({tableId:e._id});let r=[];for(let n of Object.values(e.views??[]))P.views.isV2(n)?r.push(await P.views.enrichSchema(n,e.schema)):r.push(n);return{...e,views:r.reduce((n,i)=>(n[i.name]=i,n),{})}})}o(nrr,"enrichViewSchemas");var drr=require("@bull-board/api"),prr=require("@bull-board/api/bullAdapter"),hrr=require("@bull-board/koa");var Ak=B(require("dd-trace"));var irr=o(async()=>{let e=await hWe(),t=[];for(let n of e)if(!n.tableId&&!n.tableId){let i=new xv(n.doc1.tableId,n.doc1.fieldName,n.doc1.rowId,n.doc2.tableId,n.doc2.fieldName,n.doc2.rowId);i._id=n._id,i._rev=n._rev,t.push(i)}let r=C.getWorkspaceDB();t.length&&await r.bulkDocs(t),await P.tables.sqs.syncDefinition()},"migration"),aHe=irr;var orr=o(async()=>{let e=await P.screens.fetch(),t=await P.workspaces.metadata.get(),r=await P.workspaceApps.fetch(C.getWorkspaceDB()),[n]=r;n||(n=await P.workspaceApps.create({name:t.name,url:"/",navigation:t.navigation,isDefault:!0}));let i=C.getWorkspaceDB(),s=e.filter(u=>!u.workspaceAppId).map(u=>({...u,workspaceAppId:n._id}));for(let u of r)u.url||s.push({...u,url:u.urlPrefix||"/",urlPrefix:void 0});let a=await i.get("_design/database");a.views?.screen_routes_2&&a.views.screen_routes_2.version===void 0&&(delete a.views?.screen_routes_2,s.push(a)),await i.bulkDocs(s)},"migration"),uHe=orr;var srr=o(async()=>{let t=(await P.workspaceApps.fetch()).filter(r=>r.isDefault);if(t.length>1){let[r,...n]=t.sort((u,c)=>c.updatedAt.localeCompare(u.updatedAt)),i=C.getWorkspaceDB(),s=[],a=await P.screens.fetch();for(let u of n)s.push({...u,_deleted:!0}),s.push(...a.filter(c=>c.workspaceAppId===u._id).map(c=>({...c,workspaceAppId:r._id})));await i.bulkDocs(s)}},"migration"),cHe=srr;var f7=[{id:"20240604153647_initial_sqs",func:aHe},{id:"20250618162639_workspace_apps",func:uHe},{id:"20250729134531_workspace_cleanups",func:cHe}];var arr=Wt.fromDays(1).toSeconds();async function d7(e){return U.doWithDB(e,t=>t.get("_design/migrations"),{skip_setup:!0})}o(d7,"getFromDB");var vk=o(e=>`appmigrations_${L.VERSION}_${e}`,"getWorkspaceMigrationCacheKey");async function p7(e){let t=vk(e),r=await Ue.get(t);if(r)return r;try{r=(await d7(e)).version||""}catch(n){if(n.status!==404)throw n;r=""}return r&&await Ue.store(t,r,arr),r}o(p7,"getWorkspaceMigrationVerions");async function lHe({workspaceId:e,version:t,skipHistory:r}){let n=U.getDB(e),i;try{i=await d7(e)}catch(u){if(u.status!==404)throw u;i={_id:"_design/migrations",version:"",initialVersion:t,history:{}},await n.put(i),i=await d7(e)}let s={...i,version:t};r||(s.history[t]={runAt:new Date().toISOString()}),await n.put(s);let a=vk(e);await Ue.destroy(a)}o(lHe,"updateWorkspaceMigrationMetadata");async function h7(e,t){if(ne.isTest()&&ne.SKIP_MIGRATION_LOCKS_IN_TESTS)return console.log("Bypassing lock for in test environment"),t();console.log(`Acquiring app migration lock for "${e}"`);let r=U.getProdWorkspaceID(e),{result:n}=await jn.doWithLock({name:"app_migrations",type:"auto_extend",resource:r},async()=>(console.log(`Migration lock acquired for app "${r}"`),await t()));return n}o(h7,"doInMigrationLock");var HTn=new RegExp(["appPackage"].join("|"));async function fHe(e,t){let r=await p7(e),n=t.findIndex(i=>i.id===r);return t.slice(n+1)}o(fHe,"getPendingMigrationsForWorkspace");function crr(e){return Object.values(e).flatMap(t=>t).map(t=>t.id)}o(crr,"getAllPendingMigrationIds");function lrr(e,t){return e.filter(r=>t.includes(r.id))}o(lrr,"getUniquePendingMigrations");async function dHe({migrationId:e,migrationFunc:t,workspaceId:r}){await Ak.default.trace("runMigrationForApp",async n=>{n.addTags({appId:r,migrationId:e}),await C.doInWorkspaceMigrationContext(r,async()=>{console.log(`Running migration "${e}" for app "${r}"`),await t(),console.log(`Migration "${e}" ran for app "${r}"`)})})}o(dHe,"runMigrationForApp");async function frr(e){await Ak.default.trace("runMigrationForApp",async t=>{t.addTags({appId:e}),await C.doInWorkspaceMigrationContext(e,async()=>{await P.workspaces.syncWorkspace(e),console.log(`Workspace synchronized for dev "${e}"`)})})}o(frr,"syncDevApp");async function pHe(e,t){await C.doInWorkspaceMigrationContext(e,()=>lHe({workspaceId:e,version:t}))}o(pHe,"updateMigrationVersion");async function m7(e,t=f7){console.log(`Processing workspace migration for "${e}"`),await Ak.default.trace("runMigrationForApp",async r=>{r.addTags({appId:e});try{await C.doInWorkspaceContext(e,()=>h7(e,async()=>{let n=U.getDevWorkspaceID(e),i=U.getProdWorkspaceID(e),s=await P.workspaces.isWorkspacePublished(i),a=s?i:n;console.log(`Starting workspace migration for "${a}"`);let u={[n]:await fHe(n,t),[i]:s?await fHe(i,t):[]};function c(p,h){return u[h].some(m=>m.id===p)}o(c,"needsToRun");let l=crr(u),f=lrr(t,l);r.addTags({migrationsToRun:f.length}),console.log(`Workspace migrations to run for "${a}" - ${f.map(p=>p.id).join(",")}`);let d=0;for(let{id:p,func:h,disabled:m}of f){if(m){console.log(`Migration ${p} is disabled, stopping migration process`);return}let g=`(${++d}/${f.length})`;console.info(`Running migration ${p}... ${g}`,{migrationId:p,workspaceId:a});let y=c(p,a),b=s&&c(p,n);y&&await dHe({migrationId:p,migrationFunc:h,workspaceId:a}),b&&(await frr(n),await dHe({migrationId:p,migrationFunc:h,workspaceId:n})),y&&await pHe(a,p),b&&await pHe(n,p)}console.log(`Workspace migration for "${a}" processed`)}))}catch(n){throw Ne.logAlert("Failed to run workspace migration",n),n}})}o(m7,"processMigrations");var hHe=3;var avn=new Xr.BudibaseQueue(Xr.JobQueue.APP_MIGRATION,{jobOptions:{attempts:hHe,removeOnComplete:!0,removeOnFail:!0},maxStalledCount:hHe,removeStalledCb:async e=>{Ne.logAlert(`App migration failed, queue job ID: ${e.id} - reason: ${e.failedReason}`)}});var fb=new Xr.BudibaseQueue(Xr.JobQueue.AUTOMATION,{removeStalledCb:e=>g7(e),jobTags:e=>({"automation.id":e.automation._id,"automation.name":e.automation.name,"automation.appId":e.automation.appId,"automation.createdAt":e.automation.createdAt,"automation.trigger":e.automation.definition.trigger.stepId})});var Srr=B(require("dd-trace"));var gHe=(r=>(r.API="api",r.AUTOMATIONS="automations",r))(gHe||{});function mrr(e,t){let r;t?r=t.split(","):r=e;for(let n of r)if(!e.includes(n))throw new Error(`Feature: ${n} is not an allowed option`);return r}o(mrr,"processFeatureEnvVar");var grr=mrr(Object.values(gHe),ne.APP_FEATURES);function yHe(){return grr.includes("automations")}o(yHe,"automationsEnabled");var y7=B(require("worker-farm"));function bHe(e){let t=null;switch(e){case"query":t="./query";break;case"automation":t="./automation";break;default:throw"Unknown thread type"}return require.resolve(t)}o(bHe,"typeToFile");var pb=class e{static{o(this,"Thread")}static{this.workerRefs=[]}constructor(t,r={timeoutMs:null,count:1}){if(this.type=t,this.count=r.count?r.count:1,this.disableThreading=this.shouldDisableThreading(),this.disableThreading)console.log(`[${ne.FORKED_PROCESS_NAME}] skipping worker farm type=${t}`);else{console.log(`[${ne.FORKED_PROCESS_NAME}] initialising worker farm type=${t}`);let n={autoStart:!0,maxConcurrentWorkers:this.count,workerOptions:{env:{...process.env,FORKED_PROCESS:"1",FORKED_PROCESS_NAME:t},execArgv:process.execArgv.some(i=>i.startsWith("--enable-source-maps"))?["--enable-source-maps"]:void 0}};r.timeoutMs&&(this.timeoutMs=r.timeoutMs,n.maxCallTime=r.timeoutMs),this.workers=(0,y7.default)(n,bHe(t),["execute"]),e.workerRefs.push(this.workers)}}shouldDisableThreading(){return!!(ne.isTest()||ne.DISABLE_THREADING||this.count===0||ne.isInThread())}run(t){let r=this.timeoutMs;return new Promise((n,i)=>{function s(a){a.execute(t,(u,c)=>{u&&u.type==="TimeoutError"?i(new Error(`Thread timeout exceeded ${r}ms timeout.`)):u?i(u):n(c)})}o(s,"fire"),this.disableThreading?import(bHe(this.type)).then(a=>{s(a)}):s(this.workers)})}static stopThreads(){return new Promise(t=>{e.workerRefs.length===0&&t();let r=0;function n(){r++,r>=e.workerRefs.length&&t()}o(n,"complete");for(let i of e.workerRefs)y7.default.end(i,n);e.workerRefs=[]})}static async shutdown(){await e.stopThreads(),console.log("Threads shutdown")}};var yrr=require("mailparser"),brr=require("html-to-text");var _rr=require("imapflow");var b7=o(async e=>{let t=C.getWorkspaceDB(),r=CL("automationEmailState",`${e}:`),n=`${r}${cWe}`,i=await t.allDocs({startkey:r,endkey:n,include_docs:!1});if(!i.rows.length)return;let s=i.rows.map(a=>{let u=a.value?._rev;if(u)return{_id:a.id,_rev:u,_deleted:!0}}).filter(a=>!!a);s.length&&await t.bulkDocs(s)},"deleteAutomationMailboxState");var Trr=require("lodash");var vrr;yHe()&&(vrr=new pb("automation"));async function wHe(e){let t=await fb.getBullQueue().getRepeatableJobs();for(let r of t)r.id===e&&await fb.getBullQueue().removeRepeatableByKey(r.key);console.log(`jobId=${e} disabled`)}o(wHe,"disableCronById");var HAn=Ge.triggers.definitions,EHe={removeOnComplete:!0,removeOnFail:!0};async function Rrr(){return(await C.getWorkspaceDB().allDocs(Rc(null,{include_docs:!0}))).rows.map(r=>r.doc)}o(Rrr,"getAllAutomations");async function Orr(e,t){let r=e.row.tableId;if(e.appId==null)throw`No appId specified for ${t} - check event emitters.`;!r||!await l7(r)||await C.doInWorkspaceContext(e.appId,async()=>{let n=await Rrr();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&&D5(e.appId)&&!await V5(i._id))continue;if(await SHe(i,{row:e.row,oldRow:e.oldRow}))try{await fb.add({automation:i,event:e},EHe)}catch(a){Ne.logAlert("Failed to queue automation",a)}}})}o(Orr,"queueRelevantRowAutomations");async function _7(e,t){try{await Orr(e,t)}catch(r){Ne.logWarn("Unable to process row event",r)}}o(_7,"queueRowAutomations");_h.on("row:save",async function(e){!e||!e.row||!e.row.tableId||await _7(e,"row:save")});_h.on("row:update",async function(e){!e||!e.row||!e.row.tableId||await _7(e,"row:update")});_h.on("row:delete",async function(e){!e||!e.row||!e.row.tableId||await _7(e,"row:delete")});function Irr(e,t){return Et.runQuery([e],t).length>0}o(Irr,"rowPassesFilters");function Ok(e){return e!==null&&"steps"in e&&Array.isArray(e.steps)}o(Ok,"isAutomationResults");async function Dc(e,t,{getResponses:r,onProgress:n}={}){if(e.disabled)throw new Error("Automation is disabled");if(on.automations.isAppAction(e)&&!await V5(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]=gh(t.fields[l],c[l]);t.fields=a}else(on.automations.isRowAction(e)||on.automations.isWebhookAction(e))&&(t={...t,...t.fields,fields:{}});let i={automation:e,event:t};return await SHe(e,{row:i.event?.row??{},oldRow:i.event?.oldRow??{}})?r?(i.event={...i.event,appId:C.getWorkspaceId(),automation:e},w7({data:i},{onProgress:n})):fb.add(i,EHe):{outputs:{success:!1,status:"stopped"},message:"Automation did not run. Filter conditions in trigger were not met."}}o(Dc,"externalTrigger");async function SHe(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 hb(s,t.row);return Irr(a,i)}return!0}o(SHe,"checkTriggerFilters");var THe="Trigger this automation (APP triggers only). Returns all step outputs.",vHe="Fields map: key/value pairs. Values must be string, number, boolean, or array (no nested objects).",Crr=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"),xrr=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 Dc(i,{fields:r},{getResponses:!0});return Ok(a)?{success:a.status==="success",status:a.status,steps:a.steps}:{success:!1,error:a.message||"Automation did not trigger"}},"triggerAutomationById"),Drr=[{name:"list_automations",sourceType:"AUTOMATION",sourceLabel:"Budibase",description:"List all automations in the current app",tool:(0,Ck.tool)({description:"List all automations in the current app",inputSchema:Lo.z.object({}),execute:async()=>({automations:await P.automations.fetch()})})},{name:"get_automation",sourceType:"AUTOMATION",sourceLabel:"Budibase",description:"Get details about a specific automation by ID",tool:(0,Ck.tool)({description:"Get details about a specific automation by ID",inputSchema:Lo.z.object({automationId:Lo.z.string().describe("The ID of the automation to retrieve")}),execute:async e=>{let{automationId:t}=e;return{automation:await P.automations.get(t)}}})}],Prr=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=Crr(r),u=a?`${vHe} Available fields: ${a}.`:vHe,c=a?`Trigger "${n}" automation. ${THe} Fields: ${a}.`:`Trigger "${n}" automation. ${THe}`;return{name:s,readableName:`${n}.trigger`,sourceType:"AUTOMATION",sourceLabel:"Budibase",description:c,tool:(0,Ck.tool)({description:c,inputSchema:Lo.z.object({fields:Lo.z.record(Lo.z.string(),Lo.z.union([Lo.z.string(),Lo.z.number(),Lo.z.boolean(),Lo.z.array(Lo.z.unknown())])).nullish().describe(u)}),execute:async l=>{let{fields:f}=l;return xrr({automationId:r._id,fields:f})}})}});return[...Drr,...t]},"createAutomationTools"),AHe=Prr;var E7=require("ai"),tA=require("zod");var Nrr=[{name:"list_tables",sourceType:"INTERNAL_TABLE",sourceLabel:"Budibase",description:"List all tables in the current app",tool:(0,E7.tool)({description:"List all tables in the current app",inputSchema:tA.z.object({showSchema:tA.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 P.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,E7.tool)({description:"Get details about a specific table by ID",inputSchema:tA.z.object({tableId:tA.z.string().describe("The ID of the table to retrieve")}),execute:async e=>{let{tableId:t}=e;return{table:await P.tables.getTable(t)}}})}],RHe=Nrr;var IHe=require("ai"),Ve=require("zod");var OHe="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.",xk='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.',S7='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"}}.',Lrr=30,krr=o(e=>new Set(e==="external"?ro:Hr),"getProtectedColumns"),Mrr=o(e=>e.type==="formula"||e.type==="auto"||e.type==="ai"||e.autocolumn===!0,"isReadOnlyField"),CHe=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"),Urr=o(({name:e,schema:t})=>{let r=`${e} (${CHe(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"),Frr=o((e,t)=>{let r=krr(t);return Object.entries(e).filter(([n,i])=>!(r.has(n)||Mrr(i))).map(([n,i])=>({name:n,schema:i}))},"getWritableFields"),Brr=o(e=>{if(e.length===0)return"";let t=e.map(Urr),r=t.slice(0,Lrr),n=t.length-r.length;return n>0&&r.push(`... +${n} more (use get_table for full schema)`),r.join(", ")},"buildSchemaSummary"),qrr=o(e=>e?`${xk} Available fields: ${e}.`:xk,"buildDataFieldDescription"),jrr=o((e,t)=>{if(e.length===0)return Ve.z.record(Ve.z.string(),Ve.z.any()).describe(xk);let r={};for(let n of e){let i=CHe(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(qrr(t))},"buildRowDataSchema"),Wrr=o(e=>e?`${S7} Available fields: ${e}.`:S7,"buildSearchQueryDescription"),$rr=o(e=>Ve.z.object({query:Ve.z.union([Ve.z.record(Ve.z.string(),Ve.z.any()),Ve.z.string()]).nullish().describe(Wrr(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"),Grr={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 P.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 P.rows.find(e,t)})},create_row:{description:`Create a new row. Only include fields that match the table schema. ${OHe}`,inputSchema:Ve.z.object({data:Ve.z.record(Ve.z.string(),Ve.z.any()).describe(xk)}),execute:async(e,{data:t})=>{let{row:r}=await P.rows.save(e,t,void 0);return{row:r}}},update_row:{description:`Update an existing row. ${OHe}`,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 P.rows.find(e,t),...n,_id:t,_rev:r},{row:a}=await P.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(S7),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 P.rows.search(s)).rows}}}},Vrr=o(e=>e.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" "),"formatActionLabel"),xHe=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=Frr(n,r),f=Brr(l),d=jrr(l,f),p=$rr(f);return Object.entries(Grr).map(([h,m])=>{let g=`${Vrr(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,IHe.tool)({description:g,inputSchema:w,execute:async E=>m.execute(e,E)})}})},"createRowTools");var DHe=o((e=[],t={},r={},n=[])=>{let i=[...AHe(n),...RHe],s=e.filter(a=>a._id).flatMap(a=>{let u=a.sourceType==="external";return xHe({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 jk=require("ai");var a3e=require("ai"),F7=require("zod");var M7=require("lodash"),knr=require("mongodb");function PHe(){let e={replication:!0,find:!0};ne.isTest()&&!ne.COUCH_DB_URL&&(e.inMemory=!0,e.allDbs=!0),Xke({db:e})}o(PHe,"init");var UHe=require("serialize-error");var FHe=B(require("dd-trace"));var T7=B(require("isolated-vm")),kHe=B(require("bson")),Dk=B(require("url")),rA=B(require("crypto")),MHe=B(require("querystring"));var LHe=B(require("fs"));var Qrr={helpers:"./index-helpers.ivm.bundle.js",bson:"./bson.ivm.bundle.js",snippets:"./snippets.ivm.bundle.js",buffer:"./buffer.ivm.bundle.js",bson_polyfills:"./bson-polyfills.ivm.bundle.js"},NHe={};function gb(e){let t=NHe[e];return t||(t=LHe.default.readFileSync(require.resolve(Qrr[e]),"utf-8"),NHe[e]=t,t)}o(gb,"loadBundle");var v7=class e extends Error{constructor(){super(...arguments);this.code=e.code}static{o(this,"JsRequestTimeoutError")}static{this.code="JS_REQUEST_TIMEOUT_ERROR"}},yb=class{constructor({memoryLimit:t,invocationTimeout:r,isolateAccumulatedTimeout:n}={}){this.codeWrapper=t=>t;this.resultKey="results";this.isolate=new T7.default.Isolate({memoryLimit:t||ne.JS_RUNNER_MEMORY_LIMIT}),this.vm=this.isolate.createContextSync(),this.jail=this.vm.global,this.jail.setSync("global",this.jail.derefInto()),this.runResultKey=rA.default.randomUUID(),this.runErrorKey=rA.default.randomUUID(),this.addToContext({[this.resultKey]:{[this.runResultKey]:""}}),this.invocationTimeout=r||ne.JS_PER_INVOCATION_TIMEOUT_MS,this.isolateAccumulatedTimeout=n}static{o(this,"IsolatedVM")}withHelpers(){let t=this.registerCallbacks({resolve:Dk.default.resolve,parse:Dk.default.parse}),r=this.registerCallbacks({escape:MHe.default.escape}),n=this.registerCallbacks({randomUUID:rA.default.randomUUID});this.addToContext({helpersStripProtocol:u=>{let c=Dk.default.parse(u);return c.protocol="",c.format()}});let i=`require=function req(val) {
1006
+ }`,...m}}o(Pf,"default");function pVe(e){return e?.groupByMulti??e?.schema?.group?.type==="array"}o(pVe,"getGroupByMulti");async function hVe(){let e=C.getWorkspaceDB(),t=[];if(ne.SELF_HOSTED){let r=await e.get("_design/database");for(let n of Object.keys(r.views||{})){if(Object.values(Ac).indexOf(n)!==-1)continue;let s=r.views?.[n];s&&t.push({name:n,...s})}}else{let r=(await e.allDocs(wWe({include_docs:!0}))).rows.map(n=>n.doc);for(let n of r)t.push({name:n.name,...n.view})}return t}o(hVe,"getViews");async function LJ(e,t,r){let n=C.getWorkspaceDB();if(ne.SELF_HOSTED){let i=await n.get("_design/database");i.views={...i.views,[t]:r},e&&delete i.views[e],await n.put(i)}else{let i=Rv(t),s=e?Rv(e):null,a={_id:i,view:r,name:t,tableId:r.meta.tableId};try{let u=await n.get(i);if(s){let c=await n.get(s);await n.remove(c._id,c._rev)}u&&u._rev&&(a._rev=u._rev)}catch{}await n.put(a)}}o(LJ,"saveView");async function mVe(e,t){let r=await e.get("_design/database"),n=r.views?.[t].meta;if(!n)throw new Error("Unable to migrate view - no metadata");let i=Pf(n,pVe(n));delete r.views?.[t],await e.put(r),await LJ(null,t,i)}o(mVe,"migrateToInMemoryView");async function gVe(e,t){let r=await e.get(Rv(t)),n=await e.get("_design/database"),i=r.view.meta;if(!i)throw new Error("Unable to migrate view - no metadata");n.views||(n.views={}),n.views[t]=Pf(i,pVe(i)),await e.put(n),await e.remove(r._id,r._rev)}o(gVe,"migrateToDesignView");async function kJ(e,t){let n=(await e.get("_design/database")).views?.[t];if(n==null)throw{status:404,message:"Unable to get view"};return n}o(kJ,"getFromDesignDoc");async function MJ(e,t){let r=await e.get(Rv(t));if(r)return r.view;throw{status:404,message:"Unable to get view"}}o(MJ,"getFromMemoryDoc");var bVe=require("lodash/fp"),qJ=B(require("lodash/isEqual")),_Ve=B(require("lodash/uniq"));var ob=require("lodash/fp"),yVe=B(require("lodash/isEqual"));function Qer(e,t){let r=(0,ob.merge)(e,t);for(let n of Object.keys(t))t[n]===void 0&&delete r[n];return r}o(Qer,"mergeRows");async function yk(e,t){let r=C.getWorkspaceDB();if(!e.relatedFormula)return;let n=[];for(let i of Array.isArray(t)?t:[t]){let s={};for(let[a,u]of Object.entries(i)){let c=e.schema[a];if(c&&c.type==="link"){let l=c.tableId;s[l]||(s[l]=[]);let f=s[l].map(p=>p._id),d=u.filter(p=>!f.includes(p._id));s[l]=s[l].concat(d)}}for(let a of e.relatedFormula){let u;try{if(!s[a]||s[a].length===0)continue;u=await r.get(a)}catch{}for(let c of Object.values(u.schema))if(c.type==="formula"&&c.formulaType==="static"){n=n.concat(s[a].map(l=>Gv(u,l,{updateFormula:!1,updateAIColumns:!1})));break}}}await Promise.all(n)}o(yk,"updateRelatedFormula");async function UJ(e){let t=C.getWorkspaceDB(),r=(await t.allDocs(tn(e._id,null,{include_docs:!0}))).rows.map(s=>s.doc),n=await zt(e,(0,ob.cloneDeep)(r),{squash:!1}),i=[];for(let s of r){let a=n.find(u=>u._id===s._id);if(a){let u=await au(e,(0,ob.cloneDeep)(s),{dynamic:!1,contextRows:[a]});(0,yVe.default)(u,s)||i.push(u)}}await t.bulkDocs(i)}o(UJ,"updateAllFormulasInTable");async function Gv(e,t,r){let n=C.getWorkspaceDB(),{updateFormula:i=!0,updateAIColumns:s=!0}=r||{},a=P.views.isView(e)?await P.views.getTable(e.id):e;t.type="row";let u=await zt(e,(0,ob.cloneDeep)(t),{squash:!1});t=await au(a,t,{dynamic:!1,contextRows:[u]}),s&&(t=await R$e(a,t,{contextRows:[u]})),await n.put(t);let c=await n.tryGet(t._id);if(!c)throw new Error(`Unable to retrieve row ${t._id} after saving.`);delete u._rev,u=Qer(c,u),u=await au(a,u,{dynamic:!1}),i&&await yk(a,u);let l=await jL(e,u);return{row:u,squashed:l,table:a}}o(Gv,"finaliseRow");function wVe(e){return e.type==="formula"&&e.formulaType==="static"}o(wVe,"isStaticFormula");function FJ(e,t){let r=[];t=Array.isArray(t)?t:[t];for(let n of Object.values(e.schema))wVe(n)&&dje(n?.formula??"",t)&&r.push(n.name);return r}o(FJ,"getFormulaThatUseColumn");async function Ker(e,{oldTable:t,deletion:r}){let n=(await P.tables.getAllInternalTables()).filter(a=>a._id!==e._id),i=t?t.schema:e.schema,s=Object.values(i).filter(a=>r||!e.schema[a.name]);for(let a of s){let u=e;if(a.type==="link"){let l=a.tableId;u=n.find(f=>f._id===l)}if(!u)continue;let c=FJ(u,a.name);if(c.length>0&&await BJ(e,c),!!e.relatedFormula)for(let l of e.relatedFormula){let f=Object.values(e.schema).filter(p=>p.type==="link"&&p.tableId===l),d=n.find(p=>p._id===l);if(d&&f&&a.type!=="link"){let p=[];for(let h of f)p=p.concat(FJ(d,[h.fieldName,a.name]));p.length>0&&await BJ(d,(0,_Ve.default)(p))}}}}o(Ker,"checkIfFormulaNeedsCleared");async function zer(e,{deletion:t}={}){let r=e._id,n=C.getWorkspaceDB(),i=(await P.tables.getAllInternalTables()).filter(u=>u._id!==r),s=(0,bVe.cloneDeep)(i),a=Object.values(e.schema).filter(Of);for(let u of i){if(!u.relatedFormula)continue;let c=u.relatedFormula.indexOf(r);c!==-1&&u.relatedFormula.splice(c,1)}if(!t)for(let u of a){let c=FJ(e,u.name);if(!c||c.length===0)continue;let l=i.find(f=>f._id===u.tableId);l&&(!l.relatedFormula||!l.relatedFormula.includes(r))&&(l.relatedFormula=l.relatedFormula?[...l.relatedFormula,r]:[r])}for(let u of s){let c=i.find(l=>u._id===l._id);c&&!(0,qJ.default)(u,c)&&await n.put(c)}}o(zer,"updateRelatedFormulaLinksOnTables");async function Yer(e,{oldTable:t}){Object.values(e.schema).find(n=>wVe(n)&&(!t||!t.schema[n.name]||!(0,qJ.default)(t.schema[n.name],n)))!=null&&await UJ(e)}o(Yer,"checkIfFormulaUpdated");async function bk(e,{oldTable:t,deletion:r}){await zer(e,{deletion:r}),await Ker(e,{oldTable:t,deletion:r}),r||await Yer(e,{oldTable:t})}o(bk,"runStaticFormulaChecks");async function BJ(e,t){let r=C.getWorkspaceDB(),n=await r.allDocs(tn(e._id,null,{include_docs:!0}));return await r.bulkDocs(n.rows.map(({doc:i})=>(t.forEach(s=>delete i[s]),i)))}o(BJ,"clearColumns");async function Jer(e,t,r){let n=C.getWorkspaceDB(),i=[],s=[];if(t&&t.schema&&e.schema&&(s=Object.keys(t.schema).filter(a=>e.schema[a]==null)),r||s.length!==0){let u=(await n.allDocs(tn(e._id,null,{include_docs:!0}))).rows.map(({doc:c})=>c);i=u.map(c=>{if(c=(0,EVe.cloneDeep)(c),r){let l=c[r.updated]!==void 0,f=c[r.old]!==void 0;!l&&f&&(c[r.updated]=c[r.old]),delete c[r.old]}else s.length!==0&&s.forEach(l=>delete c[l]);return c}),await Ic.tableUpdate(e,u,{oldTable:t,rename:r}),await ttr(e,s,r)}return{rows:i,table:e}}o(Jer,"checkForColumnUpdates");function Xer(e,t){if(!e)return t;t._rev=e._rev;let r,n;for([r,n]of Object.entries(e.schema))if(n.autocolumn&&n.subtype==="autoID"&&t.schema[r]){let i=t.schema[r];i.lastID=n.lastID}return t}o(Xer,"makeSureTableUpToDate");async function TVe(e,t,r,n){let i=t,s=[],a=!!n?.keepCouchId;for(let u=0;u<e.length;u++){let c=e[u];c._id=a&&c._id||fWe(t._id),c.type="row",c.tableId=t._id,c=await la(r,t,c,{noAutoRelationships:!0});for(let[l,f]of Object.entries(i.schema)){if(f.type==="link"&&e.find(d=>d[l]))throw new V(`Can't bulk import relationship fields for internal databases, found value in field "${l}"`,400);if((f.type==="options"||f.type==="array")&&c[l]){let d=Array.isArray(c[l]),p=d?c[l]:[c[l]],h=[...f.constraints.inclusion,...p],m=new Set(h);f.constraints.inclusion=Array.from(m),f.constraints.inclusion.sort(),!d&&f.type==="array"&&(c[l]=p)}}s.push(c)}return s}o(TVe,"importToRows");async function WJ(e,t){let r=e.schema,n=t?.identifierFields||[],i=t?.importRows;if(!i||!gk(i)||!mk(r))return e;let s=C.getWorkspaceDB(),a=PJ(i,e),u=await TVe(a,e,t?.userId,{keepCouchId:n.includes("_id")}),c=u.length;return n.length>0&&(await s.allDocs(tn(e._id,null,{include_docs:!0}))).rows.map(f=>f.doc).forEach(f=>{u.forEach(d=>{let p=!0;for(let h of n)if(d[h]!==f[h]){p=!1;break}p&&(d._id=f._id,d._rev=f._rev,c--)})}),await It.addRows(c,()=>s.bulkDocs(u),{tableId:e._id}),await Le.rows.imported(e,u.length),e}o(WJ,"handleDataImport");async function Zer(e){let t=C.getWorkspaceDB();if(e.indexes&&e.indexes.length>0){let r=await t.getIndexes(),n=`search:${e._id}`,i=r.indexes.find(s=>s.name===n);if(i){let s=i.def.fields.map(a=>Object.keys(a)[0]);(0,SVe.default)(s,e.indexes)||(await t.deleteIndex(i),await t.createIndex({index:{fields:e.indexes,name:n,ddoc:"search_ddoc",type:"json"}}))}else await t.createIndex({index:{fields:e.indexes,name:n,ddoc:"search_ddoc",type:"json"}})}return e}o(Zer,"handleSearchIndexes");function etr(e){if(e._id===$t.USER_METADATA)for(let[t,r]of Object.entries(Hje.schema))e.schema[t]==null&&(e.schema[t]=r);return e}o(etr,"checkStaticTables");var jJ=class{static{o(this,"TableSaveFunctions")}constructor({userId:t,oldTable:r,importRows:n}){this.db=C.getWorkspaceDB(),this.userId=t,this.oldTable=r,this.importRows=n,this.rows=[]}async before(t){return this.oldTable&&(t=Xer(this.oldTable,t)),t=etr(t),t}async mid(t,r){let n=await Jer(t,this.oldTable,r);return this.rows=this.rows.concat(n.rows),t}async after(t){return t=await Zer(t),t=await WJ(t,{importRows:this.importRows,userId:this.userId}),await P.tables.sqs.addTable(t),t}getUpdatedRows(){return this.rows}};async function ttr(e,t,r){let i=(await hVe()).filter(s=>s.meta?.tableId===e._id);for(let s of i){let a=!1,u=s.meta;if(u&&(r?(u.field===r.old&&(u.field=r.updated,a=!0),u.groupBy===r.old&&(u.groupBy=r.updated,a=!0),u.filters&&u.filters.forEach(c=>{c.key===r.old&&(c.key=r.updated,a=!0)})):t&&t.forEach(c=>{if(u.field===c&&(delete u.field,delete u.calculation,delete u.groupBy,a=!0),u.groupBy===c&&(delete u.groupBy,a=!0),u.filters&&u.filters.length){let l=u.filters.length;u.filters=u.filters.filter(f=>f.key!==c),l!==u.filters.length&&(a=!0)}}),a)){let c=Object.values(e.schema).find(d=>d.name==s.groupBy),l=Pf(u,c?.type==="array"),f=s.name;await LJ(null,f,l),l.meta?.schema||(l.meta.schema=e.schema),e.views?.[f]&&(e.views[f]=l.meta)}}}o(ttr,"checkForViewUpdates");function vVe(e,t){let r=e?[...e]:[];return r.push(t),r}o(vVe,"mergePendingColumnRenames");function AVe(e,t){return`fk_${t.name}_${e.fieldName}`}o(AVe,"generateForeignKey");function RVe(e,t,r){return`jt_${t.name}_${r.name}_${e.name}_${e.fieldName}`}o(RVe,"generateJunctionTableName");function Vv(e,t){let r={type:"number",constraints:{},name:e};return t&&(r.meta=t),r}o(Vv,"foreignKeyStructure");function rtr(e,t){if(O5.indexOf(e)===-1&&O5.indexOf(t)===-1)return!1;for(let r of R5){let n=r.indexOf(e),i=r.indexOf(t);if(n!==-1&&i!==-1&&n!==i)return!0}return!1}o(rtr,"areSwitchableTypes");function _k(e,t){if(!t)return!1;for(let[r,n]of Object.entries(t.schema)){if(!e.schema[r])continue;let i=n.type,s=e.schema[r].type;if(i!==s&&!rtr(i,s))return!0}return!1}o(_k,"hasTypeChanged");function OVe(e,t){return t&&e.source==="GOOGLE_SHEETS"&&(t.primary=[Tv],delete t.schema?.id),t}o(OVe,"setStaticSchemas");async function IVe(e,t){let r=C.getWorkspaceDB(),n=e._id;if(!ne.isTest()||ne.COUCH_DB_URL){let s=(await r.getIndexes()).indexes.find(a=>a.name===`search:${n}`);s&&await r.deleteIndex(s)}await bk(e,{deletion:!0}),t&&await Ic.tableDelete(e,t),await P.tables.sqs.removeTable(e)}o(IVe,"internalTableCleanup");var CVe=jJ;var $J=require("lodash/fp");function GJ(e,t,r){let n=r?.oldTable,i=n||e;for(let[s,a]of Object.entries(i.schema))if(a.type==="link"&&(r?.deleting||n?.schema[s]!=null)&&e.schema[s]==null){let u=a.tableId,c=Object.values(t).find(f=>f._id===u),l=a.relationshipType!=="many-to-many"&&a.foreignKey;if(!c||!l)continue;for(let[f,d]of Object.entries(c.schema)){if(d.type!=="link")continue;let p=d.name===a.name;d.fieldName===l&&!p&&delete c.schema[f]}}}o(GJ,"cleanupRelationships");function ntr(e){return e==="many-to-many"?"many-to-many":e==="one-to-many"?"many-to-one":"one-to-many"}o(ntr,"otherRelationshipType");function xVe(e,t,r,n){if(!r.primary||!n.primary){let l=r.primary?n.name:r.name;throw new Error(`Unable to generate many link schema, "${l}" does not have a primary key`)}let i=r.name+r.primary[0],s=n.name+n.primary[0],a=RVe(t,r,n),u=e._id,c={type:"table",_id:Ji(u,a),name:a,primary:[i,s],constrained:[i,s],sourceId:u,sourceType:"external",schema:{[i]:Vv(i,{toTable:r.name,toKey:r.primary[0]}),[s]:Vv(s,{toTable:n.name,toKey:n.primary[0]})}};return t.through=c._id,t.throughFrom=s,t.throughTo=i,t.fieldName=s,c}o(xVe,"generateManyLinkSchema");function DVe(e,t,r,n){if(!t.primary||!r.primary)throw new Error("Unable to generate link schema, no primary keys");let i=n==="one-to-many",s=i?r.primary[0]:t.primary[0],a=AVe(e,r);return e.relationshipType=n,e.foreignKey=i?a:s,e.fieldName=i?s:a,a}o(DVe,"generateLinkSchema");function PVe(e,t,r,n){let i;if(!(e.relationshipType==="many-to-many")&&e.foreignKey)i=(0,$J.cloneDeep)(e),i.fieldName=e.foreignKey,i.foreignKey=e.fieldName;else{let a=e;i=(0,$J.cloneDeep)(e),i.fieldName=a.throughTo,i.throughTo=a.throughFrom,i.throughFrom=a.throughTo}i.relationshipType=ntr(e.relationshipType),i.tableId=r._id,i.name=n,t.schema[n]=i}o(PVe,"generateRelatedSchema");function NVe(e){return e.foreignKey||e.through}o(NVe,"isRelationshipSetup");var zv={};$(zv,{allowedFields:()=>Otr,create:()=>vtr,enrichSchema:()=>ab,get:()=>dtr,getAllEnriched:()=>htr,getEnriched:()=>ptr,getTable:()=>mtr,isInternal:()=>ytr,isV2:()=>qr,isView:()=>gtr,remove:()=>Rtr,renameLinkedViews:()=>Itr,syncSchema:()=>Kv,update:()=>Atr});var VJ={};$(VJ,{create:()=>otr,get:()=>kVe,getEnriched:()=>itr,remove:()=>atr,update:()=>str});var Hv=require("lodash");function LVe(e){return e&&(0,Hv.isPlainObject)(e)&&Object.keys(e).length===0}o(LVe,"isEmptyObject");function Xi(e){let t=(0,Hv.cloneDeep)(e);if(!t.queryUI&&t.query&&!LVe(t.query)){if(!Array.isArray(t.query))throw new V("view is missing queryUI field",400);t.queryUI=We.processSearchFilters(t.query)}return t}o(Xi,"ensureQueryUISet");function sb(e){let t=(0,Hv.cloneDeep)(e);return t.queryUI&&!LVe(t.queryUI)&&(t.query=Et.buildQuery(t.queryUI)),t}o(sb,"ensureQuerySet");async function kVe(e){let t=Kr(e),{datasourceId:r,tableName:n}=mr(t),s=(await P.datasources.get(r)).entities[n],u=Object.values(s.views).filter(qr).find(c=>c.id===e);if(!u)throw new Error("No view found");return Xi(u)}o(kVe,"get");async function itr(e){let t=Kr(e),{datasourceId:r,tableName:n}=mr(t),s=(await P.datasources.get(r)).entities[n],u=Object.values(s.views).filter(qr).find(c=>c.id===e);if(u)return await ab(Xi(u),s.schema)}o(itr,"getEnriched");async function otr(e,t){let r={...t,id:xL(e),version:2};r=sb(r),r=Xi(r);let n=C.getWorkspaceDB(),{datasourceId:i,tableName:s}=mr(e),a=await P.datasources.get(i);return a.entities[s].views??={},a.entities[s].views[r.name]=r,await n.put(a),r}o(otr,"create");async function str(e,t){let r=C.getWorkspaceDB(),{datasourceId:n,tableName:i}=mr(e),s=await P.datasources.get(n);s.entities[i].views??={};let a=s.entities[i].views,u=Object.values(a).find(c=>qr(c)&&c.id===t.id);if(!u||!u.name)throw new V(`View ${t.id} not found in table ${e}`,404);if(qr(u)&&u.type!==t.type)throw new V("Cannot update view type after creation",400);return t=sb(t),t=Xi(t),delete a[u.name],a[t.name]=t,await r.put(s),{view:t,existingView:u}}o(str,"update");async function atr(e){let t=C.getWorkspaceDB(),r=await kVe(e);if(!r)throw new V(`View ${e} not found`,404);let{datasourceId:n,tableName:i}=mr(r.tableId),s=await P.datasources.get(n);return delete s.entities[i].views[r?.name],await t.put(s),r}o(atr,"remove");var HJ={};$(HJ,{create:()=>ctr,get:()=>MVe,getEnriched:()=>utr,remove:()=>ftr,update:()=>ltr});async function MVe(e){let t=Kr(e),r=await P.tables.getTable(t),i=Object.values(r.views).filter(qr).find(s=>s.id===e);if(!i)throw new Error("No view found");return Xi(i)}o(MVe,"get");async function utr(e){let t=Kr(e),r=await P.tables.getTable(t),i=Object.values(r.views).filter(qr).find(s=>s.id===e);if(i)return await ab(Xi(i),r.schema)}o(utr,"getEnriched");async function ctr(e,t){let r={...t,id:xL(e),version:2};r=sb(r),r=Xi(r);let n=C.getWorkspaceDB(),i=await P.tables.getTable(e);return i.views??={},i.views[r.name]=r,await n.put(i),r}o(ctr,"create");async function ltr(e,t){let r=C.getWorkspaceDB(),n=await P.tables.getTable(e);n.views??={};let i=Object.values(n.views).find(s=>qr(s)&&s.id===t.id);if(!i||!i.name)throw new V(`View ${t.id} not found in table ${e}`,404);if(qr(i)&&i.type!==t.type)throw new V("Cannot update view type after creation",400);return t=sb(t),t=Xi(t),delete n.views[i.name],n.views[t.name]=t,await r.put(n),{view:t,existingView:i}}o(ltr,"update");async function ftr(e){let t=C.getWorkspaceDB(),r=await MVe(e),n=await P.tables.getTable(r?.tableId);if(!r)throw new V(`View ${e} not found`,404);return delete n.views[r?.name],await t.put(n),r}o(ftr,"remove");function Qv(e){return Pt(e)?VJ:HJ}o(Qv,"pickApi");async function dtr(e){let t=Kr(e);return Qv(t).get(e)}o(dtr,"get");async function ptr(e){let t=Kr(e);return Qv(t).getEnriched(e)}o(ptr,"getEnriched");async function htr(){let e=await P.tables.getAllTables(),t=[];for(let r of e){if(!r.views||Object.keys(r.views).length===0)continue;let n=Object.values(r.views).filter(qr),i=await Promise.all(n.map(s=>ab(Xi(s),r.schema,e)));t=t.concat(i)}return t}o(htr,"getAllEnriched");async function mtr(e){let t=typeof e=="string"?e:e.id,r=C.getTableForView(t);if(r)return r;let n=Kr(t),i=await P.tables.getTable(n);return C.setTableForView(t,i),i}o(mtr,"getTable");function gtr(e){return e.id&&sn(e.id)&&e.version===2}o(gtr,"isView");function ytr(e){if(!sn(e))return!1;let t=Kr(e);return!Pt(t)}o(ytr,"isInternal");function btr(e){let t={},r=fe.views.calculationFields(e);for(let n of Object.keys(r)){let i=r[n],s=i.calculationType==="count",a="distinct"in i;if(!(s&&a)){if(t[i.field]?.[i.calculationType])throw new V(`Duplicate calculation on field "${i.field}", calculation type "${i.calculationType}"`,400);t[i.field]??={},t[i.field][i.calculationType]=!0}}}o(btr,"guardDuplicateCalculationFields");function _tr(e){let t={},r=fe.views.calculationFields(e);for(let n of Object.keys(r)){let i=r[n];if(!(!(i.calculationType==="count")||!("distinct"in i))){if(t[i.field]?.[i.calculationType])throw new V(`Duplicate calculation on field "${i.field}", calculation type "${i.calculationType} distinct"`,400);t[i.field]??={},t[i.field][i.calculationType]=!0}}}o(_tr,"guardDuplicateCountDistinctFields");async function wtr(e,t){let r=fe.views.calculationFields(t);if(btr(t),_tr(t),Object.keys(r).length>5)throw new V("Calculation views can only have a maximum of 5 fields",400);for(let i of Object.keys(r)){let s=r[i];if(!s.field)throw new V(`Calculation field "${i}" is missing a "field" property`,400);let a=e.schema[s.field];if(!a)throw new V(`Calculation field "${i}" references field "${s.field}" which does not exist in the table schema`,400);if(!(s.calculationType==="count")&&!gM(a.type)&&!OX(a))throw new V(`Calculation field "${i}" references field "${s.field}" which is not a numeric field`,400)}let n=fe.views.basicFields(t);for(let i of Object.keys(n)){let s=e.schema[i];if(!s)throw new V(`Group by field "${i}" does not exist in the table schema`,400);if(!IX(s))throw new V(`Grouping by fields of type "${s.type}" is not supported`,400)}}o(wtr,"guardCalculationViewSchema");async function UVe(e,t){let r=await P.tables.getTable(e);if(fe.views.isCalculationView(t))await wtr(r,t);else if(fe.views.hasCalculationFields(t))throw new V("Calculation fields are not allowed in non-calculation views",400);await Etr(r,t),fe.views.isCalculationView(t)||Ttr(r,t),Str(t)}o(UVe,"guardViewSchema");async function Etr(e,t){let r=t.schema||{};for(let n of Object.keys(r)){let i=r[n];if(fe.views.isCalculationField(i))continue;if(!e.schema[n])throw new V(`Field "${n}" is not valid for the requested table`,400);if(r[n].readonly&&!r[n].visible)throw new V(`Field "${n}" must be visible if you want to make it readonly`,400)}}o(Etr,"checkReadonlyFields");function Str(e){if(e.primaryDisplay&&!e.schema?.[e.primaryDisplay]?.visible)throw new V(`You can't hide "${e.primaryDisplay}" because it is the display column.`,400)}o(Str,"checkDisplayField");function Ttr(e,t){let r=e.views?.[t.name];for(let n of Object.values(e.schema)){if(!fe.schema.isRequired(n.constraints))continue;let i=t.schema?.[n.name],s=r?.schema?.[n.name];if(!(!i&&!s?.visible)){if(!i?.visible)throw new V(`You can't hide "${n.name}" because it is a required field.`,400);if(fe.views.isBasicViewField(i)&&i.readonly)throw new V(`You can't make "${n.name}" readonly because it is a required field.`,400)}}}o(Ttr,"checkRequiredFields");async function vtr(e,t){await UVe(e,t);let r=await Qv(e).create(e,t),n=await P.permissions.getResourcePerms(e);return await P.permissions.setPermissions(r.id,{writeRole:n.write.role,readRole:n.read.role}),r}o(vtr,"create");async function Atr(e,t){return await UVe(e,t),Qv(e).update(e,t)}o(Atr,"update");function qr(e){return fe.views.isV2(e)}o(qr,"isV2");async function Rtr(e){let t=Kr(e);return Qv(t).remove(e)}o(Rtr,"remove");function Otr(e,t){return[...Object.keys(e?.schema||{}).filter(r=>{if(!qr(e))return!0;let n=e.schema[r];return t==="WRITE"?n.visible&&!n.readonly:n.visible}),...ro,...Hr]}o(Otr,"allowedFields");async function ab(e,t,r){async function n(f,d){let p=r?r?.find(m=>m._id===f):await P.tables.getTable(f);if(!p)throw new Error("Cannot enrich relationship, table not found");let h={};for(let m of Object.keys(p.schema)){let g=p.schema[m];if(["link","formula","ai"].includes(g.type)||g.visible===!1)continue;let y=d[m],b=!!y?.visible,w=!!y?.readonly,E={visible:b,readonly:w,order:y?.order,width:y?.width,displayName:y?.displayName,icon:g.icon,type:g.type,subtype:g.subtype};!E.icon&&g.type==="bb_reference"&&g.subtype==="user"&&!fe.schema.isDeprecatedSingleUserColumn(g)&&(E.icon="users-three"),h[m]=E}return h}o(n,"populateRelTableSchema");let i={},s=e.schema||{},a=Object.values(s).some(f=>f.order!=null),u=Object.keys(s).filter(f=>fe.views.isCalculationField(s[f])?s[f].visible!==!1:f in t&&t[f].visible!==!1),c=Object.keys(t).filter(f=>t[f].visible!==!1),l=new Set([...u,...c]);for(let f of l){let d=s[f]||{visible:!1};i[f]={...t[f],...d,order:a?d?.order??void 0:t[f]?.order,columns:void 0},i[f].type==="link"&&(i[f].columns=await n(i[f].tableId,s[f]?.columns||{}))}return{...e,schema:i}}o(ab,"enrichSchema");function Kv(e,t,r={}){let{renameColumn:n,primaryDisplay:i,previousPrimaryDisplay:s}=r;if(n&&e.schema&&e.schema[n.old]!=null&&(e.schema[n.updated]||(e.schema[n.updated]=e.schema[n.old]),delete e.schema[n.old]),n&&e.primaryDisplay===n.old&&(e.primaryDisplay=n.updated),e.schema){for(let a of Object.keys(e.schema)){let u=e.schema[a];if(!u){delete e.schema[a];continue}!fe.views.isCalculationField(u)&&!t[a]&&delete e.schema[a]}for(let a of Object.keys(t))e.schema[a]||(e.schema[a]={visible:!1})}if(i&&(e.primaryDisplay==null||e.primaryDisplay===s)){e.primaryDisplay=i,e.schema??={};let a=e.schema[i]||{};e.schema[i]={...a,visible:!0,readonly:!1}}return e}o(Kv,"syncSchema");async function Itr(e,t){let r={};for(let n of Object.values(e.schema))n.type==="link"&&(r[n.tableId]??=await P.tables.getTable(n.tableId));for(let n of Object.values(r)){let i=!1,s=Object.values(n.views||{}).filter(P.views.isV2);if(s){for(let a of s)for(let u of Object.keys(a.schema||{}).filter(c=>{let l=n.schema[c];return!l||l.type!=="link"?!1:l.tableId===e._id})){let c=a.schema?.[u]?.columns;c&&c[t.old]&&(c[t.updated]=c[t.old],delete c[t.old],i=!0)}i&&await P.tables.saveTable(n)}}}o(Itr,"renameLinkedViews");var Yv="id";function BVe(e){return e.primary==null||e.primary.length===0}o(BVe,"noPrimaryKey");function Ctr(e,t){if(!t&&e.schema[Yv]&&BVe(e))throw new Error("External tables with no `primary` column set will define an `id` column, but we found an `id` column in the supplied schema. Either set a `primary` column or remove the `id` column.");if(_k(e,t))throw new Error("A column type has changed.");let r=Object.values(Bc);for(let[n,i]of Object.entries(e.schema))if(n!==Yv){if(i.type==="auto")throw new Error(`Column "${n}" has type "auto" - this is not supported.`);if(i.subtype&&r.includes(i.subtype))throw new Error(`Column "${n}" has subtype "${i.subtype}" - this is not supported.`);if(i.type==="datetime"){let s=t?.schema[n];if(s&&i.timeOnly!==s.timeOnly)throw new Error(`Column "${n}" can not change from time to datetime or viceversa.`)}}}o(Ctr,"validate");function xtr(e){if(!e)throw new Error("No table supplied");if(e.sourceId)return e.sourceId;if(!e._id)throw new Error("No table ID supplied");return mr(e._id).datasourceId}o(xtr,"getDatasourceId");async function QJ(e){let t=xtr(e),r={...e,created:!0};try{return(await wk(t,r)).table}catch(n){throw n instanceof Error?new V(n.message,400):new V(n?.message||n,n.status||500)}}o(QJ,"create");async function wk(e,t,r){let n={...t,type:"table",_id:Ji(e,t.name),sourceId:e},i=r?.tableId||t._id,s;i&&(s=await ub(i)),Ctr(n,s),!s&&BVe(n)&&(n.primary=[Yv],n.schema[Yv]={type:"number",autocolumn:!0,name:Yv});for(let h in n.views){let m=n.views[h];!m||!qr(m)||(n.views[h]=Kv(s.views[h],n.schema,{renameColumn:r?.renaming,primaryDisplay:n.primaryDisplay,previousPrimaryDisplay:s?.primaryDisplay}))}let a=C.getWorkspaceDB(),u=await du.get(e);u.entities||(u.entities={}),n=OVe(u,n);let c=(0,FVe.cloneDeep)(u.entities),l=u.entities,f=[];for(let h of Object.values(n.schema)){if(h.type!=="link"||NVe(h))continue;let m=h.tableId,g=Object.values(l).find(w=>w._id===m);if(!g)continue;let y=h.fieldName,b=h.relationshipType;if(b==="many-to-many"){let w=xVe(u,h,n,g);if(l[w.name])throw new Error("Junction table already exists, cannot create another relationship.");l[w.name]=w,f.push(w)}else{let w=b==="one-to-many"?n:g,E=DVe(h,n,g,b);if(w.schema[E]!=null)throw new Error(`Unable to generate foreign key - column ${E} already in use.`);w.schema[E]=Vv(E),w.constrained==null&&(w.constrained=[]),w.constrained.indexOf(E)===-1&&w.constrained.push(E),w._id!==n._id&&f.push(w)}PVe(h,g,n,y),l[g.name]=g,h.main=!0}l[n.name]=n,s&&GJ(n,l,{oldTable:s});let d=i?"UPDATE_TABLE":"CREATE_TABLE";await pk(u,d,n,s,r?.renaming);for(let h of f){let m=c[h.name],g=m?"UPDATE_TABLE":"CREATE_TABLE";await pk(u,g,h,m)}Array.isArray(n.constrained)&&(n.constrained=n.constrained.filter(h=>Object.keys(n.schema).includes(h))),delete n._rename,u.entities={...u.entities,...l},await a.put(Bv(u));let p=await du.get(u._id);return p.isSQL&&(n.sql=!0),{datasource:p,table:n,oldTable:s}}o(wk,"save");async function Dtr(e,t){let r=C.getWorkspaceDB(),n=await du.get(e),i=n.entities,s="DELETE_TABLE";return i&&(await pk(n,s,t),GJ(t,i,{deleting:!0}),delete i[t.name],n.entities=i),await r.put(Bv(n)),{datasource:await du.get(n._id),table:t}}o(Dtr,"destroy");var Xv={};$(Xv,{create:()=>KJ,destroy:()=>Ptr,save:()=>Ek});var jVe=require("lodash/fp"),WVe=B(require("lodash/isEqual"));function qVe(e,t){if(!e.schema)return e;for(let[r,n]of Object.entries(e.schema)){if(!n.autocolumn||n.subtype)continue;let i=t&&t.schema[r];i&&i.subtype?e.schema[r].subtype=i.subtype:e.schema[r]=Pv(n)}return e}o(qVe,"checkAutoColumns");async function KJ(e,t,r){let i={_id:P5(),...e,type:e.type||"table",sourceType:"internal"},s=!!t;i.views||(i.views={});try{let{table:a}=await Ek(i,{userId:r,rowsToImport:t,isImport:s});return a}catch(a){throw a instanceof Error?new V(a.message,400):new V(a.message||a,a.status||500)}}o(KJ,"create");async function Ek(e,t){let r=C.getWorkspaceDB(),n;if(t?.tableId&&(n=await ub(t.tableId)),_k(e,n))throw new Error("A column type has changed.");let i=wre(e);if(i.length)throw new Error(`Column(s) "${i.join(", ")}" are duplicated - check for other columns with these name (case in-sensitive)`);e=qVe(e,n);let s=new CVe({userId:t?.userId,oldTable:n,importRows:t?.rowsToImport});e=await s.before(e);let a=t?.renaming;if(a&&a.old===a.updated&&(a=void 0),a&&e.schema[a.updated]?.type==="link")throw new Error("Cannot rename a linked column.");let u=n?.pendingColumnRenames?n.pendingColumnRenames:[];a&&(u=vVe(u,a)),u.length>0?e.pendingColumnRenames=u:delete e.pendingColumnRenames,e=await s.mid(e,a);for(let p in e.views){let h=e.views[p];if(h){if(qr(h)){n?.views&&n.views[p]&&(e.views[p]=Kv(n.views[p],e.schema,{renameColumn:a,primaryDisplay:e.primaryDisplay,previousPrimaryDisplay:n?.primaryDisplay}));continue}h.schema.group||h.schema.field||(h.schema=e.schema)}}let c=await ca({eventType:n?"table:updated":"table:save",table:e,oldTable:n});c!=null&&c._rev&&(e._rev=c._rev);let l=s.getUpdatedRows();l&&l.length!==0&&await r.bulkDocs(l);let f=await r.put(e);e._rev=f.rev;let d=(0,jVe.cloneDeep)(e);return e=await s.after(e),(0,WVe.default)(d,e)||(f=await r.put(e),e._rev=f.rev),await bk(e,{oldTable:n,deletion:!1}),{table:e,oldTable:n}}o(Ek,"save");async function Ptr(e){let t=C.getWorkspaceDB(),r=e._id,n=(await t.allDocs(tn(r,null,{include_docs:!0}))).rows.map(i=>i.doc);return await t.bulkDocs(n.map(i=>({...i,_deleted:!0}))),await It.removeRows(n.length,{tableId:r}),await ca({eventType:"table:delete",table:e}),await t.remove(r,e._rev),await IVe(e,n),{table:e}}o(Ptr,"destroy");var YJ={};$(YJ,{isExternal:()=>cb,isInternal:()=>zJ,isTable:()=>Ntr});function cb(e){return e.table&&e.table.sourceType==="external"?!0:!!(e.tableId&&Pt(e.tableId))}o(cb,"isExternal");function zJ(e){return!cb(e)}o(zJ,"isInternal");function Ntr(e){return e._id&&vs(e._id)}o(Ntr,"isTable");var t7={};$(t7,{PermissionUpdateType:()=>GVe,getAllDBRoles:()=>HVe,getDependantResources:()=>ktr,getInheritablePermissions:()=>VVe,getResourcePerms:()=>ZJ,setPermissions:()=>e7,updatePermissionOnRole:()=>XJ});var JJ=[Ur.PermissionLevel.WRITE,Ur.PermissionLevel.READ,Ur.PermissionLevel.EXECUTE];function Ltr(e){switch(Lre(e)){case"view":return Ur.PermissionType.TABLE}switch(Nre(e)){case"ta":case"ro":case"datasource_plus":return Ur.PermissionType.TABLE;case"au":return Ur.PermissionType.AUTOMATION;case"wh":return Ur.PermissionType.WEBHOOK;case"query":case"datasource":return Ur.PermissionType.QUERY;default:return Ur.PermissionType.LEGACY_VIEW}}o(Ltr,"getPermissionType");function $Ve(e){let t=Ltr(e),r={};for(let[n,i]of Object.entries(_t.getBuiltinRoles())){if(!i.permissionId)continue;let s=Ur.getBuiltinPermissionByID(i.permissionId);if(!s)continue;let a=s.permissions.find(u=>u.type===t);if(a&&JJ.includes(a.level)){let u=a.level;r[u]=_t.lowerBuiltinRoleID(r[u],n),Ur.isPermissionLevelHigherThanRead(u)&&(r[Ur.PermissionLevel.READ]=_t.lowerBuiltinRoleID(r[Ur.PermissionLevel.READ],n))}}return r}o($Ve,"getBasePermissions");var GVe=(r=>(r.REMOVE="remove",r.ADD="add",r))(GVe||{});async function VVe(e){if(sn(e))return await ZJ(Kr(e))}o(VVe,"getInheritablePermissions");async function ZJ(e){let t=await _t.getAllRoles(),r={},n=await VVe(e);for(let s of JJ)for(let a of t)_t.checkForRoleResourceArray(a.permissions||{},e)[e]?.indexOf(s)>-1?r[s]={role:_t.getExternalRoleID(a._id,a.version),type:"EXPLICIT"}:!r[s]&&n&&n[s]&&(r[s]={role:n[s].role,type:"INHERITED"});let i=Object.entries($Ve(e)).reduce((s,[a,u])=>(s[a]={role:u,type:"BASE"},s),{});return Object.assign(i,r)}o(ZJ,"getResourcePerms");async function ktr(e){if(vs(e)){let t={},r=await P.tables.getTable(e),n=Object.values(r.views||{});for(let i of n){if(!qr(i))continue;let s=await ZJ(i.id);for(let[,a]of Object.entries(s))a.type==="INHERITED"&&(t.view??=new Set,t.view.add(i.id))}return Object.entries(t).reduce((i,[s,a])=>(i[s]=a.size,i),{})}}o(ktr,"getDependantResources");async function XJ({roleId:e,resourceId:t,level:r},n){let i=C.getWorkspaceDB(),s=n==="remove",a=_t.isBuiltin(e),u=_t.getDBRoleID(e),c=await HVe(i),l=[];if(a&&!c.some(d=>d._id===u)){let d=_t.getBuiltinRoles()[e];d._id=_t.getDBRoleID(d._id),c.push(d)}for(let d of c){let p=!1,h=d.permissions?d.permissions:{};if((!h[t]||!Array.isArray(h[t]))&&(h[t]=typeof h[t]=="string"?[h[t]]:[]),(d._id!==u||s)&&h[t].indexOf(r)!==-1&&(RWe(h[t],r),p=!0),!s&&d._id===u){let m=new Set(h[t]);h[t]=[...m.add(r)],p=!0}p&&(d.permissions=h,l.push(d))}return(await i.bulkDocs(l)).map(d=>{let p=l.find(m=>m._id===d.id)?.version;return{_id:_t.getExternalRoleID(d.id,p),rev:d.rev,error:d.error,reason:d.reason}})}o(XJ,"updatePermissionOnRole");async function e7(e,{writeRole:t,readRole:r}){await XJ({roleId:t,resourceId:e,level:"write"},"add"),await XJ({roleId:r,resourceId:e,level:"read"},"add")}o(e7,"setPermissions");async function HVe(e){return(await e.allDocs(lWe(null,{include_docs:!0}))).rows.map(r=>r.doc)}o(HVe,"getAllDBRoles");async function r7(e,t,r){let n;return cb({table:e})?n=await QJ(e):n=await KJ(e,t,r),await e7(n._id,{writeRole:_t.BUILTIN_ROLE_IDS.ADMIN,readRole:_t.BUILTIN_ROLE_IDS.ADMIN}),n}o(r7,"create");var i7={};$(i7,{external:()=>Jv,internal:()=>Xv,saveTable:()=>Mtr,update:()=>Utr});var QVe=require("lodash");async function Mtr(e){let t=C.getWorkspaceDB(),r;if(Pt(e._id)){let i=await P.datasources.get(e.sourceId);i.entities[e.name]=e,r=await t.put(i)}else r=await t.put(e);let n=(0,QVe.cloneDeep)(e);return n._rev=r.rev,n}o(Mtr,"saveTable");async function Utr(e,t){let r=e._id;if(cb({table:e})){let n=e.sourceId;await wk(n,e,{tableId:r,renaming:t})}else await Ek(e,{tableId:r,renaming:t})}o(Utr,"update");var KVe=require("lodash");async function zVe(e,t,r){if(r in e.schema)throw new Wn(`Column "${r}" already exists`);if(r==="")throw new Wn("Column name cannot be empty");if(Ff(r))throw new Wn("Column name cannot be a reserved column name");let n=e.schema[t];if(!n)throw new Wn(`Column "${t}" does not exist on table "${e.name}"`);if(n.type!=="link"||n.tableId!=="ta_users")throw new Wn("Only user relationship migration columns is currently supported");let i=n.relationshipType==="one-to-many"?"bb_reference_single":"bb_reference",s={name:r,type:i,subtype:"user"};s.type==="bb_reference"&&(s.constraints={type:"array"}),e.schema[s.name]=s,e=await P.tables.saveTable(e);let a=Ftr(e,n,s);try{return await a.doMigration()}catch(u){throw delete e.schema[s.name],await P.tables.saveTable(e),u}}o(zVe,"migrate");function Ftr(e,t,r){if(Pt(e._id))throw new Wn("External tables cannot be migrated");if(!(t.name in e.schema))throw new Wn(`Column "${t.name}" does not exist`);if(r.type!=="bb_reference_single"&&r.type!=="bb_reference")throw new Wn(`Column "${r.name}" is not a user column`);if(r.subtype!=="user")throw new Wn(`Column "${r.name}" is not a user column`);if(!DA(t))throw new Wn(`Column "${t.name}" is not a user relationship`);if(t.tableId!=="ta_users")throw new Wn(`Column "${t.name}" is not a user relationship`);if(t.relationshipType==="one-to-many"){if(r.type!=="bb_reference_single")throw new Wn(`Column "${t.name}" is a one-to-many column but "${r.name}" is not a single user column`);return new o7(e,t,r)}if(t.relationshipType==="many-to-many"||t.relationshipType==="many-to-one"){if(r.type!=="bb_reference")throw new Wn(`Column "${t.name}" is a ${t.relationshipType} column but "${r.name}" is not a multi user column`);return new s7(e,t,r)}throw new Wn("Unknown migration type")}o(Ftr,"getColumnMigrator");var Sk=class{constructor(t,r,n){this.table=t;this.oldColumn=r;this.newColumn=n}static{o(this,"UserColumnMigrator")}pickUserTableLinkSide(t){return t.doc1.tableId==="ta_users"?t.doc1:t.doc2}pickOtherTableLinkSide(t){return t.doc1.tableId==="ta_users"?t.doc2:t.doc1}async doMigration(){let t=(0,KVe.cloneDeep)(this.table),r=await P.rows.fetchRaw(this.table._id),n=r.reduce((u,c)=>(u[c._id]=c,u),{}),i=await P.links.fetchWithDocument(this.table._id);for(let u of i){let c=this.pickUserTableLinkSide(u),l=this.pickOtherTableLinkSide(u);if(l.tableId!==this.table._id||l.fieldName!==this.oldColumn.name||c.tableId!=="ta_users")continue;let f=n[l.rowId];f&&this.updateRow(f,c)}await C.getWorkspaceDB().bulkDocs(r),delete this.table.schema[this.oldColumn.name],this.table=await P.tables.saveTable(this.table),await ca({eventType:"table:updated",table:this.table,oldTable:t});let a=await P.tables.getTable(this.oldColumn.tableId);return{tablesUpdated:[this.table,a]}}},o7=class extends Sk{static{o(this,"SingleUserColumnMigrator")}updateRow(t,r){t[this.newColumn.name]=U.getGlobalIDFromUserMetadataID(r.rowId)}},s7=class extends Sk{static{o(this,"MultiUserColumnMigrator")}updateRow(t,r){t[this.newColumn.name]||(t[this.newColumn.name]=[]),t[this.newColumn.name].push(U.getGlobalIDFromUserMetadataID(r.rowId))}};var a7={};$(a7,{USER_COLUMN_PREFIX:()=>lb,addTable:()=>Htr,mapToUserColumn:()=>pu,removeTable:()=>Qtr,syncDefinition:()=>Vtr});var XVe=require("lodash");var Btr=require("lodash/fp");var SSn={_id:Gy,type:U.BUDIBASE_DATASOURCE_TYPE,name:"Sample Data",source:"BUDIBASE",config:{}};var Tk={"Created At":{name:"Created At",type:"datetime",subtype:"createdAt",icon:"ri-magic-line",autocolumn:!0,constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}}},"Updated At":{name:"Updated At",type:"datetime",subtype:"updatedAt",icon:"ri-magic-line",autocolumn:!0,constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}}}},qtr={_id:Kje,type:"table",views:{},sourceId:Gy,sourceType:"internal",primaryDisplay:"Item Name",name:"Inventory",schema:{"Item ID":{name:"Item ID",type:"number",subtype:"autoID",icon:"ri-magic-line",width:120,autocolumn:!0,constraints:{type:"number",presence:!1,numericality:{greaterThanOrEqualTo:"",lessThanOrEqualTo:""}}},"Item Name":{type:"string",constraints:{type:"string",length:{maximum:null},presence:{allowEmpty:!1}},name:"Item Name",width:160},"Item Tags":{type:"array",constraints:{type:"array",presence:{allowEmpty:!1},inclusion:["Electrical","Material","Vehicle","Office","Tools"]},name:"Item Tags",sortable:!1},Notes:{type:"longform",constraints:{type:"string",length:{},presence:!1},name:"Notes",useRichText:null,width:220},Status:{type:"options",constraints:{type:"string",presence:{allowEmpty:!1},inclusion:["Available","Repair","Broken"]},name:"Status",width:110,sortable:!1},SKU:{type:"barcodeqr",constraints:{type:"string",length:{},presence:!1},name:"SKU",width:130},"Purchase Date":{type:"datetime",constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}},name:"Purchase Date",ignoreTimezones:!0},"Purchase Price":{type:"number",constraints:{type:"number",presence:!1,numericality:{greaterThanOrEqualTo:null,lessThanOrEqualTo:""}},name:"Purchase Price",width:160},...Tk}},jtr={_id:x5,type:"table",views:{},name:"Employees",sourceId:Gy,sourceType:"internal",primaryDisplay:"First Name",schema:{"First Name":{name:"First Name",type:"string",constraints:{type:"string",length:{},presence:!1}},"Last Name":{name:"Last Name",type:"string",constraints:{type:"string",length:{},presence:!1}},Email:{name:"Email",type:"string",constraints:{type:"string",length:{},presence:!1}},Address:{name:"Address",type:"string",constraints:{type:"string",length:{},presence:!1}},City:{name:"City",type:"string",constraints:{type:"string",length:{},presence:!1}},Postcode:{name:"Postcode",type:"string",constraints:{type:"string",length:{},presence:!1}},Phone:{name:"Phone",type:"string",constraints:{type:"string",length:{},presence:!1}},"EMPLOYEE ID":{name:"EMPLOYEE ID",type:"number",subtype:"autoID",icon:"ri-magic-line",autocolumn:!0,constraints:{type:"number",presence:!1,numericality:{greaterThanOrEqualTo:"",lessThanOrEqualTo:""}}},"Employee Level":{type:"options",constraints:{type:"string",presence:!1,inclusion:["Manager","Junior","Senior","Apprentice","Contractor"]},name:"Employee Level",sortable:!1},"Badge Photo":{type:"attachment",constraints:{type:"array",presence:!1},name:"Badge Photo",sortable:!1},Jobs:{type:"link",constraints:{type:"array",presence:!1},fieldName:"Assigned",name:"Jobs",relationshipType:"many-to-many",tableId:C5},"Start Date":{type:"datetime",constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}},name:"Start Date",ignoreTimezones:!0},"End Date":{type:"datetime",constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}},name:"End Date",ignoreTimezones:!0},...Tk}},Wtr={_id:C5,type:"table",name:"Jobs",sourceId:Gy,sourceType:"internal",primaryDisplay:"Job ID",schema:{"Job ID":{name:"Job ID",type:"number",subtype:"autoID",icon:"ri-magic-line",autocolumn:!0,constraints:{type:"number",presence:!1,numericality:{greaterThanOrEqualTo:"",lessThanOrEqualTo:""}}},"Quote Date":{type:"datetime",constraints:{type:"string",length:{},presence:{allowEmpty:!1},datetime:{latest:"",earliest:""}},name:"Quote Date",ignoreTimezones:!0},"Quote Price":{type:"number",constraints:{type:"number",presence:{allowEmpty:!1},numericality:{greaterThanOrEqualTo:"",lessThanOrEqualTo:""}},name:"Quote Price"},"Works Start":{type:"datetime",constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}},name:"Works Start",ignoreTimezones:!0},Address:{type:"longform",constraints:{type:"string",length:{},presence:!1},name:"Address",useRichText:null},"Customer Name":{type:"string",constraints:{type:"string",length:{maximum:null},presence:!1},name:"Customer Name"},Notes:{type:"longform",constraints:{type:"string",length:{},presence:!1},name:"Notes",useRichText:null},"Customer Phone":{type:"string",constraints:{type:"string",length:{maximum:null},presence:!1},name:"Customer Phone"},"Customer Email":{type:"string",constraints:{type:"string",length:{maximum:null},presence:!1},name:"Customer Email"},Assigned:{name:"Assigned",type:"link",tableId:x5,fieldName:"Jobs",relationshipType:"many-to-many"},"Works End":{type:"datetime",constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}},name:"Works End",ignoreTimezones:!0},"Updated Price":{type:"number",constraints:{type:"number",presence:!1,numericality:{greaterThanOrEqualTo:"",lessThanOrEqualTo:""}},name:"Updated Price"},...Tk}},$tr={_id:zje,type:"table",views:{},name:"Expenses",sourceId:Gy,sourceType:"internal",primaryDisplay:"Expense ID",schema:{"Expense ID":{name:"Expense ID",type:"number",subtype:"autoID",icon:"ri-magic-line",autocolumn:!0,constraints:{type:"number",presence:!1,numericality:{greaterThanOrEqualTo:"",lessThanOrEqualTo:""}}},"Expense Tags":{type:"array",constraints:{type:"array",presence:{allowEmpty:!1},inclusion:["Fuel","Food","Materials","Repair","Equipment","Fees","Service","Office","Other"]},name:"Expense Tags",sortable:!1},Cost:{type:"number",constraints:{type:"number",presence:{allowEmpty:!1},numericality:{greaterThanOrEqualTo:"",lessThanOrEqualTo:""}},name:"Cost"},Notes:{type:"longform",constraints:{type:"string",length:{},presence:!1},name:"Notes",useRichText:null},"Payment Due":{type:"datetime",constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}},name:"Payment Due",ignoreTimezones:!0},"Date Paid":{type:"datetime",constraints:{type:"string",length:{},presence:!1,datetime:{latest:"",earliest:""}},name:"Date Paid",ignoreTimezones:!0},Attachment:{type:"attachment",constraints:{type:"array",presence:!1},name:"Attachment",sortable:!1},...Tk}},YVe=[qtr,jtr,Wtr,$tr];var JVe={boolean:"NUMERIC",datetime:"VARCHAR",formula:"VARCHAR",ai:"VARCHAR",longform:"VARCHAR",number:"REAL",string:"VARCHAR",auto:"REAL",options:"VARCHAR",json:"BLOB",internal:"BLOB",barcodeqr:"BLOB",attachment:"BLOB",attachment_single:"BLOB",signature_single:"BLOB",array:"BLOB",link:"BLOB",bigint:"VARCHAR",bb_reference:"VARCHAR",bb_reference_single:"VARCHAR"};function Gtr(e,t){let r=e._id,n=t.tableId;return{tableId:Rf(r,n),definition:{"doc1.rowId":"VARCHAR","doc1.tableId":"VARCHAR","doc1.fieldName":"VARCHAR","doc2.rowId":"VARCHAR","doc2.tableId":"VARCHAR","doc2.fieldName":"VARCHAR",tableId:"VARCHAR"}}}o(Gtr,"buildRelationshipDefinitions");var lb="data_";function pu(e){return`${lb}${fe.schema.encodeNonAscii(e)}`}o(pu,"mapToUserColumn");function ZVe(e){let t={},r={},n=[];for(let[a,u]of Object.entries(e.schema)){if(u.type==="link"){let{tableId:l,definition:f}=Gtr(e,u);t[l]={fields:f}}if(!JVe[u.type])throw new Error(`Unable to map type "${u.type}" to SQLite type`);let c=a.toLowerCase();n.includes(c)||(n.push(c),r[pu(a)]={field:a,type:JVe[u.type]})}let i={};Hr.forEach(a=>{i[a]="VARCHAR"});let s={...i,...r};return t[e._id]={fields:s},t}o(ZVe,"mapTable");async function eHe(){let e=await vh.getAllInternalTables();for(let r of YVe)e.find(n=>n._id===r._id)||e.push(r);let t=He.designDoc.base("tableId");for(let r of e)t.sql.tables={...t.sql.tables,...ZVe(r)};return t}o(eHe,"buildBaseDefinition");async function Vtr(){let e=C.getWorkspaceDB(),t;try{t=await e.get(Ln)}catch(n){if(n.status!==404)throw n}let r=await eHe();t&&(r._rev=t._rev),(!t||!(0,XVe.isEqual)(t.sql,r.sql))&&await e.put(r)}o(Vtr,"syncDefinition");async function Htr(e){let t=C.getWorkspaceDB(),r;try{r=await t.get(Ln)}catch{r=await eHe()}r.sql.tables={...r.sql.tables,...ZVe(e)},await t.put(r)}o(Htr,"addTable");async function Qtr(e){let t=C.getWorkspaceDB();try{let[r,n]=await Promise.all([vh.getAllInternalTables(),t.get(Ln)]),i=r.map(a=>a._id).filter(a=>!a.includes(e._id)),s=!1;for(let a of Object.keys(n.sql?.tables||{}))i.find(u=>a.includes(u))||(delete n.sql.tables[a],s=!0);s&&(await t.put(n),await t.sqlDiskCleanup())}catch(r){if(r?.status===404)return;throw r}}o(Qtr,"removeTable");async function tHe(e,t){let r=await Zv(),i={name:fe.duplicateName(e.name,r.map(a=>a.name)),type:e.type,sourceType:e.sourceType,sourceId:e.sourceId,schema:{...e.schema},primaryDisplay:e.primaryDisplay,views:{},indexes:e.indexes?{...e.indexes}:void 0},s=await r7(i,void 0,t);return await Le.table.created(s),s}o(tHe,"duplicate");var vh={populateExternalTableSchemas:Bv,...n7,...i7,...u7,...YJ,migrate:zVe,sqs:a7,duplicate:tHe};function Ktr(e){let t={};for(let[r,n]of Object.entries(e))if(r.includes("."))t[r]="Table names containing dots are not supported.";else{let s=Object.keys(n.schema).find(a=>a.includes("."));s&&(t[r]=`Column '${s}' is not supported as it contains a dot.`)}return t}o(Ktr,"checkForSchemaErrors");async function rHe(e,t){let r=await ztr(e,t);if(!t)return r;let n={tables:{},errors:{}};for(let i in r.tables)t.some(s=>s.toLowerCase()===i.toLowerCase())&&(n.tables[i]=r.tables[i]);for(let i in r.errors)t.some(s=>s.toLowerCase()===i.toLowerCase())&&(n.errors[i]=r.errors[i]);return{...n,errors:{...n.errors,...Ktr(n.tables)}}}o(rHe,"buildFilteredSchema");async function ztr(e,t){return await(await nHe(e)).buildSchema(e._id,e.entities,t)}o(ztr,"buildSchemaHelper");async function nHe(e){let t=await rb(e.source);return e._id&&(e=await sk(e)),new t(e.config)}o(nHe,"getConnector");async function Ytr(e){if(e._id){let t=await ak(e._id);e=RJ(e,t)}return await sk(e)}o(Ytr,"getAndMergeDatasource");async function Jtr(e,t){let r=C.getWorkspaceDB(),n=await ak(e),{tables:i,errors:s}=await rHe(n,t),a=n.entities||{},u=Object.keys(a).filter(l=>!Object.keys(i).includes(l));for(let l of u)await P.rowActions.deleteAll(a[l]._id);n.entities=i,uk(n);let c=await r.put(vh.populateExternalTableSchemas(n));return n._rev=c.rev,{datasource:n,errors:s}}o(Jtr,"buildSchemaFromSource");var du={...ck,...c7};async function Ah(e){return await Zi.tracer.trace("processTable",async t=>{if(!e)return e;if(t.addTags({tableId:e._id}),e={...e},e.views){t.addTags({numViews:Object.keys(e.views).length});for(let[r,n]of Object.entries(e.views))qr(n)&&(e.views[r]=Xi(n))}return e._id&&Pt(e._id)?(t.addTags({isExternal:!0}),e.schema.id&&!e.schema.id.name&&(e.schema.id.name="id"),{...e,type:"table",sourceType:"external"}):(t.addTags({isExternal:!1}),{...e,type:"table",primary:["_id"],sourceId:e.sourceId||Nn,sourceType:"internal",sql:!0})})}o(Ah,"processTable");async function eA(e){return await Zi.tracer.trace("processTables",async t=>(t.addTags({numTables:e.length}),await Promise.all(e.map(r=>Ah(r)))))}o(eA,"processTables");async function Xtr(e){return await Zi.tracer.trace("processEntities",async t=>{t.addTags({numTables:Object.keys(e).length});for(let r of Object.keys(e))e[r]=await Ah(e[r]);return e})}o(Xtr,"processEntities");async function Zv(e){return await Zi.tracer.trace("getAllInternalTables",async t=>{e||(e=C.getWorkspaceDB()),t.addTags({db:e.name});let r=await e.allDocs(Af(null,{include_docs:!0}));return t.addTags({numTables:r.rows.length}),await eA(r.rows.map(n=>n.doc))})}o(Zv,"getAllInternalTables");async function Ztr(e){return await Zi.tracer.trace("getAllInternalTableIds",async t=>{let r=e||C.getWorkspaceDB();t.addTags({db:r.name});let{rows:n}=await r.allDocs(Af(null,{include_docs:!1})),i=n.map(({id:s})=>s);return t.addTags({numTableIds:i.length}),i})}o(Ztr,"getAllInternalTableIds");async function err(){let e=await Zv(),t=[];return C.doInWorkspaceContext(C.getProdWorkspaceId(),async()=>{let r=C.getWorkspaceDB(),n=o(async i=>{let a=0;for(;;){let{rows:u}=await r.allDocs(tn(i,null,{include_docs:!1,limit:25,skip:a}));if(u.length===0)return!1;if(u.some(l=>!l.value?.deleted))return!0;if(u.length<25)return!1;a+=25}},"hasNonDeletedRows");for(let i of e){if(i._id===$t.USER_METADATA||!i._id)continue;await n(i._id)||t.push(i._id)}return t})}o(err,"listEmptyProductionTables");async function iHe(){return await Zi.tracer.trace("getAllExternalTables",async e=>{let t=await P.datasources.fetch({enriched:!0});e.addTags({numDatasources:t.length});let r=t.filter(i=>i._id!==Nn).map(i=>i.entities);e.addTags({numEntities:r.length});let n=[];for(let i of r)i&&(n=n.concat(Object.values(i)));return n=n.filter(i=>i._id&&Pt(i._id)),e.addTags({numTables:n.length}),await eA(n)})}o(iHe,"getAllExternalTables");async function oHe(e,t){return await Zi.tracer.trace("getExternalTable",async r=>{r.addTags({datasourceId:e,tableName:t});let n=await sHe(e);if(!n[t])throw new Error(`Unable to find table named "${t}"`);let i=await Ah(n[t]);return i.sourceId||(i.sourceId=e),i})}o(oHe,"getExternalTable");async function ub(e){return await Zi.tracer.trace("getTable",async t=>{let r=C.getWorkspaceDB();t.addTags({tableId:e,db:r.name});let n;if(e&&Pt(e)){let{datasourceId:i,tableName:s}=mr(e);t.addTags({isExternal:!0,datasourceId:i,tableName:s});let a=await du.get(i);n={...await oHe(i,s),sql:Cf(a)},t.addTags({isSQL:Cf(a)})}else n=await r.get(e);return await Ah(n)})}o(ub,"getTable");async function l7(e){return await Zi.tracer.trace("doesTableExist",async t=>{t.addTags({tableId:e});try{let r=await ub(e);return t.addTags({tableExists:!!r}),!!r}catch{return t.addTags({tableExists:!1}),!1}})}o(l7,"doesTableExist");async function trr(){return await Zi.tracer.trace("getAllTables",async e=>{let[t,r]=await Promise.all([Zv(),iHe()]);return e.addTags({numInternalTables:t.length,numExternalTables:r.length}),await eA([...t,...r])})}o(trr,"getAllTables");async function sHe(e){return await Zi.tracer.trace("getExternalTablesInDatasource",async t=>{let r=await du.get(e,{enriched:!0});if(!r||!r.entities)throw new Error("Datasource is not configured fully.");return t.addTags({datasourceId:e,numEntities:Object.keys(r.entities).length}),await Xtr(r.entities)})}o(sHe,"getExternalTablesInDatasource");async function rrr(e){return Zi.tracer.trace("getTables",async t=>{t.addTags({numTableIds:e.length});let r=e.filter(s=>Pt(s)),n=e.filter(s=>!Pt(s)),i=[];if(r.length){let s=await iHe();i=i.concat(s.filter(a=>r.indexOf(a._id)!==-1))}if(n.length){let a=await C.getWorkspaceDB().getMultiple(n,{allowMissing:!0});i=i.concat(a)}return t.addTags({numTables:i.length}),await eA(i)})}o(rrr,"getTables");async function nrr(e){return await Zi.tracer.trace("enrichViewSchemas",async t=>{t.addTags({tableId:e._id});let r=[];for(let n of Object.values(e.views??[]))P.views.isV2(n)?r.push(await P.views.enrichSchema(n,e.schema)):r.push(n);return{...e,views:r.reduce((n,i)=>(n[i.name]=i,n),{})}})}o(nrr,"enrichViewSchemas");var drr=require("@bull-board/api"),prr=require("@bull-board/api/bullAdapter"),hrr=require("@bull-board/koa");var Ak=B(require("dd-trace"));var irr=o(async()=>{let e=await hWe(),t=[];for(let n of e)if(!n.tableId&&!n.tableId){let i=new xv(n.doc1.tableId,n.doc1.fieldName,n.doc1.rowId,n.doc2.tableId,n.doc2.fieldName,n.doc2.rowId);i._id=n._id,i._rev=n._rev,t.push(i)}let r=C.getWorkspaceDB();t.length&&await r.bulkDocs(t),await P.tables.sqs.syncDefinition()},"migration"),aHe=irr;var orr=o(async()=>{let e=await P.screens.fetch(),t=await P.workspaces.metadata.get(),r=await P.workspaceApps.fetch(C.getWorkspaceDB()),[n]=r;n||(n=await P.workspaceApps.create({name:t.name,url:"/",navigation:t.navigation,isDefault:!0}));let i=C.getWorkspaceDB(),s=e.filter(u=>!u.workspaceAppId).map(u=>({...u,workspaceAppId:n._id}));for(let u of r)u.url||s.push({...u,url:u.urlPrefix||"/",urlPrefix:void 0});let a=await i.get("_design/database");a.views?.screen_routes_2&&a.views.screen_routes_2.version===void 0&&(delete a.views?.screen_routes_2,s.push(a)),await i.bulkDocs(s)},"migration"),uHe=orr;var srr=o(async()=>{let t=(await P.workspaceApps.fetch()).filter(r=>r.isDefault);if(t.length>1){let[r,...n]=t.sort((u,c)=>c.updatedAt.localeCompare(u.updatedAt)),i=C.getWorkspaceDB(),s=[],a=await P.screens.fetch();for(let u of n)s.push({...u,_deleted:!0}),s.push(...a.filter(c=>c.workspaceAppId===u._id).map(c=>({...c,workspaceAppId:r._id})));await i.bulkDocs(s)}},"migration"),cHe=srr;var f7=[{id:"20240604153647_initial_sqs",func:aHe},{id:"20250618162639_workspace_apps",func:uHe},{id:"20250729134531_workspace_cleanups",func:cHe}];var arr=Wt.fromDays(1).toSeconds();async function d7(e){return U.doWithDB(e,t=>t.get("_design/migrations"),{skip_setup:!0})}o(d7,"getFromDB");var vk=o(e=>`appmigrations_${L.VERSION}_${e}`,"getWorkspaceMigrationCacheKey");async function p7(e){let t=vk(e),r=await Ue.get(t);if(r)return r;try{r=(await d7(e)).version||""}catch(n){if(n.status!==404)throw n;r=""}return r&&await Ue.store(t,r,arr),r}o(p7,"getWorkspaceMigrationVerions");async function lHe({workspaceId:e,version:t,skipHistory:r}){let n=U.getDB(e),i;try{i=await d7(e)}catch(u){if(u.status!==404)throw u;i={_id:"_design/migrations",version:"",initialVersion:t,history:{}},await n.put(i),i=await d7(e)}let s={...i,version:t};r||(s.history[t]={runAt:new Date().toISOString()}),await n.put(s);let a=vk(e);await Ue.destroy(a)}o(lHe,"updateWorkspaceMigrationMetadata");async function h7(e,t){if(ne.isTest()&&ne.SKIP_MIGRATION_LOCKS_IN_TESTS)return console.log("Bypassing lock for in test environment"),t();console.log(`Acquiring app migration lock for "${e}"`);let r=U.getProdWorkspaceID(e),{result:n}=await jn.doWithLock({name:"app_migrations",type:"auto_extend",resource:r},async()=>(console.log(`Migration lock acquired for app "${r}"`),await t()));return n}o(h7,"doInMigrationLock");var HTn=new RegExp(["appPackage"].join("|"));async function fHe(e,t){let r=await p7(e),n=t.findIndex(i=>i.id===r);return t.slice(n+1)}o(fHe,"getPendingMigrationsForWorkspace");function crr(e){return Object.values(e).flatMap(t=>t).map(t=>t.id)}o(crr,"getAllPendingMigrationIds");function lrr(e,t){return e.filter(r=>t.includes(r.id))}o(lrr,"getUniquePendingMigrations");async function dHe({migrationId:e,migrationFunc:t,workspaceId:r}){await Ak.default.trace("runMigrationForApp",async n=>{n.addTags({appId:r,migrationId:e}),await C.doInWorkspaceMigrationContext(r,async()=>{console.log(`Running migration "${e}" for app "${r}"`),await t(),console.log(`Migration "${e}" ran for app "${r}"`)})})}o(dHe,"runMigrationForApp");async function frr(e){await Ak.default.trace("runMigrationForApp",async t=>{t.addTags({appId:e}),await C.doInWorkspaceMigrationContext(e,async()=>{await P.workspaces.syncWorkspace(e),console.log(`Workspace synchronized for dev "${e}"`)})})}o(frr,"syncDevApp");async function pHe(e,t){await C.doInWorkspaceMigrationContext(e,()=>lHe({workspaceId:e,version:t}))}o(pHe,"updateMigrationVersion");async function m7(e,t=f7){console.log(`Processing workspace migration for "${e}"`),await Ak.default.trace("runMigrationForApp",async r=>{r.addTags({appId:e});try{await C.doInWorkspaceContext(e,()=>h7(e,async()=>{let n=U.getDevWorkspaceID(e),i=U.getProdWorkspaceID(e),s=await P.workspaces.isWorkspacePublished(i),a=s?i:n;console.log(`Starting workspace migration for "${a}"`);let u={[n]:await fHe(n,t),[i]:s?await fHe(i,t):[]};function c(p,h){return u[h].some(m=>m.id===p)}o(c,"needsToRun");let l=crr(u),f=lrr(t,l);r.addTags({migrationsToRun:f.length}),console.log(`Workspace migrations to run for "${a}" - ${f.map(p=>p.id).join(",")}`);let d=0;for(let{id:p,func:h,disabled:m}of f){if(m){console.log(`Migration ${p} is disabled, stopping migration process`);return}let g=`(${++d}/${f.length})`;console.info(`Running migration ${p}... ${g}`,{migrationId:p,workspaceId:a});let y=c(p,a),b=s&&c(p,n);y&&await dHe({migrationId:p,migrationFunc:h,workspaceId:a}),b&&(await frr(n),await dHe({migrationId:p,migrationFunc:h,workspaceId:n})),y&&await pHe(a,p),b&&await pHe(n,p)}console.log(`Workspace migration for "${a}" processed`)}))}catch(n){throw Ne.logAlert("Failed to run workspace migration",n),n}})}o(m7,"processMigrations");var hHe=3;var avn=new Xr.BudibaseQueue(Xr.JobQueue.APP_MIGRATION,{jobOptions:{attempts:hHe,removeOnComplete:!0,removeOnFail:!0},maxStalledCount:hHe,removeStalledCb:async e=>{Ne.logAlert(`App migration failed, queue job ID: ${e.id} - reason: ${e.failedReason}`)}});var fb=new Xr.BudibaseQueue(Xr.JobQueue.AUTOMATION,{removeStalledCb:e=>g7(e),jobTags:e=>({"automation.id":e.automation._id,"automation.name":e.automation.name,"automation.appId":e.automation.appId,"automation.createdAt":e.automation.createdAt,"automation.trigger":e.automation.definition.trigger.stepId})});var Srr=B(require("dd-trace"));var gHe=(r=>(r.API="api",r.AUTOMATIONS="automations",r))(gHe||{});function mrr(e,t){let r;t?r=t.split(","):r=e;for(let n of r)if(!e.includes(n))throw new Error(`Feature: ${n} is not an allowed option`);return r}o(mrr,"processFeatureEnvVar");var grr=mrr(Object.values(gHe),ne.APP_FEATURES);function yHe(){return grr.includes("automations")}o(yHe,"automationsEnabled");var y7=B(require("worker-farm"));function bHe(e){let t=null;switch(e){case"query":t="./query";break;case"automation":t="./automation";break;default:throw"Unknown thread type"}return require.resolve(t)}o(bHe,"typeToFile");var pb=class e{static{o(this,"Thread")}static{this.workerRefs=[]}constructor(t,r={timeoutMs:null,count:1}){if(this.type=t,this.count=r.count?r.count:1,this.disableThreading=this.shouldDisableThreading(),this.disableThreading)console.log(`[${ne.FORKED_PROCESS_NAME}] skipping worker farm type=${t}`);else{console.log(`[${ne.FORKED_PROCESS_NAME}] initialising worker farm type=${t}`);let n={autoStart:!0,maxConcurrentWorkers:this.count,workerOptions:{env:{...process.env,FORKED_PROCESS:"1",FORKED_PROCESS_NAME:t},execArgv:process.execArgv.some(i=>i.startsWith("--enable-source-maps"))?["--enable-source-maps"]:void 0}};r.timeoutMs&&(this.timeoutMs=r.timeoutMs,n.maxCallTime=r.timeoutMs),this.workers=(0,y7.default)(n,bHe(t),["execute"]),e.workerRefs.push(this.workers)}}shouldDisableThreading(){return!!(ne.isTest()||ne.DISABLE_THREADING||this.count===0||ne.isInThread())}run(t){let r=this.timeoutMs;return new Promise((n,i)=>{function s(a){a.execute(t,(u,c)=>{u&&u.type==="TimeoutError"?i(new Error(`Thread timeout exceeded ${r}ms timeout.`)):u?i(u):n(c)})}o(s,"fire"),this.disableThreading?import(bHe(this.type)).then(a=>{s(a)}):s(this.workers)})}static stopThreads(){return new Promise(t=>{e.workerRefs.length===0&&t();let r=0;function n(){r++,r>=e.workerRefs.length&&t()}o(n,"complete");for(let i of e.workerRefs)y7.default.end(i,n);e.workerRefs=[]})}static async shutdown(){await e.stopThreads(),console.log("Threads shutdown")}};var yrr=require("mailparser"),brr=require("html-to-text");var _rr=require("imapflow");var b7=o(async e=>{let t=C.getWorkspaceDB(),r=CL("automationEmailState",`${e}:`),n=`${r}${cWe}`,i=await t.allDocs({startkey:r,endkey:n,include_docs:!1});if(!i.rows.length)return;let s=i.rows.map(a=>{let u=a.value?._rev;if(u)return{_id:a.id,_rev:u,_deleted:!0}}).filter(a=>!!a);s.length&&await t.bulkDocs(s)},"deleteAutomationMailboxState");var Trr=require("lodash");var vrr;yHe()&&(vrr=new pb("automation"));async function wHe(e){let t=await fb.getBullQueue().getRepeatableJobs();for(let r of t)r.id===e&&await fb.getBullQueue().removeRepeatableByKey(r.key);console.log(`jobId=${e} disabled`)}o(wHe,"disableCronById");var HAn=Ge.triggers.definitions,EHe={removeOnComplete:!0,removeOnFail:!0};async function Rrr(){return(await C.getWorkspaceDB().allDocs(Rc(null,{include_docs:!0}))).rows.map(r=>r.doc)}o(Rrr,"getAllAutomations");async function Orr(e,t){let r=e.row.tableId;if(e.appId==null)throw`No appId specified for ${t} - check event emitters.`;!r||!await l7(r)||await C.doInWorkspaceContext(e.appId,async()=>{let n=await Rrr();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&&D5(e.appId)&&!await V5(i._id))continue;if(await SHe(i,{row:e.row,oldRow:e.oldRow}))try{await fb.add({automation:i,event:e},EHe)}catch(a){Ne.logAlert("Failed to queue automation",a)}}})}o(Orr,"queueRelevantRowAutomations");async function _7(e,t){try{await Orr(e,t)}catch(r){Ne.logWarn("Unable to process row event",r)}}o(_7,"queueRowAutomations");_h.on("row:save",async function(e){!e||!e.row||!e.row.tableId||await _7(e,"row:save")});_h.on("row:update",async function(e){!e||!e.row||!e.row.tableId||await _7(e,"row:update")});_h.on("row:delete",async function(e){!e||!e.row||!e.row.tableId||await _7(e,"row:delete")});function Irr(e,t){return Et.runQuery([e],t).length>0}o(Irr,"rowPassesFilters");function Ok(e){return e!==null&&"steps"in e&&Array.isArray(e.steps)}o(Ok,"isAutomationResults");async function Dc(e,t,{getResponses:r,onProgress:n}={}){if(e.disabled)throw new Error("Automation is disabled");if(on.automations.isAppAction(e)&&!await V5(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]=gh(t.fields[l],c[l]);t.fields=a}else(on.automations.isRowAction(e)||on.automations.isWebhookAction(e))&&(t={...t,...t.fields,fields:{}});let i={automation:e,event:t};return await SHe(e,{row:i.event?.row??{},oldRow:i.event?.oldRow??{}})?r?(i.event={...i.event,appId:C.getWorkspaceId(),automation:e},w7({data:i},{onProgress:n})):fb.add(i,EHe):{outputs:{success:!1,status:"stopped"},message:"Automation did not run. Filter conditions in trigger were not met."}}o(Dc,"externalTrigger");async function SHe(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 hb(s,t.row);return Irr(a,i)}return!0}o(SHe,"checkTriggerFilters");var THe="Trigger this automation (APP triggers only). Returns all step outputs.",vHe="Fields map: key/value pairs. Values must be string, number, boolean, or array (no nested objects).",Crr=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"),xrr=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 Dc(i,{fields:r},{getResponses:!0});return Ok(a)?{success:a.status==="success",status:a.status,steps:a.steps}:{success:!1,error:a.message||"Automation did not trigger"}},"triggerAutomationById"),Drr=[{name:"list_automations",sourceType:"AUTOMATION",sourceLabel:"Budibase",description:"List all automations in the current app",tool:(0,Ck.tool)({description:"List all automations in the current app",inputSchema:Lo.z.object({}),execute:async()=>({automations:await P.automations.fetch()})})},{name:"get_automation",sourceType:"AUTOMATION",sourceLabel:"Budibase",description:"Get details about a specific automation by ID",tool:(0,Ck.tool)({description:"Get details about a specific automation by ID",inputSchema:Lo.z.object({automationId:Lo.z.string().describe("The ID of the automation to retrieve")}),execute:async e=>{let{automationId:t}=e;return{automation:await P.automations.get(t)}}})}],Prr=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=Crr(r),u=a?`${vHe} Available fields: ${a}.`:vHe,c=a?`Trigger "${n}" automation. ${THe} Fields: ${a}.`:`Trigger "${n}" automation. ${THe}`;return{name:s,readableName:`${n}.trigger`,sourceType:"AUTOMATION",sourceLabel:"Budibase",description:c,tool:(0,Ck.tool)({description:c,inputSchema:Lo.z.object({fields:Lo.z.record(Lo.z.string(),Lo.z.union([Lo.z.string(),Lo.z.number(),Lo.z.boolean(),Lo.z.array(Lo.z.unknown())])).nullish().describe(u)}),execute:async l=>{let{fields:f}=l;return xrr({automationId:r._id,fields:f})}})}});return[...Drr,...t]},"createAutomationTools"),AHe=Prr;var E7=require("ai"),tA=require("zod");var Nrr=[{name:"list_tables",sourceType:"INTERNAL_TABLE",sourceLabel:"Budibase",description:"List all tables in the current app",tool:(0,E7.tool)({description:"List all tables in the current app",inputSchema:tA.z.object({showSchema:tA.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 P.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,E7.tool)({description:"Get details about a specific table by ID",inputSchema:tA.z.object({tableId:tA.z.string().describe("The ID of the table to retrieve")}),execute:async e=>{let{tableId:t}=e;return{table:await P.tables.getTable(t)}}})}],RHe=Nrr;var IHe=require("ai"),Ve=require("zod");var OHe="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.",xk='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.',S7='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"}}.',Lrr=30,krr=o(e=>new Set(e==="external"?ro:Hr),"getProtectedColumns"),Mrr=o(e=>e.type==="formula"||e.type==="auto"||e.type==="ai"||e.autocolumn===!0,"isReadOnlyField"),CHe=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"),Urr=o(({name:e,schema:t})=>{let r=`${e} (${CHe(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"),Frr=o((e,t)=>{let r=krr(t);return Object.entries(e).filter(([n,i])=>!(r.has(n)||Mrr(i))).map(([n,i])=>({name:n,schema:i}))},"getWritableFields"),Brr=o(e=>{if(e.length===0)return"";let t=e.map(Urr),r=t.slice(0,Lrr),n=t.length-r.length;return n>0&&r.push(`... +${n} more (use get_table for full schema)`),r.join(", ")},"buildSchemaSummary"),qrr=o(e=>e?`${xk} Available fields: ${e}.`:xk,"buildDataFieldDescription"),jrr=o((e,t)=>{if(e.length===0)return Ve.z.record(Ve.z.string(),Ve.z.any()).describe(xk);let r={};for(let n of e){let i=CHe(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(qrr(t))},"buildRowDataSchema"),Wrr=o(e=>e?`${S7} Available fields: ${e}.`:S7,"buildSearchQueryDescription"),$rr=o(e=>Ve.z.object({query:Ve.z.union([Ve.z.record(Ve.z.string(),Ve.z.any()),Ve.z.string()]).nullish().describe(Wrr(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"),Grr={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 P.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 P.rows.find(e,t)})},create_row:{description:`Create a new row. Only include fields that match the table schema. ${OHe}`,inputSchema:Ve.z.object({data:Ve.z.record(Ve.z.string(),Ve.z.any()).describe(xk)}),execute:async(e,{data:t})=>{let{row:r}=await P.rows.save(e,t,void 0);return{row:r}}},update_row:{description:`Update an existing row. ${OHe}`,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 P.rows.find(e,t),...n,_id:t,_rev:r},{row:a}=await P.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(S7),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 P.rows.search(s)).rows}}}},Vrr=o(e=>e.split("_").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" "),"formatActionLabel"),xHe=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=Frr(n,r),f=Brr(l),d=jrr(l,f),p=$rr(f);return Object.entries(Grr).map(([h,m])=>{let g=`${Vrr(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,IHe.tool)({description:g,inputSchema:w,execute:async E=>m.execute(e,E)})}})},"createRowTools");var DHe=o((e=[],t={},r={},n=[])=>{let i=[...AHe(n),...RHe],s=e.filter(a=>a._id).flatMap(a=>{let u=a.sourceType==="external";return xHe({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 jk=require("ai");var a3e=require("ai"),F7=require("zod");var M7=require("lodash"),knr=require("mongodb");function PHe(){let e={replication:!0,find:!0};ne.isTest()&&!ne.COUCH_DB_URL&&(e.inMemory=!0,e.allDbs=!0),Xke({db:e})}o(PHe,"init");var UHe=require("serialize-error");var FHe=B(require("dd-trace"));var T7=B(require("isolated-vm")),kHe=B(require("bson")),Dk=B(require("url")),rA=B(require("crypto")),MHe=B(require("querystring"));var LHe=B(require("fs"));var Qrr={helpers:"./index-helpers.ivm.bundle.js",bson:"./bson.ivm.bundle.js",snippets:"./snippets.ivm.bundle.js",buffer:"./buffer.ivm.bundle.js",bson_polyfills:"./bson-polyfills.ivm.bundle.js"},NHe={};function gb(e){let t=NHe[e];return t||(t=LHe.default.readFileSync(require.resolve(Qrr[e]),"utf-8"),NHe[e]=t,t)}o(gb,"loadBundle");var v7=class e extends Error{constructor(){super(...arguments);this.code=e.code}static{o(this,"JsRequestTimeoutError")}static{this.code="JS_REQUEST_TIMEOUT_ERROR"}},yb=class{constructor({memoryLimit:t,invocationTimeout:r,isolateAccumulatedTimeout:n}={}){this.codeWrapper=t=>t;this.resultKey="results";this.isolate=new T7.default.Isolate({memoryLimit:t||ne.JS_RUNNER_MEMORY_LIMIT}),this.vm=this.isolate.createContextSync(),this.jail=this.vm.global,this.jail.setSync("global",this.jail.derefInto()),this.runResultKey=rA.default.randomUUID(),this.runErrorKey=rA.default.randomUUID(),this.addToContext({[this.resultKey]:{[this.runResultKey]:""}}),this.invocationTimeout=r||ne.JS_PER_INVOCATION_TIMEOUT_MS,this.isolateAccumulatedTimeout=n}static{o(this,"IsolatedVM")}withHelpers(){let t=this.registerCallbacks({resolve:Dk.default.resolve,parse:Dk.default.parse}),r=this.registerCallbacks({escape:MHe.default.escape}),n=this.registerCallbacks({randomUUID:rA.default.randomUUID});this.addToContext({helpersStripProtocol:u=>{let c=Dk.default.parse(u);return c.protocol="",c.format()}});let i=`require=function req(val) {
1007
1007
  switch (val) {
1008
1008
  case "url": return ${t};
1009
1009
  case "querystring": return ${r};