mage-ai 0.9.57__py3-none-any.whl → 0.9.59__py3-none-any.whl

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.

Potentially problematic release.


This version of mage-ai might be problematic. Click here for more details.

Files changed (696) hide show
  1. mage_ai/ai/constants.py +1 -0
  2. mage_ai/ai/generator.py +7 -0
  3. mage_ai/ai/llm_pipeline_wizard.py +13 -0
  4. mage_ai/ai/openai_client.py +9 -1
  5. mage_ai/api/logging.py +11 -7
  6. mage_ai/api/policies/BlockPolicy.py +1 -0
  7. mage_ai/api/policies/CacheItemPolicy.py +16 -3
  8. mage_ai/api/policies/CommandCenterItemPolicy.py +56 -0
  9. mage_ai/api/policies/CustomTemplatePolicy.py +0 -3
  10. mage_ai/api/policies/GitBranchPolicy.py +8 -1
  11. mage_ai/api/policies/GitFilePolicy.py +1 -0
  12. mage_ai/api/policies/PipelinePolicy.py +2 -0
  13. mage_ai/api/policies/PipelineSchedulePolicy.py +1 -0
  14. mage_ai/api/policies/VersionControlBranchPolicy.py +98 -0
  15. mage_ai/api/policies/VersionControlFilePolicy.py +96 -0
  16. mage_ai/api/policies/VersionControlProjectPolicy.py +92 -0
  17. mage_ai/api/policies/VersionControlRemotePolicy.py +94 -0
  18. mage_ai/api/presenters/CommandCenterItemPresenter.py +19 -0
  19. mage_ai/api/presenters/GitBranchPresenter.py +2 -0
  20. mage_ai/api/presenters/GitCustomBranchPresenter.py +1 -0
  21. mage_ai/api/presenters/PipelinePresenter.py +5 -5
  22. mage_ai/api/presenters/PipelineSchedulePresenter.py +4 -0
  23. mage_ai/api/presenters/VersionControlBranchPresenter.py +15 -0
  24. mage_ai/api/presenters/VersionControlFilePresenter.py +15 -0
  25. mage_ai/api/presenters/VersionControlProjectPresenter.py +14 -0
  26. mage_ai/api/presenters/VersionControlRemotePresenter.py +15 -0
  27. mage_ai/api/resources/BlockResource.py +110 -80
  28. mage_ai/api/resources/CacheItemResource.py +88 -0
  29. mage_ai/api/resources/CommandCenterItemResource.py +29 -0
  30. mage_ai/api/resources/FileResource.py +15 -1
  31. mage_ai/api/resources/FolderResource.py +2 -1
  32. mage_ai/api/resources/GitBranchResource.py +183 -108
  33. mage_ai/api/resources/GitCustomBranchResource.py +9 -2
  34. mage_ai/api/resources/GitFileResource.py +26 -13
  35. mage_ai/api/resources/KernelResource.py +9 -1
  36. mage_ai/api/resources/LogResource.py +1 -1
  37. mage_ai/api/resources/OauthResource.py +4 -5
  38. mage_ai/api/resources/PipelineResource.py +71 -38
  39. mage_ai/api/resources/PipelineRunResource.py +7 -2
  40. mage_ai/api/resources/ProjectResource.py +1 -2
  41. mage_ai/api/resources/PullRequestResource.py +12 -3
  42. mage_ai/api/resources/SearchResultResource.py +4 -4
  43. mage_ai/api/resources/VersionControlBranchResource.py +85 -0
  44. mage_ai/api/resources/VersionControlFileResource.py +65 -0
  45. mage_ai/api/resources/VersionControlProjectResource.py +46 -0
  46. mage_ai/api/resources/VersionControlRemoteResource.py +64 -0
  47. mage_ai/authentication/oauth/constants.py +13 -16
  48. mage_ai/authentication/operation_history/models.py +11 -32
  49. mage_ai/authentication/operation_history/utils.py +14 -14
  50. mage_ai/authentication/permissions/constants.py +5 -0
  51. mage_ai/authentication/providers/active_directory.py +2 -2
  52. mage_ai/authentication/providers/bitbucket.py +2 -2
  53. mage_ai/authentication/providers/constants.py +6 -12
  54. mage_ai/authentication/providers/ghe.py +2 -2
  55. mage_ai/authentication/providers/google.py +2 -2
  56. mage_ai/authentication/providers/okta.py +2 -2
  57. mage_ai/cache/base.py +11 -3
  58. mage_ai/cache/block.py +116 -32
  59. mage_ai/cache/block_action_object/__init__.py +52 -43
  60. mage_ai/cache/constants.py +1 -0
  61. mage_ai/cache/dbt/utils.py +31 -10
  62. mage_ai/cache/file.py +114 -0
  63. mage_ai/cache/models.py +2 -0
  64. mage_ai/cache/pipeline.py +34 -8
  65. mage_ai/cache/tag.py +51 -10
  66. mage_ai/cache/utils.py +44 -3
  67. mage_ai/cluster_manager/kubernetes/workload_manager.py +9 -1
  68. mage_ai/command_center/__init__.py +0 -0
  69. mage_ai/command_center/applications/__init__.py +0 -0
  70. mage_ai/command_center/applications/constants.py +96 -0
  71. mage_ai/command_center/applications/factory.py +54 -0
  72. mage_ai/command_center/blocks/__init__.py +0 -0
  73. mage_ai/command_center/blocks/factory.py +39 -0
  74. mage_ai/command_center/blocks/utils.py +127 -0
  75. mage_ai/command_center/constants.py +66 -0
  76. mage_ai/command_center/factory.py +161 -0
  77. mage_ai/command_center/files/__init__.py +0 -0
  78. mage_ai/command_center/files/constants.py +235 -0
  79. mage_ai/command_center/files/factory.py +86 -0
  80. mage_ai/command_center/models.py +442 -0
  81. mage_ai/command_center/pipeline_runs/__init__.py +0 -0
  82. mage_ai/command_center/pipeline_runs/utils.py +141 -0
  83. mage_ai/command_center/pipelines/__init__.py +0 -0
  84. mage_ai/command_center/pipelines/constants.py +118 -0
  85. mage_ai/command_center/pipelines/factory.py +132 -0
  86. mage_ai/command_center/pipelines/utils.py +120 -0
  87. mage_ai/command_center/service.py +45 -0
  88. mage_ai/command_center/settings.py +37 -0
  89. mage_ai/command_center/support/__init__.py +0 -0
  90. mage_ai/command_center/support/constants.py +46 -0
  91. mage_ai/command_center/triggers/__init__.py +0 -0
  92. mage_ai/command_center/triggers/factory.py +49 -0
  93. mage_ai/command_center/triggers/utils.py +463 -0
  94. mage_ai/command_center/utils.py +30 -0
  95. mage_ai/data_preparation/executors/azure_container_instance_executor.py +1 -1
  96. mage_ai/data_preparation/executors/block_executor.py +68 -19
  97. mage_ai/data_preparation/executors/ecs_block_executor.py +2 -2
  98. mage_ai/data_preparation/executors/executor_factory.py +2 -0
  99. mage_ai/data_preparation/executors/gcp_cloud_run_block_executor.py +1 -1
  100. mage_ai/data_preparation/executors/k8s_block_executor.py +2 -2
  101. mage_ai/data_preparation/executors/pyspark_block_executor.py +7 -1
  102. mage_ai/data_preparation/git/__init__.py +29 -11
  103. mage_ai/data_preparation/git/api.py +14 -13
  104. mage_ai/data_preparation/git/clients/base.py +4 -8
  105. mage_ai/data_preparation/git/clients/github.py +1 -0
  106. mage_ai/data_preparation/git/utils.py +5 -7
  107. mage_ai/data_preparation/models/block/__init__.py +556 -329
  108. mage_ai/data_preparation/models/block/content.py +111 -0
  109. mage_ai/data_preparation/models/block/data_integration/mixins.py +1 -0
  110. mage_ai/data_preparation/models/block/dbt/block.py +30 -20
  111. mage_ai/data_preparation/models/block/dbt/block_sql.py +93 -257
  112. mage_ai/data_preparation/models/block/dbt/block_yaml.py +81 -158
  113. mage_ai/data_preparation/models/block/dbt/constants.py +12 -0
  114. mage_ai/data_preparation/models/block/dbt/dbt_adapter.py +23 -10
  115. mage_ai/data_preparation/models/block/dbt/dbt_cli.py +124 -612
  116. mage_ai/data_preparation/models/block/dbt/profiles.py +19 -15
  117. mage_ai/data_preparation/models/block/dbt/project.py +3 -0
  118. mage_ai/data_preparation/models/block/dynamic/constants.py +0 -0
  119. mage_ai/data_preparation/models/block/dynamic/dynamic_child.py +507 -47
  120. mage_ai/data_preparation/models/block/dynamic/utils.py +432 -1
  121. mage_ai/data_preparation/models/block/platform/mixins.py +68 -44
  122. mage_ai/data_preparation/models/block/r/__init__.py +19 -9
  123. mage_ai/data_preparation/models/block/sql/__init__.py +33 -18
  124. mage_ai/data_preparation/models/block/sql/utils/shared.py +4 -1
  125. mage_ai/data_preparation/models/block/utils.py +176 -71
  126. mage_ai/data_preparation/models/constants.py +7 -0
  127. mage_ai/data_preparation/models/file.py +23 -4
  128. mage_ai/data_preparation/models/pipeline.py +20 -8
  129. mage_ai/data_preparation/models/project/__init__.py +12 -7
  130. mage_ai/data_preparation/models/project/constants.py +2 -0
  131. mage_ai/data_preparation/models/triggers/__init__.py +7 -0
  132. mage_ai/data_preparation/models/utils.py +20 -0
  133. mage_ai/data_preparation/models/variable.py +113 -15
  134. mage_ai/data_preparation/shared/utils.py +6 -3
  135. mage_ai/data_preparation/storage/base_storage.py +17 -0
  136. mage_ai/data_preparation/storage/gcs_storage.py +4 -0
  137. mage_ai/data_preparation/storage/local_storage.py +15 -0
  138. mage_ai/data_preparation/storage/s3_storage.py +4 -0
  139. mage_ai/data_preparation/templates/data_exporters/qdrant.py +0 -1
  140. mage_ai/data_preparation/templates/data_loaders/qdrant.py +2 -1
  141. mage_ai/data_preparation/variable_manager.py +1 -0
  142. mage_ai/io/base.py +4 -1
  143. mage_ai/io/bigquery.py +25 -16
  144. mage_ai/io/clickhouse.py +3 -0
  145. mage_ai/io/druid.py +3 -0
  146. mage_ai/io/mongodb.py +1 -1
  147. mage_ai/io/pinot.py +3 -0
  148. mage_ai/io/postgres.py +13 -0
  149. mage_ai/io/snowflake.py +4 -0
  150. mage_ai/io/spark.py +8 -3
  151. mage_ai/io/sql.py +6 -0
  152. mage_ai/orchestration/db/__init__.py +26 -19
  153. mage_ai/orchestration/db/cache.py +4 -3
  154. mage_ai/orchestration/db/models/schedules.py +72 -16
  155. mage_ai/orchestration/db/models/schedules_project_platform.py +2 -3
  156. mage_ai/orchestration/pipeline_scheduler_original.py +19 -11
  157. mage_ai/orchestration/pipeline_scheduler_project_platform.py +20 -11
  158. mage_ai/presenters/interactions/constants.py +1 -0
  159. mage_ai/presenters/interactions/models.py +4 -3
  160. mage_ai/presenters/pages/models/client_pages/pipeline_schedules.py +1 -1
  161. mage_ai/server/constants.py +1 -1
  162. mage_ai/server/frontend_dist/404.html +11 -11
  163. mage_ai/server/frontend_dist/_next/static/PPQxHOmWVJ0iQFzG2rc8m/_buildManifest.js +1 -0
  164. mage_ai/server/frontend_dist/_next/static/chunks/1235.c9ed47779baccc05.js +1 -0
  165. mage_ai/server/frontend_dist/_next/static/chunks/125-029194ff22eb33a5.js +1 -0
  166. mage_ai/server/frontend_dist/_next/static/chunks/1557-4f7485c2e2228f77.js +1 -0
  167. mage_ai/server/frontend_dist/_next/static/chunks/2474-8e702cea23ddd16d.js +1 -0
  168. mage_ai/server/frontend_dist/_next/static/chunks/2479-727fa69ee9be6fab.js +1 -0
  169. mage_ai/server/frontend_dist/_next/static/chunks/26-38bc9380422f3900.js +1 -0
  170. mage_ai/server/frontend_dist/_next/static/chunks/2717-3e7ea8543b3825b7.js +1 -0
  171. mage_ai/server/frontend_dist/_next/static/chunks/3366-420721116ea5a665.js +1 -0
  172. mage_ai/server/frontend_dist/_next/static/chunks/3449-a9c98239582cd6f0.js +1 -0
  173. mage_ai/server/frontend_dist/_next/static/chunks/3548-13563a1ff815f922.js +1 -0
  174. mage_ai/server/frontend_dist/_next/static/chunks/3943-9e0a8ba0db34b35f.js +1 -0
  175. mage_ai/server/frontend_dist/_next/static/chunks/4371-ef23f95888d6cd11.js +1 -0
  176. mage_ai/server/frontend_dist/_next/static/chunks/4632.a4171dbf46b31c7c.js +1 -0
  177. mage_ai/server/frontend_dist/_next/static/chunks/523-be11ad59861d00ca.js +1 -0
  178. mage_ai/server/frontend_dist/_next/static/chunks/5457-d582b00545b4cb5e.js +1 -0
  179. mage_ai/server/frontend_dist/_next/static/chunks/{5189.dca121eccea793be.js → 5729.0f2748e9e6dab951.js} +1 -1
  180. mage_ai/server/frontend_dist/_next/static/chunks/5831-2abc4063e887a03e.js +1 -0
  181. mage_ai/server/frontend_dist/_next/static/chunks/6085-692d2f784c0504f2.js +1 -0
  182. mage_ai/server/frontend_dist/_next/static/chunks/635-1e8857c2b6dde289.js +1 -0
  183. mage_ai/server/frontend_dist/_next/static/chunks/7022-0d52dd8868621fb0.js +1 -0
  184. mage_ai/server/frontend_dist/_next/static/chunks/7264-d05f4b7088533f6f.js +1 -0
  185. mage_ai/server/frontend_dist/_next/static/chunks/7361-b3d661ec743bfadf.js +1 -0
  186. mage_ai/server/frontend_dist/_next/static/chunks/737-cc6467310a130dd9.js +1 -0
  187. mage_ai/server/frontend_dist/_next/static/chunks/{4495-4f0340aa82e0c623.js → 7674-9ec4fe64b5bf64d5.js} +1 -1
  188. mage_ai/server/frontend_dist/_next/static/chunks/8038-85d715c8c8394827.js +1 -0
  189. mage_ai/server/frontend_dist/_next/static/chunks/8095-bdce03896ef9639a.js +1 -0
  190. mage_ai/server/frontend_dist/_next/static/chunks/8146-6bed4e7401e067e6.js +1 -0
  191. mage_ai/server/frontend_dist/_next/static/chunks/8192-0c0b91523a38c4ca.js +1 -0
  192. mage_ai/server/frontend_dist/_next/static/chunks/8432-f736d101fc6d9215.js +1 -0
  193. mage_ai/server/frontend_dist/_next/static/chunks/8513-d207733b485c8d03.js +1 -0
  194. mage_ai/server/frontend_dist/_next/static/chunks/9264-7cd9cd0ba86ec5e4.js +1 -0
  195. mage_ai/server/frontend_dist/_next/static/chunks/9265-d2a1aaec75ec69b8.js +1 -0
  196. mage_ai/server/frontend_dist/_next/static/chunks/9440-54add041c392517f.js +1 -0
  197. mage_ai/server/frontend_dist/_next/static/chunks/9624-59b2f803f9c88cd6.js +1 -0
  198. mage_ai/server/frontend_dist/_next/static/chunks/9832-67896490f6e8a014.js +1 -0
  199. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/bd1a647f.fe5d87096be24a62.js → frontend_dist/_next/static/chunks/bd1a647f.04f7913662092327.js} +1 -1
  200. mage_ai/server/frontend_dist/_next/static/chunks/pages/404-7cabe357906f44f2.js +1 -0
  201. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-a11bd2ebe11b3fd2.js +1 -0
  202. mage_ai/server/frontend_dist/_next/static/chunks/pages/block-layout-ffca51945cd154ef.js +1 -0
  203. mage_ai/server/frontend_dist/_next/static/chunks/pages/compute-3ba957769292db80.js +1 -0
  204. mage_ai/server/frontend_dist/_next/static/chunks/pages/files-45679fd18b3edd82.js +1 -0
  205. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-data-products/[...slug]-95735a218106aa99.js +1 -0
  206. mage_ai/server/frontend_dist/_next/static/chunks/pages/{global-data-products-927ebbdc29529765.js → global-data-products-81d6c7fd9a9cff38.js} +1 -1
  207. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-hooks/[...slug]-eb4421d51fb7368f.js +1 -0
  208. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-hooks-a8c712e20512fede.js +1 -0
  209. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/files-f1be1d4735ba6919.js +1 -0
  210. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/settings-febe676687966276.js +1 -0
  211. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/[user]-70efe222130490b5.js +1 -0
  212. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/new-0914c36b3c8fd59f.js +1 -0
  213. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users-4f12e989e7809ef9.js +1 -0
  214. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage-809d4c99b44991a1.js +1 -0
  215. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/oauth-bd8494f8875c5c97.js → frontend_dist/_next/static/chunks/pages/oauth-aa9079c8dbaea3a5.js} +1 -1
  216. mage_ai/server/frontend_dist/_next/static/chunks/pages/overview-4e30fb5b18383b71.js +1 -0
  217. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipeline-runs-5d31c3aace39182d.js +1 -0
  218. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-85a80ee66f60a65c.js +1 -0
  219. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-0bd74047e257e6d9.js +1 -0
  220. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-80619dc504d0103b.js +1 -0
  221. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-3cc8d74ff8525bfd.js +1 -0
  222. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-cdc379ff24ff8858.js +1 -0
  223. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-03396d6086003e16.js +1 -0
  224. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-d6d920758654f6d9.js +1 -0
  225. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors-27727bb87be506c3.js +1 -0
  226. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-16aab67743651a0b.js +1 -0
  227. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs-e3ca1bedb660b252.js +1 -0
  228. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-9d58701fe7213727.js +1 -0
  229. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-0041fd76ee15e49f.js +1 -0
  230. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-780be9a2da697915.js +1 -0
  231. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-db8bb970b1f2273f.js +1 -0
  232. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-a3422b0ab1dbacd7.js +1 -0
  233. mage_ai/server/frontend_dist/_next/static/chunks/pages/platform/global-hooks/[...slug]-987a1603f4201943.js +1 -0
  234. mage_ai/server/frontend_dist/_next/static/chunks/pages/platform/global-hooks-3dc8bf89cab2722b.js +1 -0
  235. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/account/profile-43d3f2a5071b9537.js +1 -0
  236. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/preferences-c97b1a39b22c112a.js +1 -0
  237. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/settings-49efb66da67554ca.js +1 -0
  238. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-aa5d871de1f3f7b0.js → [...slug]-5117d3555972484c.js} +1 -1
  239. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/permissions-ee1c19d4a192ae4d.js +1 -0
  240. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-4dc5724486ee3396.js +1 -0
  241. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-88d29d1774db67e4.js → [...slug]-fa095aac732368c3.js} +1 -1
  242. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{roles-d8ca763e405cd9d1.js → roles-db6d71f8692a33e7.js} +1 -1
  243. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/sync-data-99c6a263d2ab9553.js +1 -0
  244. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users/{[...slug]-250dfdf22bfe67e9.js → [...slug]-9d881ac0a3db9baa.js} +1 -1
  245. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users-bee414d57c4b55d7.js +1 -0
  246. mage_ai/server/frontend_dist/_next/static/chunks/pages/sign-in-e7030e1a7a9e88e1.js +1 -0
  247. mage_ai/server/frontend_dist/_next/static/chunks/pages/templates/[...slug]-312afc9a3f8d0a4f.js +1 -0
  248. mage_ai/server/frontend_dist/_next/static/chunks/pages/templates-e5300c340aa94c6b.js +1 -0
  249. mage_ai/server/frontend_dist/_next/static/chunks/pages/terminal-fa7ca0c86142d146.js +1 -0
  250. mage_ai/server/frontend_dist/_next/static/chunks/pages/test-bd51b3918b39329e.js +1 -0
  251. mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-5158a9d98d2459e8.js +1 -0
  252. mage_ai/server/frontend_dist/_next/static/chunks/pages/version-control-5ce099a7abb354ff.js +1 -0
  253. mage_ai/server/frontend_dist/_next/static/chunks/{webpack-17c3a8f588f14cfd.js → webpack-efa55343114c8128.js} +1 -1
  254. mage_ai/server/{frontend_dist_base_path_template/_next/static/css/d1e8e64d0b07af2f.css → frontend_dist/_next/static/css/b59541b123fd7191.css} +1 -1
  255. mage_ai/server/frontend_dist/block-layout.html +3 -3
  256. mage_ai/server/frontend_dist/compute.html +11 -11
  257. mage_ai/server/frontend_dist/files.html +11 -11
  258. mage_ai/server/frontend_dist/global-data-products/[...slug].html +11 -11
  259. mage_ai/server/frontend_dist/global-data-products.html +11 -11
  260. mage_ai/server/frontend_dist/global-hooks/[...slug].html +11 -11
  261. mage_ai/server/frontend_dist/global-hooks.html +11 -11
  262. mage_ai/server/frontend_dist/index.html +3 -3
  263. mage_ai/server/frontend_dist/manage/files.html +11 -11
  264. mage_ai/server/frontend_dist/manage/settings.html +11 -11
  265. mage_ai/server/frontend_dist/manage/users/[user].html +11 -11
  266. mage_ai/server/frontend_dist/manage/users/new.html +11 -11
  267. mage_ai/server/frontend_dist/manage/users.html +11 -11
  268. mage_ai/server/frontend_dist/manage.html +11 -11
  269. mage_ai/server/frontend_dist/oauth.html +8 -8
  270. mage_ai/server/frontend_dist/overview.html +11 -11
  271. mage_ai/server/frontend_dist/pipeline-runs.html +11 -11
  272. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills/[...slug].html +11 -11
  273. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills.html +11 -11
  274. mage_ai/server/frontend_dist/pipelines/[pipeline]/dashboard.html +11 -11
  275. mage_ai/server/frontend_dist/pipelines/[pipeline]/edit.html +3 -3
  276. mage_ai/server/frontend_dist/pipelines/[pipeline]/logs.html +11 -11
  277. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runs.html +11 -11
  278. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runtime.html +11 -11
  279. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors.html +11 -11
  280. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs/[run].html +11 -11
  281. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs.html +11 -11
  282. mage_ai/server/frontend_dist/pipelines/[pipeline]/settings.html +11 -11
  283. mage_ai/server/frontend_dist/pipelines/[pipeline]/syncs.html +11 -11
  284. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers/[...slug].html +11 -11
  285. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers.html +11 -11
  286. mage_ai/server/frontend_dist/pipelines/[pipeline].html +3 -3
  287. mage_ai/server/frontend_dist/pipelines.html +11 -11
  288. mage_ai/server/frontend_dist/platform/global-hooks/[...slug].html +11 -11
  289. mage_ai/server/frontend_dist/platform/global-hooks.html +11 -11
  290. mage_ai/server/frontend_dist/settings/account/profile.html +11 -11
  291. mage_ai/server/frontend_dist/settings/platform/preferences.html +11 -11
  292. mage_ai/server/frontend_dist/settings/platform/settings.html +11 -11
  293. mage_ai/server/frontend_dist/settings/workspace/permissions/[...slug].html +11 -11
  294. mage_ai/server/frontend_dist/settings/workspace/permissions.html +11 -11
  295. mage_ai/server/frontend_dist/settings/workspace/preferences.html +11 -11
  296. mage_ai/server/frontend_dist/settings/workspace/roles/[...slug].html +11 -11
  297. mage_ai/server/frontend_dist/settings/workspace/roles.html +11 -11
  298. mage_ai/server/frontend_dist/settings/workspace/sync-data.html +11 -11
  299. mage_ai/server/frontend_dist/settings/workspace/users/[...slug].html +11 -11
  300. mage_ai/server/frontend_dist/settings/workspace/users.html +11 -11
  301. mage_ai/server/frontend_dist/settings.html +3 -3
  302. mage_ai/server/frontend_dist/sign-in.html +40 -41
  303. mage_ai/server/frontend_dist/templates/[...slug].html +11 -11
  304. mage_ai/server/frontend_dist/templates.html +11 -11
  305. mage_ai/server/frontend_dist/terminal.html +11 -11
  306. mage_ai/server/frontend_dist/test.html +3 -3
  307. mage_ai/server/frontend_dist/triggers.html +11 -11
  308. mage_ai/server/frontend_dist/version-control.html +11 -11
  309. mage_ai/server/frontend_dist_base_path_template/404.html +11 -11
  310. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1235.c9ed47779baccc05.js +1 -0
  311. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/125-029194ff22eb33a5.js +1 -0
  312. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1557-4f7485c2e2228f77.js +1 -0
  313. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2474-8e702cea23ddd16d.js +1 -0
  314. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2479-727fa69ee9be6fab.js +1 -0
  315. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/26-38bc9380422f3900.js +1 -0
  316. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2717-3e7ea8543b3825b7.js +1 -0
  317. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3366-420721116ea5a665.js +1 -0
  318. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3449-a9c98239582cd6f0.js +1 -0
  319. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3548-13563a1ff815f922.js +1 -0
  320. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3943-9e0a8ba0db34b35f.js +1 -0
  321. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/4371-ef23f95888d6cd11.js +1 -0
  322. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/4632.a4171dbf46b31c7c.js +1 -0
  323. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/523-be11ad59861d00ca.js +1 -0
  324. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5457-d582b00545b4cb5e.js +1 -0
  325. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{5189.dca121eccea793be.js → 5729.0f2748e9e6dab951.js} +1 -1
  326. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5831-2abc4063e887a03e.js +1 -0
  327. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/6085-692d2f784c0504f2.js +1 -0
  328. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/635-1e8857c2b6dde289.js +1 -0
  329. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/7022-0d52dd8868621fb0.js +1 -0
  330. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/7264-d05f4b7088533f6f.js +1 -0
  331. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/7361-b3d661ec743bfadf.js +1 -0
  332. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/737-cc6467310a130dd9.js +1 -0
  333. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{4495-4f0340aa82e0c623.js → 7674-9ec4fe64b5bf64d5.js} +1 -1
  334. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8038-85d715c8c8394827.js +1 -0
  335. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8095-bdce03896ef9639a.js +1 -0
  336. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8146-6bed4e7401e067e6.js +1 -0
  337. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8192-0c0b91523a38c4ca.js +1 -0
  338. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8432-f736d101fc6d9215.js +1 -0
  339. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8513-d207733b485c8d03.js +1 -0
  340. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9264-7cd9cd0ba86ec5e4.js +1 -0
  341. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9265-d2a1aaec75ec69b8.js +1 -0
  342. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9440-54add041c392517f.js +1 -0
  343. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9624-59b2f803f9c88cd6.js +1 -0
  344. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9832-67896490f6e8a014.js +1 -0
  345. mage_ai/server/{frontend_dist/_next/static/chunks/bd1a647f.fe5d87096be24a62.js → frontend_dist_base_path_template/_next/static/chunks/bd1a647f.04f7913662092327.js} +1 -1
  346. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/404-7cabe357906f44f2.js +1 -0
  347. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-a11bd2ebe11b3fd2.js +1 -0
  348. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/block-layout-ffca51945cd154ef.js +1 -0
  349. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/compute-3ba957769292db80.js +1 -0
  350. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/files-45679fd18b3edd82.js +1 -0
  351. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-data-products/[...slug]-95735a218106aa99.js +1 -0
  352. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{global-data-products-927ebbdc29529765.js → global-data-products-81d6c7fd9a9cff38.js} +1 -1
  353. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks/[...slug]-eb4421d51fb7368f.js +1 -0
  354. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks-a8c712e20512fede.js +1 -0
  355. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/files-f1be1d4735ba6919.js +1 -0
  356. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/settings-febe676687966276.js +1 -0
  357. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/[user]-70efe222130490b5.js +1 -0
  358. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/new-0914c36b3c8fd59f.js +1 -0
  359. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users-4f12e989e7809ef9.js +1 -0
  360. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage-809d4c99b44991a1.js +1 -0
  361. mage_ai/server/{frontend_dist/_next/static/chunks/pages/oauth-bd8494f8875c5c97.js → frontend_dist_base_path_template/_next/static/chunks/pages/oauth-aa9079c8dbaea3a5.js} +1 -1
  362. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/overview-4e30fb5b18383b71.js +1 -0
  363. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipeline-runs-5d31c3aace39182d.js +1 -0
  364. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-85a80ee66f60a65c.js +1 -0
  365. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-0bd74047e257e6d9.js +1 -0
  366. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-80619dc504d0103b.js +1 -0
  367. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-3cc8d74ff8525bfd.js +1 -0
  368. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/logs-cdc379ff24ff8858.js +1 -0
  369. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-03396d6086003e16.js +1 -0
  370. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-d6d920758654f6d9.js +1 -0
  371. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors-27727bb87be506c3.js +1 -0
  372. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-16aab67743651a0b.js +1 -0
  373. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs-e3ca1bedb660b252.js +1 -0
  374. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-9d58701fe7213727.js +1 -0
  375. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/syncs-0041fd76ee15e49f.js +1 -0
  376. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-780be9a2da697915.js +1 -0
  377. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers-db8bb970b1f2273f.js +1 -0
  378. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-a3422b0ab1dbacd7.js +1 -0
  379. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/platform/global-hooks/[...slug]-987a1603f4201943.js +1 -0
  380. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/platform/global-hooks-3dc8bf89cab2722b.js +1 -0
  381. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/account/profile-43d3f2a5071b9537.js +1 -0
  382. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/preferences-c97b1a39b22c112a.js +1 -0
  383. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/settings-49efb66da67554ca.js +1 -0
  384. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-aa5d871de1f3f7b0.js → [...slug]-5117d3555972484c.js} +1 -1
  385. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/permissions-ee1c19d4a192ae4d.js +1 -0
  386. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-4dc5724486ee3396.js +1 -0
  387. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-88d29d1774db67e4.js → [...slug]-fa095aac732368c3.js} +1 -1
  388. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{roles-d8ca763e405cd9d1.js → roles-db6d71f8692a33e7.js} +1 -1
  389. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/sync-data-99c6a263d2ab9553.js +1 -0
  390. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users/{[...slug]-250dfdf22bfe67e9.js → [...slug]-9d881ac0a3db9baa.js} +1 -1
  391. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users-bee414d57c4b55d7.js +1 -0
  392. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/sign-in-e7030e1a7a9e88e1.js +1 -0
  393. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/templates/[...slug]-312afc9a3f8d0a4f.js +1 -0
  394. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/templates-e5300c340aa94c6b.js +1 -0
  395. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/terminal-fa7ca0c86142d146.js +1 -0
  396. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/test-bd51b3918b39329e.js +1 -0
  397. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/triggers-5158a9d98d2459e8.js +1 -0
  398. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/version-control-5ce099a7abb354ff.js +1 -0
  399. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{webpack-b55fe1e575d8ac9d.js → webpack-bd35e1c7bd7b5a9a.js} +1 -1
  400. mage_ai/server/{frontend_dist/_next/static/css/d1e8e64d0b07af2f.css → frontend_dist_base_path_template/_next/static/css/b59541b123fd7191.css} +1 -1
  401. mage_ai/server/frontend_dist_base_path_template/_next/static/do4WOsw7lNhouR0mtPTFi/_buildManifest.js +1 -0
  402. mage_ai/server/frontend_dist_base_path_template/block-layout.html +3 -3
  403. mage_ai/server/frontend_dist_base_path_template/compute.html +11 -11
  404. mage_ai/server/frontend_dist_base_path_template/files.html +11 -11
  405. mage_ai/server/frontend_dist_base_path_template/global-data-products/[...slug].html +11 -11
  406. mage_ai/server/frontend_dist_base_path_template/global-data-products.html +11 -11
  407. mage_ai/server/frontend_dist_base_path_template/global-hooks/[...slug].html +11 -11
  408. mage_ai/server/frontend_dist_base_path_template/global-hooks.html +11 -11
  409. mage_ai/server/frontend_dist_base_path_template/index.html +3 -3
  410. mage_ai/server/frontend_dist_base_path_template/manage/files.html +11 -11
  411. mage_ai/server/frontend_dist_base_path_template/manage/settings.html +11 -11
  412. mage_ai/server/frontend_dist_base_path_template/manage/users/[user].html +11 -11
  413. mage_ai/server/frontend_dist_base_path_template/manage/users/new.html +11 -11
  414. mage_ai/server/frontend_dist_base_path_template/manage/users.html +11 -11
  415. mage_ai/server/frontend_dist_base_path_template/manage.html +11 -11
  416. mage_ai/server/frontend_dist_base_path_template/oauth.html +8 -8
  417. mage_ai/server/frontend_dist_base_path_template/overview.html +11 -11
  418. mage_ai/server/frontend_dist_base_path_template/pipeline-runs.html +11 -11
  419. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills/[...slug].html +11 -11
  420. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills.html +11 -11
  421. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/dashboard.html +11 -11
  422. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/edit.html +3 -3
  423. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/logs.html +11 -11
  424. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runs.html +11 -11
  425. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runtime.html +11 -11
  426. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors.html +11 -11
  427. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs/[run].html +11 -11
  428. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs.html +11 -11
  429. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/settings.html +11 -11
  430. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/syncs.html +11 -11
  431. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers/[...slug].html +11 -11
  432. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers.html +11 -11
  433. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline].html +3 -3
  434. mage_ai/server/frontend_dist_base_path_template/pipelines.html +11 -11
  435. mage_ai/server/frontend_dist_base_path_template/platform/global-hooks/[...slug].html +11 -11
  436. mage_ai/server/frontend_dist_base_path_template/platform/global-hooks.html +11 -11
  437. mage_ai/server/frontend_dist_base_path_template/settings/account/profile.html +11 -11
  438. mage_ai/server/frontend_dist_base_path_template/settings/platform/preferences.html +11 -11
  439. mage_ai/server/frontend_dist_base_path_template/settings/platform/settings.html +11 -11
  440. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions/[...slug].html +11 -11
  441. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions.html +11 -11
  442. mage_ai/server/frontend_dist_base_path_template/settings/workspace/preferences.html +11 -11
  443. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles/[...slug].html +11 -11
  444. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles.html +11 -11
  445. mage_ai/server/frontend_dist_base_path_template/settings/workspace/sync-data.html +11 -11
  446. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users/[...slug].html +11 -11
  447. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users.html +11 -11
  448. mage_ai/server/frontend_dist_base_path_template/settings.html +3 -3
  449. mage_ai/server/frontend_dist_base_path_template/sign-in.html +40 -41
  450. mage_ai/server/frontend_dist_base_path_template/templates/[...slug].html +11 -11
  451. mage_ai/server/frontend_dist_base_path_template/templates.html +11 -11
  452. mage_ai/server/frontend_dist_base_path_template/terminal.html +11 -11
  453. mage_ai/server/frontend_dist_base_path_template/test.html +3 -3
  454. mage_ai/server/frontend_dist_base_path_template/triggers.html +11 -11
  455. mage_ai/server/frontend_dist_base_path_template/version-control.html +11 -11
  456. mage_ai/server/logger.py +8 -2
  457. mage_ai/server/server.py +18 -1
  458. mage_ai/services/aws/ecs/config.py +3 -3
  459. mage_ai/services/aws/ecs/ecs.py +2 -2
  460. mage_ai/services/search/block_action_objects.py +59 -5
  461. mage_ai/settings/models/configuration_option.py +3 -1
  462. mage_ai/settings/platform/__init__.py +64 -20
  463. mage_ai/settings/platform/utils.py +4 -1
  464. mage_ai/settings/repo.py +5 -4
  465. mage_ai/shared/custom_logger.py +213 -0
  466. mage_ai/shared/environments.py +4 -0
  467. mage_ai/shared/files.py +52 -1
  468. mage_ai/shared/models.py +2 -1
  469. mage_ai/shared/parsers.py +8 -1
  470. mage_ai/shared/path_fixer.py +62 -5
  471. mage_ai/shared/retry.py +4 -0
  472. mage_ai/shared/strings.py +4 -0
  473. mage_ai/tests/api/endpoints/test_blocks.py +101 -1
  474. mage_ai/tests/api/operations/base/test_base_with_user_permissions.py +4 -1
  475. mage_ai/tests/base_test.py +21 -2
  476. mage_ai/tests/cache/test_pipeline_cache.py +11 -8
  477. mage_ai/tests/data_preparation/executors/test_block_executor.py +55 -45
  478. mage_ai/tests/data_preparation/git/test_api.py +4 -4
  479. mage_ai/tests/data_preparation/models/block/dbt/test_block.py +75 -43
  480. mage_ai/tests/data_preparation/models/block/dbt/test_block_sql.py +329 -320
  481. mage_ai/tests/data_preparation/models/block/dbt/test_block_yaml.py +298 -268
  482. mage_ai/tests/data_preparation/models/block/dbt/test_dbt_adapter.py +14 -4
  483. mage_ai/tests/data_preparation/models/block/dbt/test_dbt_cli.py +14 -11
  484. mage_ai/tests/data_preparation/models/block/dbt/test_profiles.py +2 -2
  485. mage_ai/tests/data_preparation/models/block/dbt/test_project.py +2 -2
  486. mage_ai/tests/data_preparation/models/block/dbt/test_sources.py +2 -2
  487. mage_ai/tests/data_preparation/models/block/dynamic/test_dynamic_child_block_factory.py +477 -474
  488. mage_ai/tests/data_preparation/models/block/dynamic/test_dynamic_helpers.py +25 -24
  489. mage_ai/tests/data_preparation/models/block/platform/test_mixins.py +16 -25
  490. mage_ai/tests/data_preparation/models/block/test_utils.py +8 -8
  491. mage_ai/tests/data_preparation/models/test_block.py +6 -8
  492. mage_ai/tests/data_preparation/models/test_project.py +10 -5
  493. mage_ai/tests/data_preparation/models/test_variable.py +51 -4
  494. mage_ai/tests/orchestration/test_pipeline_scheduler_project_platform.py +1 -0
  495. mage_ai/version_control/__init__.py +0 -0
  496. mage_ai/version_control/models.py +288 -0
  497. {mage_ai-0.9.57.dist-info → mage_ai-0.9.59.dist-info}/METADATA +49 -47
  498. {mage_ai-0.9.57.dist-info → mage_ai-0.9.59.dist-info}/RECORD +504 -486
  499. mage_ai/server/frontend_dist/_next/static/A7VXVGKgLQCukXcjdysDz/_buildManifest.js +0 -1
  500. mage_ai/server/frontend_dist/_next/static/chunks/1124-09b283a2f26cc576.js +0 -1
  501. mage_ai/server/frontend_dist/_next/static/chunks/1154-2f262f7eb38ebaa1.js +0 -1
  502. mage_ai/server/frontend_dist/_next/static/chunks/1235.53172e14801844e5.js +0 -1
  503. mage_ai/server/frontend_dist/_next/static/chunks/1557-724bfc3eabd095f7.js +0 -1
  504. mage_ai/server/frontend_dist/_next/static/chunks/161-33f26e485ddef393.js +0 -1
  505. mage_ai/server/frontend_dist/_next/static/chunks/1751-5adf859690505d7b.js +0 -1
  506. mage_ai/server/frontend_dist/_next/static/chunks/1821-953efd0da290d25f.js +0 -1
  507. mage_ai/server/frontend_dist/_next/static/chunks/2474-352ae192b826d896.js +0 -1
  508. mage_ai/server/frontend_dist/_next/static/chunks/2646-78905b899b68f4eb.js +0 -1
  509. mage_ai/server/frontend_dist/_next/static/chunks/2717-477f64b5e272d5a3.js +0 -1
  510. mage_ai/server/frontend_dist/_next/static/chunks/2852872c-15b31a7081e6a868.js +0 -1
  511. mage_ai/server/frontend_dist/_next/static/chunks/2920.86a65e5f26ff1795.js +0 -1
  512. mage_ai/server/frontend_dist/_next/static/chunks/3004-9fff558eeede3a83.js +0 -1
  513. mage_ai/server/frontend_dist/_next/static/chunks/341-ef0f7b98b7f69802.js +0 -1
  514. mage_ai/server/frontend_dist/_next/static/chunks/3419-b8bd26f5946bec5a.js +0 -1
  515. mage_ai/server/frontend_dist/_next/static/chunks/3437-ce26fc28e114b44e.js +0 -1
  516. mage_ai/server/frontend_dist/_next/static/chunks/3540-9bb48b08f439d0a0.js +0 -1
  517. mage_ai/server/frontend_dist/_next/static/chunks/3745-61b1c63bb56bb670.js +0 -1
  518. mage_ai/server/frontend_dist/_next/static/chunks/3859-ba594d21a1260cd2.js +0 -1
  519. mage_ai/server/frontend_dist/_next/static/chunks/3943-a49377acc514e77f.js +0 -1
  520. mage_ai/server/frontend_dist/_next/static/chunks/5283-8d1dacb2eeb9e652.js +0 -1
  521. mage_ai/server/frontend_dist/_next/static/chunks/5457-b373ebdf4d05d8e2.js +0 -1
  522. mage_ai/server/frontend_dist/_next/static/chunks/5499-261cfa2410506eb4.js +0 -1
  523. mage_ai/server/frontend_dist/_next/static/chunks/5533-3455832bc3f8429b.js +0 -1
  524. mage_ai/server/frontend_dist/_next/static/chunks/5729-9d8204ab91da631d.js +0 -1
  525. mage_ai/server/frontend_dist/_next/static/chunks/5810-addfa3491ae6b01c.js +0 -1
  526. mage_ai/server/frontend_dist/_next/static/chunks/5820-28adeabb5cda2b96.js +0 -1
  527. mage_ai/server/frontend_dist/_next/static/chunks/5896-7b8e36634d7d94eb.js +0 -1
  528. mage_ai/server/frontend_dist/_next/static/chunks/6043-728790621ca9014c.js +0 -1
  529. mage_ai/server/frontend_dist/_next/static/chunks/6285-648f9a732e100b2f.js +0 -1
  530. mage_ai/server/frontend_dist/_next/static/chunks/6563-5b3b97c9088baf69.js +0 -1
  531. mage_ai/server/frontend_dist/_next/static/chunks/6639-74eefed142e14ea6.js +0 -1
  532. mage_ai/server/frontend_dist/_next/static/chunks/6965-c613d1834c8ed92d.js +0 -1
  533. mage_ai/server/frontend_dist/_next/static/chunks/7022-1c1c93b6222d48f9.js +0 -1
  534. mage_ai/server/frontend_dist/_next/static/chunks/7361-559f4d2eca379217.js +0 -1
  535. mage_ai/server/frontend_dist/_next/static/chunks/7858-26a5a5d04fa3c703.js +0 -1
  536. mage_ai/server/frontend_dist/_next/static/chunks/8146-7fc9ef7d0202e6ab.js +0 -1
  537. mage_ai/server/frontend_dist/_next/static/chunks/8264-68db2a8334ad48f1.js +0 -1
  538. mage_ai/server/frontend_dist/_next/static/chunks/8432-0ace6fb7bdbc6864.js +0 -1
  539. mage_ai/server/frontend_dist/_next/static/chunks/844-1e171f361e63b36d.js +0 -1
  540. mage_ai/server/frontend_dist/_next/static/chunks/8731-82571147875a2d58.js +0 -1
  541. mage_ai/server/frontend_dist/_next/static/chunks/874-d9e1b3c9c00ebac9.js +0 -1
  542. mage_ai/server/frontend_dist/_next/static/chunks/8998-e46ae0a83be32d42.js +0 -1
  543. mage_ai/server/frontend_dist/_next/static/chunks/9264-5df6e4c7b1e85c02.js +0 -1
  544. mage_ai/server/frontend_dist/_next/static/chunks/9302-913007e2f801ad65.js +0 -1
  545. mage_ai/server/frontend_dist/_next/static/chunks/9440-c51bf1e8f271cb25.js +0 -1
  546. mage_ai/server/frontend_dist/_next/static/chunks/9624-89a4b20eb3b3c754.js +0 -1
  547. mage_ai/server/frontend_dist/_next/static/chunks/976-0a8c2c4d7acd957b.js +0 -1
  548. mage_ai/server/frontend_dist/_next/static/chunks/pages/404-5ddd12931e0e3e41.js +0 -1
  549. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-4c0239ca6203e827.js +0 -1
  550. mage_ai/server/frontend_dist/_next/static/chunks/pages/block-layout-d40babdbf465a7e1.js +0 -1
  551. mage_ai/server/frontend_dist/_next/static/chunks/pages/compute-822e66aa2e90cf4c.js +0 -1
  552. mage_ai/server/frontend_dist/_next/static/chunks/pages/files-373217c5de51aeef.js +0 -1
  553. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-data-products/[...slug]-0325e76a2f3e08c1.js +0 -1
  554. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-hooks/[...slug]-a172f5a447bd8925.js +0 -1
  555. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-hooks-97bec2ac883e0c26.js +0 -1
  556. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/files-02d001d99eeaae3f.js +0 -1
  557. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/settings-2e577bfd4f0db2b7.js +0 -1
  558. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/[user]-1827574a4ba95a72.js +0 -1
  559. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/new-a913c361bcc0d1a9.js +0 -1
  560. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users-4e6fdcbbfc931d67.js +0 -1
  561. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage-1c327edcf05df9c9.js +0 -1
  562. mage_ai/server/frontend_dist/_next/static/chunks/pages/overview-5a98e6a531410afb.js +0 -1
  563. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipeline-runs-1442183d13edec2e.js +0 -1
  564. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-38b2241cdd10320c.js +0 -1
  565. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-1c646dbef65d6a69.js +0 -1
  566. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-35cb916a18ac4e1f.js +0 -1
  567. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-cd1918632dfef29d.js +0 -1
  568. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-67b0572c84db0940.js +0 -1
  569. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-40201b626ea3a664.js +0 -1
  570. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-d1f23308effebe03.js +0 -1
  571. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors-9a116d88f00916ff.js +0 -1
  572. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-2d5abcd019d4bea1.js +0 -1
  573. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs-5363a7ae9afe8983.js +0 -1
  574. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-931a1b3112866a72.js +0 -1
  575. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-5ec5367cb877db38.js +0 -1
  576. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-8366661f8e2b2959.js +0 -1
  577. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-378f8dada7d0c1dd.js +0 -1
  578. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-627be24ef4963cfb.js +0 -1
  579. mage_ai/server/frontend_dist/_next/static/chunks/pages/platform/global-hooks/[...slug]-814bbd11e10c26dc.js +0 -1
  580. mage_ai/server/frontend_dist/_next/static/chunks/pages/platform/global-hooks-021ec25e05862f8f.js +0 -1
  581. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/account/profile-2b0aa123043519b8.js +0 -1
  582. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/preferences-05186e17c94347c1.js +0 -1
  583. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/settings-efe8bf1bf3177a7e.js +0 -1
  584. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/permissions-ce45aad47049d993.js +0 -1
  585. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-1bc694b056ff0bcb.js +0 -1
  586. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/sync-data-42bd909eb8951040.js +0 -1
  587. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users-97c4ce119f7238b5.js +0 -1
  588. mage_ai/server/frontend_dist/_next/static/chunks/pages/sign-in-1af3ba18ff646dd4.js +0 -1
  589. mage_ai/server/frontend_dist/_next/static/chunks/pages/templates/[...slug]-ff9d49355393daea.js +0 -1
  590. mage_ai/server/frontend_dist/_next/static/chunks/pages/templates-299a2c8f2dd89cf3.js +0 -1
  591. mage_ai/server/frontend_dist/_next/static/chunks/pages/terminal-fb3f398009a02879.js +0 -1
  592. mage_ai/server/frontend_dist/_next/static/chunks/pages/test-59a08e06f4ef6c3a.js +0 -1
  593. mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-551b85802515e313.js +0 -1
  594. mage_ai/server/frontend_dist/_next/static/chunks/pages/version-control-1362aeda4a31dd41.js +0 -1
  595. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1124-09b283a2f26cc576.js +0 -1
  596. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1154-2f262f7eb38ebaa1.js +0 -1
  597. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1235.53172e14801844e5.js +0 -1
  598. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1557-724bfc3eabd095f7.js +0 -1
  599. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/161-33f26e485ddef393.js +0 -1
  600. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1751-5adf859690505d7b.js +0 -1
  601. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1821-953efd0da290d25f.js +0 -1
  602. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2474-352ae192b826d896.js +0 -1
  603. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2646-78905b899b68f4eb.js +0 -1
  604. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2717-477f64b5e272d5a3.js +0 -1
  605. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2852872c-15b31a7081e6a868.js +0 -1
  606. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2920.86a65e5f26ff1795.js +0 -1
  607. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3004-9fff558eeede3a83.js +0 -1
  608. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/341-ef0f7b98b7f69802.js +0 -1
  609. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3419-b8bd26f5946bec5a.js +0 -1
  610. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3437-ce26fc28e114b44e.js +0 -1
  611. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3540-9bb48b08f439d0a0.js +0 -1
  612. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3745-61b1c63bb56bb670.js +0 -1
  613. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3859-ba594d21a1260cd2.js +0 -1
  614. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3943-a49377acc514e77f.js +0 -1
  615. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5283-8d1dacb2eeb9e652.js +0 -1
  616. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5457-b373ebdf4d05d8e2.js +0 -1
  617. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5499-261cfa2410506eb4.js +0 -1
  618. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5533-3455832bc3f8429b.js +0 -1
  619. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5729-9d8204ab91da631d.js +0 -1
  620. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5810-addfa3491ae6b01c.js +0 -1
  621. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5820-28adeabb5cda2b96.js +0 -1
  622. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5896-7b8e36634d7d94eb.js +0 -1
  623. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/6043-728790621ca9014c.js +0 -1
  624. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/6285-648f9a732e100b2f.js +0 -1
  625. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/6563-5b3b97c9088baf69.js +0 -1
  626. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/6639-74eefed142e14ea6.js +0 -1
  627. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/6965-c613d1834c8ed92d.js +0 -1
  628. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/7022-1c1c93b6222d48f9.js +0 -1
  629. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/7361-559f4d2eca379217.js +0 -1
  630. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/7858-26a5a5d04fa3c703.js +0 -1
  631. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8146-7fc9ef7d0202e6ab.js +0 -1
  632. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8264-68db2a8334ad48f1.js +0 -1
  633. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8432-0ace6fb7bdbc6864.js +0 -1
  634. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/844-1e171f361e63b36d.js +0 -1
  635. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8731-82571147875a2d58.js +0 -1
  636. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/874-d9e1b3c9c00ebac9.js +0 -1
  637. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8998-e46ae0a83be32d42.js +0 -1
  638. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9264-5df6e4c7b1e85c02.js +0 -1
  639. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9302-913007e2f801ad65.js +0 -1
  640. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9440-c51bf1e8f271cb25.js +0 -1
  641. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9624-89a4b20eb3b3c754.js +0 -1
  642. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/976-0a8c2c4d7acd957b.js +0 -1
  643. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/404-5ddd12931e0e3e41.js +0 -1
  644. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-4c0239ca6203e827.js +0 -1
  645. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/block-layout-d40babdbf465a7e1.js +0 -1
  646. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/compute-822e66aa2e90cf4c.js +0 -1
  647. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/files-373217c5de51aeef.js +0 -1
  648. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-data-products/[...slug]-0325e76a2f3e08c1.js +0 -1
  649. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks/[...slug]-a172f5a447bd8925.js +0 -1
  650. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks-97bec2ac883e0c26.js +0 -1
  651. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/files-02d001d99eeaae3f.js +0 -1
  652. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/settings-2e577bfd4f0db2b7.js +0 -1
  653. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/[user]-1827574a4ba95a72.js +0 -1
  654. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/new-a913c361bcc0d1a9.js +0 -1
  655. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users-4e6fdcbbfc931d67.js +0 -1
  656. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage-1c327edcf05df9c9.js +0 -1
  657. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/overview-5a98e6a531410afb.js +0 -1
  658. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipeline-runs-1442183d13edec2e.js +0 -1
  659. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-38b2241cdd10320c.js +0 -1
  660. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-1c646dbef65d6a69.js +0 -1
  661. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-35cb916a18ac4e1f.js +0 -1
  662. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-cd1918632dfef29d.js +0 -1
  663. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/logs-67b0572c84db0940.js +0 -1
  664. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-40201b626ea3a664.js +0 -1
  665. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-d1f23308effebe03.js +0 -1
  666. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors-9a116d88f00916ff.js +0 -1
  667. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-2d5abcd019d4bea1.js +0 -1
  668. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs-5363a7ae9afe8983.js +0 -1
  669. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-931a1b3112866a72.js +0 -1
  670. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/syncs-5ec5367cb877db38.js +0 -1
  671. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-8366661f8e2b2959.js +0 -1
  672. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers-378f8dada7d0c1dd.js +0 -1
  673. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-627be24ef4963cfb.js +0 -1
  674. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/platform/global-hooks/[...slug]-814bbd11e10c26dc.js +0 -1
  675. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/platform/global-hooks-021ec25e05862f8f.js +0 -1
  676. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/account/profile-2b0aa123043519b8.js +0 -1
  677. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/preferences-05186e17c94347c1.js +0 -1
  678. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/settings-efe8bf1bf3177a7e.js +0 -1
  679. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/permissions-ce45aad47049d993.js +0 -1
  680. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-1bc694b056ff0bcb.js +0 -1
  681. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/sync-data-42bd909eb8951040.js +0 -1
  682. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users-97c4ce119f7238b5.js +0 -1
  683. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/sign-in-1af3ba18ff646dd4.js +0 -1
  684. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/templates/[...slug]-ff9d49355393daea.js +0 -1
  685. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/templates-299a2c8f2dd89cf3.js +0 -1
  686. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/terminal-fb3f398009a02879.js +0 -1
  687. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/test-59a08e06f4ef6c3a.js +0 -1
  688. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/triggers-551b85802515e313.js +0 -1
  689. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/version-control-1362aeda4a31dd41.js +0 -1
  690. mage_ai/server/frontend_dist_base_path_template/_next/static/wSRrM15xnvA8lOWcaque7/_buildManifest.js +0 -1
  691. /mage_ai/server/frontend_dist/_next/static/{A7VXVGKgLQCukXcjdysDz → PPQxHOmWVJ0iQFzG2rc8m}/_ssgManifest.js +0 -0
  692. /mage_ai/server/frontend_dist_base_path_template/_next/static/{wSRrM15xnvA8lOWcaque7 → do4WOsw7lNhouR0mtPTFi}/_ssgManifest.js +0 -0
  693. {mage_ai-0.9.57.dist-info → mage_ai-0.9.59.dist-info}/LICENSE +0 -0
  694. {mage_ai-0.9.57.dist-info → mage_ai-0.9.59.dist-info}/WHEEL +0 -0
  695. {mage_ai-0.9.57.dist-info → mage_ai-0.9.59.dist-info}/entry_points.txt +0 -0
  696. {mage_ai-0.9.57.dist-info → mage_ai-0.9.59.dist-info}/top_level.txt +0 -0
mage_ai/io/base.py CHANGED
@@ -2,7 +2,7 @@ import os
2
2
  import re
3
3
  from abc import ABC, abstractmethod
4
4
  from enum import Enum
5
- from typing import IO, Any, Callable, Union
5
+ from typing import IO, Any, Callable, Dict, Union
6
6
 
7
7
  import pandas as pd
8
8
  from pandas import DataFrame
@@ -296,6 +296,9 @@ class BaseSQLDatabase(BaseIO):
296
296
  col_new = f'_{col_new}'
297
297
  return col_new
298
298
 
299
+ def execute_query_raw(self, query: str, configuration: Dict = None, **kwargs) -> None:
300
+ pass
301
+
299
302
 
300
303
  class BaseSQLConnection(BaseSQLDatabase):
301
304
  """
mage_ai/io/bigquery.py CHANGED
@@ -7,6 +7,7 @@ from pandas import DataFrame
7
7
  from mage_ai.io.base import QUERY_ROW_LIMIT, BaseSQLDatabase, ExportWritePolicy
8
8
  from mage_ai.io.config import BaseConfigLoader, ConfigKey
9
9
  from mage_ai.io.export_utils import infer_dtypes
10
+ from mage_ai.shared.custom_logger import DX_PRINTER
10
11
  from mage_ai.shared.utils import (
11
12
  convert_pandas_dtype_to_python_type,
12
13
  convert_python_type_to_bigquery_type,
@@ -232,7 +233,7 @@ FROM `{database}.{schema}.__TABLES_SUMMARY__`
232
233
  WHERE table_id = '{table_name}'
233
234
  """).to_dataframe()
234
235
 
235
- full_table_name = f'{database}.{schema}.{table_name}'
236
+ full_table_name = f'`{database}.{schema}.{table_name}`'
236
237
 
237
238
  table_doesnt_exist = df_existing.empty
238
239
 
@@ -281,24 +282,25 @@ WHERE table_id = '{table_name}'
281
282
 
282
283
  column_types = self.get_column_types(schema, table_name)
283
284
 
284
- for col in df.columns:
285
- col_type = column_types.get(col)
286
- if not col_type:
287
- continue
285
+ if df is not None:
286
+ for col in df.columns:
287
+ col_type = column_types.get(col)
288
+ if not col_type:
289
+ continue
288
290
 
289
- null_rows = df[col].isnull()
290
- if col_type.startswith('ARRAY<STRUCT'):
291
- df.loc[null_rows, col] = df.loc[null_rows, col].apply(lambda x: [{}])
292
- elif col_type.startswith('ARRAY'):
293
- df.loc[null_rows, col] = df.loc[null_rows, col].apply(lambda x: [])
294
- elif col_type.startswith('STRUCT'):
295
- df.loc[null_rows, col] = df.loc[null_rows, col].apply(lambda x: {})
291
+ null_rows = df[col].isnull()
292
+ if col_type.startswith('ARRAY<STRUCT'):
293
+ df.loc[null_rows, col] = df.loc[null_rows, col].apply(lambda x: [{}])
294
+ elif col_type.startswith('ARRAY'):
295
+ df.loc[null_rows, col] = df.loc[null_rows, col].apply(lambda x: [])
296
+ elif col_type.startswith('STRUCT'):
297
+ df.loc[null_rows, col] = df.loc[null_rows, col].apply(lambda x: {})
296
298
 
297
- # Clean column names
298
- if type(df) is DataFrame:
299
- df.columns = df.columns.str.replace(' ', '_')
299
+ # Clean column names
300
+ if type(df) is DataFrame:
301
+ df.columns = df.columns.str.replace(' ', '_')
300
302
 
301
- self.client.load_table_from_dataframe(df, table_id, job_config=config).result()
303
+ self.client.load_table_from_dataframe(df, table_id, job_config=config).result()
302
304
 
303
305
  if verbose:
304
306
  with self.printer.print_msg(f'Exporting data to table \'{table_id}\''):
@@ -318,6 +320,13 @@ WHERE table_id = '{table_name}'
318
320
  query_string = self._clean_query(query_string)
319
321
  self.client.query(query_string, **kwargs)
320
322
 
323
+ def execute_query_raw(self, query: str, configuration: Dict = None, **kwargs) -> None:
324
+ DX_PRINTER.print(
325
+ f'BigQuery.execute_query_raw\n{query}',
326
+ )
327
+ job = self.client.query(query)
328
+ return job.result()
329
+
321
330
  def execute_queries(
322
331
  self,
323
332
  queries: List[str],
mage_ai/io/clickhouse.py CHANGED
@@ -88,6 +88,9 @@ class ClickHouse(BaseSQLDatabase):
88
88
 
89
89
  return result
90
90
 
91
+ def execute_query_raw(self, query: str, **kwargs) -> None:
92
+ return self.client.command(query)
93
+
91
94
  def execute_queries(
92
95
  self,
93
96
  queries: List[str],
mage_ai/io/druid.py CHANGED
@@ -101,6 +101,9 @@ class Druid(BaseSQL):
101
101
  def execute(self, query_string: str, **query_vars) -> None:
102
102
  super().execute(query_string, **query_vars)
103
103
 
104
+ def execute_query_raw(self, query: str, **kwargs) -> None:
105
+ self.execute(query)
106
+
104
107
  def execute_queries(self,
105
108
  queries: List[str],
106
109
  query_variables: List[Dict] = None,
mage_ai/io/mongodb.py CHANGED
@@ -80,7 +80,7 @@ class MongoDB(BaseIO):
80
80
  data (Union[DataFrame, List[Dict]): Data frame or List of Dictionary to export.
81
81
  collection (str): MongoDB collection name.
82
82
  """
83
- if not data:
83
+ if data is None:
84
84
  return
85
85
  collection = collection or self.collection
86
86
  if collection is None:
mage_ai/io/pinot.py CHANGED
@@ -74,6 +74,9 @@ class Pinot(BaseSQL):
74
74
  def execute(self, query_string: str, **query_vars) -> None:
75
75
  super().execute(query_string, **query_vars)
76
76
 
77
+ def execute_query_raw(self, query: str, **kwargs) -> None:
78
+ self.execute(query)
79
+
77
80
  def execute_queries(self,
78
81
  queries: List[str],
79
82
  query_variables: List[Dict] = None,
mage_ai/io/postgres.py CHANGED
@@ -364,3 +364,16 @@ COPY {full_table_name} ({insert_columns}) FROM STDIN (
364
364
  , FORCE_NULL({insert_columns})
365
365
  );
366
366
  """, buffer)
367
+
368
+ def execute(self, query_string: str, **query_vars) -> None:
369
+ """
370
+ Sends query to the connected database.
371
+
372
+ Args:
373
+ query_string (str): SQL query string to apply on the connected database.
374
+ query_vars: Variable values to fill in when using format strings in query.
375
+ """
376
+ with self.printer.print_msg(f'Executing query \'{query_string}\''):
377
+ query_string = self._clean_query(query_string)
378
+ with self.conn.cursor() as cur:
379
+ cur.execute(query_string, query_vars)
mage_ai/io/snowflake.py CHANGED
@@ -75,6 +75,10 @@ class Snowflake(BaseSQLConnection):
75
75
  with self.conn.cursor() as cur:
76
76
  return cur.execute(query_string, timeout=self.timeout, **kwargs).fetchall()
77
77
 
78
+ def execute_query_raw(self, query: str, **kwargs) -> None:
79
+ with self.conn.cursor() as cur:
80
+ return cur.execute(query, timeout=self.timeout).fetchall()
81
+
78
82
  def execute_queries(
79
83
  self,
80
84
  queries: List[str],
mage_ai/io/spark.py CHANGED
@@ -1,8 +1,10 @@
1
- from mage_ai.io.base import BaseSQLDatabase, ExportWritePolicy, QUERY_ROW_LIMIT
2
- from mage_ai.io.config import BaseConfigLoader, ConfigKey
1
+ from typing import Dict, List, Union
2
+
3
3
  from pandas import DataFrame
4
4
  from pyspark.sql import SparkSession
5
- from typing import Dict, List, Union
5
+
6
+ from mage_ai.io.base import QUERY_ROW_LIMIT, BaseSQLDatabase, ExportWritePolicy
7
+ from mage_ai.io.config import BaseConfigLoader, ConfigKey
6
8
 
7
9
 
8
10
  class Spark(BaseSQLDatabase):
@@ -63,6 +65,9 @@ class Spark(BaseSQLDatabase):
63
65
  query_string = self._clean_query(query_string)
64
66
  self.client.sql(query_string, **kwargs)
65
67
 
68
+ def execute_query_raw(self, query: str, **kwargs) -> None:
69
+ self.client.sql(query)
70
+
66
71
  def execute_query(
67
72
  self,
68
73
  query: str,
mage_ai/io/sql.py CHANGED
@@ -123,6 +123,12 @@ class BaseSQL(BaseSQLConnection):
123
123
  with self.conn.cursor() as cur:
124
124
  cur.execute(query_string, **query_vars)
125
125
 
126
+ def execute_query_raw(self, query: str, **kwargs) -> None:
127
+ with self.conn.cursor() as cursor:
128
+ result = cursor.execute(query)
129
+ self.conn.commit()
130
+ return result
131
+
126
132
  def execute_queries(
127
133
  self,
128
134
  queries: List[str],
@@ -106,9 +106,7 @@ def get_postgresql_schema(url):
106
106
  except ValueError:
107
107
  return None
108
108
  if parse_result.scheme == 'postgresql+psycopg2':
109
- q = parse_qs(
110
- parse_result.query.replace('%%', '%')
111
- )
109
+ q = parse_qs(parse_result.query.replace('%%', '%'))
112
110
  options = q.get('options')
113
111
  if options and len(options) >= 1:
114
112
  params = options[0].replace('-c ', '').split(' ')
@@ -118,21 +116,29 @@ def get_postgresql_schema(url):
118
116
 
119
117
  db_connection = DBConnection()
120
118
 
121
- if db_connection_url.startswith('postgresql'):
122
- db_schema = get_postgresql_schema(db_connection_url)
123
- if db_schema:
124
- db_connection.start_session()
125
- db_connection.session.execute(f'CREATE SCHEMA IF NOT EXISTS {db_schema};')
126
- # Get the current database name from the query fetchall() result, e.g., [('test_database',)]
127
- db_current = db_connection.session.execute('SELECT current_database()').fetchall()[0][0]
128
- username, _ = get_user_info_from_db_connection_url(db_connection_url)
129
- if username:
130
- db_connection.session.execute(
131
- f'ALTER ROLE {username} IN DATABASE {db_current} SET search_path TO {db_schema}')
132
- db_connection.session.commit()
133
- db_connection.close_session()
134
- print(f'Set the default PostgreSQL schema for role {username} ',
135
- f'in database {db_current} to {db_schema}')
119
+
120
+ def set_db_schema():
121
+ if db_connection_url.startswith('postgresql'):
122
+ db_schema = get_postgresql_schema(db_connection_url)
123
+ if db_schema:
124
+ db_connection.start_session()
125
+ db_connection.session.execute(f'CREATE SCHEMA IF NOT EXISTS {db_schema};')
126
+ # Get the current database name from the query fetchall() result
127
+ # e.g., [('test_database',)]
128
+ db_current = db_connection.session.execute(
129
+ 'SELECT current_database()'
130
+ ).fetchall()[0][0]
131
+ username, _ = get_user_info_from_db_connection_url(db_connection_url)
132
+ if username:
133
+ db_connection.session.execute(
134
+ f'ALTER ROLE {username} IN DATABASE {db_current} SET search_path TO {db_schema}'
135
+ )
136
+ db_connection.session.commit()
137
+ db_connection.close_session()
138
+ print(
139
+ f'Set the default PostgreSQL schema for role {username} ',
140
+ f'in database {db_current} to {db_schema}',
141
+ )
136
142
 
137
143
 
138
144
  def safe_db_query(func):
@@ -150,10 +156,11 @@ def safe_db_query(func):
150
156
  if retry_count >= DB_RETRY_COUNT:
151
157
  raise e
152
158
  retry_count += 1
159
+
153
160
  return func_with_rollback
154
161
 
155
162
 
156
163
  logging.basicConfig()
157
164
 
158
- if is_dev():
165
+ if is_dev() and not os.getenv('DISABLE_DATABASE_TERMINAL_OUTPUT'):
159
166
  logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
@@ -1,3 +1,4 @@
1
+ import os
1
2
  from typing import Dict
2
3
 
3
4
  import simplejson
@@ -29,13 +30,13 @@ class CachingQuery(Query):
29
30
  )
30
31
  self.cache_key = str(hash(f'{cache_key_1}:{cache_key_2}'))
31
32
 
32
- if debug:
33
+ if debug and not os.getenv('DISABLE_DATABASE_TERMINAL_OUTPUT'):
33
34
  keys_count = len((self.session.cache() or {}).keys())
34
35
  print(f'[INFO] Number of keys in session cache: {keys_count}')
35
36
 
36
37
  results = self.session.get_results_from_cache(self.cache_key)
37
38
  if self.cache_key and results:
38
- if debug:
39
+ if debug and not os.getenv('DISABLE_DATABASE_TERMINAL_OUTPUT'):
39
40
  print(f'[INFO] Cache HIT for cache key: {self.cache_key}')
40
41
 
41
42
  return results
@@ -43,7 +44,7 @@ class CachingQuery(Query):
43
44
  results = super().all(*args, **kwargs)
44
45
 
45
46
  if self.cache and self.cache_key:
46
- if debug:
47
+ if debug and not os.getenv('DISABLE_DATABASE_TERMINAL_OUTPUT'):
47
48
  print(f'[INFO] Cache MISS for cache key: {self.cache_key}')
48
49
  self.session.cache_results(self.cache_key, results)
49
50
 
@@ -31,11 +31,13 @@ from sqlalchemy.sql.functions import coalesce
31
31
 
32
32
  from mage_ai.data_preparation.logging.logger_manager_factory import LoggerManagerFactory
33
33
  from mage_ai.data_preparation.models.block.dynamic.utils import (
34
+ DynamicBlockFlag,
34
35
  all_upstreams_completed,
35
36
  dynamically_created_child_block_runs,
36
- )
37
- from mage_ai.data_preparation.models.block.utils import (
37
+ has_dynamic_block_upstream_parent,
38
+ is_dynamic_block,
38
39
  is_dynamic_block_child,
40
+ is_replicated_block,
39
41
  should_reduce_output,
40
42
  )
41
43
  from mage_ai.data_preparation.models.constants import (
@@ -67,6 +69,7 @@ from mage_ai.settings.platform import project_platform_activated
67
69
  from mage_ai.settings.repo import get_repo_path
68
70
  from mage_ai.shared.array import find
69
71
  from mage_ai.shared.constants import ENV_PROD
72
+ from mage_ai.shared.custom_logger import DX_PRINTER
70
73
  from mage_ai.shared.dates import compare
71
74
  from mage_ai.shared.hash import ignore_keys, index_by, merge_dict
72
75
  from mage_ai.shared.utils import clean_name
@@ -922,11 +925,15 @@ class PipelineRun(PipelineRunProjectPlatformMixin, BaseModel):
922
925
  # If this is the original dynamic child block, don’t run until all it’s
923
926
  # upstream dynamic child blocks have their upstreams completed.
924
927
  if block and block.uuid == block_run.block_uuid and is_dynamic_block_child(block):
928
+ DX_PRINTER.debug(f'dynamic child original: {block_run.block_uuid}', block=block)
925
929
  upstream_dynamic_child_blocks = \
926
930
  [up_block for up_block in block.upstream_blocks if is_dynamic_block_child(
927
931
  up_block,
928
932
  )]
929
933
 
934
+ for up_block in upstream_dynamic_child_blocks:
935
+ DX_PRINTER.debug(f'\tupstream dynamic child: {up_block.uuid}', block=block)
936
+
930
937
  if upstream_dynamic_child_blocks:
931
938
  if not all(
932
939
  [all_upstreams_completed(
@@ -935,6 +942,12 @@ class PipelineRun(PipelineRunProjectPlatformMixin, BaseModel):
935
942
  ) for up_block in upstream_dynamic_child_blocks],
936
943
  ):
937
944
  continue
945
+ DX_PRINTER.warning(
946
+ f'\tupstream completed for: {block_run.block_uuid}',
947
+ block=block,
948
+ completed=completed_block_uuids,
949
+ all=[b.block_uuid for b in block_runs_all],
950
+ )
938
951
 
939
952
  if dynamic_upstream_block_uuids is not None and dynamic_block_index is not None:
940
953
  uuids_to_check = []
@@ -1160,7 +1173,36 @@ class PipelineRun(PipelineRunProjectPlatformMixin, BaseModel):
1160
1173
  db_connection.session.commit()
1161
1174
 
1162
1175
  @classmethod
1163
- def create(self, create_block_runs: bool = True, **kwargs) -> 'PipelineRun':
1176
+ def create(
1177
+ self,
1178
+ create_block_runs: bool = True,
1179
+ prevent_duplicates: bool = False,
1180
+ **kwargs,
1181
+ ) -> 'PipelineRun':
1182
+ """
1183
+ Create a new PipelineRun instance.
1184
+
1185
+ Args:
1186
+ create_block_runs (bool, optional): Whether to create associated block runs.
1187
+ Default is True.
1188
+ prevent_duplicates (bool, optional): If True, checks for existing PipelineRun with the
1189
+ same execution date, pipeline schedule ID, and pipeline UUID, and returns None
1190
+ if found. Default is False.
1191
+ **kwargs: Additional keyword arguments to be passed to the super().create() method.
1192
+
1193
+ Returns:
1194
+ PipelineRun or None: The created PipelineRun instance if successful, None if
1195
+ prevent_duplicates is True and a matching PipelineRun already exists.
1196
+ """
1197
+ if prevent_duplicates:
1198
+ existing_pipeline_run = PipelineRun.query.filter(
1199
+ PipelineRun.execution_date == kwargs.get('execution_date'),
1200
+ PipelineRun.pipeline_schedule_id == kwargs.get('pipeline_schedule_id'),
1201
+ PipelineRun.pipeline_uuid == kwargs.get('pipeline_uuid'),
1202
+ ).first()
1203
+ if existing_pipeline_run is not None:
1204
+ return None
1205
+
1164
1206
  pipeline_run = super().create(**kwargs)
1165
1207
  pipeline_uuid = kwargs.get('pipeline_uuid')
1166
1208
  if pipeline_uuid is not None and create_block_runs:
@@ -1249,6 +1291,30 @@ class PipelineRun(PipelineRunProjectPlatformMixin, BaseModel):
1249
1291
  )),
1250
1292
  ))
1251
1293
 
1294
+ flags = []
1295
+
1296
+ if has_dynamic_block_upstream_parent(block):
1297
+ flags.extend([
1298
+ DynamicBlockFlag.DYNAMIC_CHILD,
1299
+ DynamicBlockFlag.ORIGINAL,
1300
+ ])
1301
+ elif is_dynamic_block_child(block):
1302
+ flags.append(DynamicBlockFlag.DYNAMIC_CHILD)
1303
+
1304
+ if is_dynamic_block(block):
1305
+ flags.append(DynamicBlockFlag.DYNAMIC)
1306
+
1307
+ if is_replicated_block(block):
1308
+ flags.append(DynamicBlockFlag.REPLICATED)
1309
+
1310
+ if should_reduce_output(block):
1311
+ flags.append(DynamicBlockFlag.REDUCE_OUTPUT)
1312
+
1313
+ if len(flags) >= 1:
1314
+ create_options['metrics'] = dict(metadata=dict(
1315
+ flags=flags,
1316
+ ))
1317
+
1252
1318
  block_arr.append((block_uuid, create_options))
1253
1319
 
1254
1320
  from mage_ai.data_preparation.models.global_hooks.pipelines import (
@@ -1416,9 +1482,9 @@ class BlockRun(BlockRunProjectPlatformMixin, BaseModel):
1416
1482
  repo_config=pipeline.repo_config,
1417
1483
  ).get_logs()
1418
1484
 
1419
- async def logs_async(self):
1485
+ async def logs_async(self, repo_path: str = None):
1420
1486
  if project_platform_activated():
1421
- return await self.logs_async_project_platform()
1487
+ return await self.logs_async_project_platform(repo_path=repo_path)
1422
1488
 
1423
1489
  pipeline = await Pipeline.get_async(self.pipeline_run.pipeline_uuid)
1424
1490
  return await LoggerManagerFactory.get_logger_manager(
@@ -1529,21 +1595,11 @@ class BlockRun(BlockRunProjectPlatformMixin, BaseModel):
1529
1595
  ),
1530
1596
  ]
1531
1597
 
1532
- # The block_run’s block_uuid for replicated blocks will be in this format:
1533
- # [block_uuid]:[replicated_block_uuid]
1534
- # We need to use the original block_uuid to get the proper output.
1535
-
1536
- # Block runs for dynamic child blocks will have the following block UUID:
1537
- # [block.uuid]:[index]
1538
- # Don’t use the original UUID even if the block is a replica because it will get rid of
1539
- # the dynamic child block index.
1540
- if block.replicated_block and not is_dynamic_block_child(block):
1541
- block_uuid = block.uuid
1542
-
1543
1598
  return block.get_outputs(
1544
1599
  execution_partition=self.pipeline_run.execution_partition,
1545
1600
  sample_count=sample_count,
1546
1601
  block_uuid=block_uuid,
1602
+ metadata=self.metrics.get('metadata') if self.metrics else None,
1547
1603
  )
1548
1604
 
1549
1605
 
@@ -347,9 +347,8 @@ class PipelineRunProjectPlatformMixin:
347
347
 
348
348
 
349
349
  class BlockRunProjectPlatformMixin:
350
- async def logs_async_project_platform(self):
351
- repo_path = None
352
- if self.pipeline_run and self.pipeline_run.pipeline_schedule:
350
+ async def logs_async_project_platform(self, repo_path: str = None):
351
+ if not repo_path and self.pipeline_run and self.pipeline_run.pipeline_schedule:
353
352
  repo_path = self.pipeline_run.pipeline_schedule.repo_path
354
353
 
355
354
  pipeline = await get_pipeline_from_platform_async(
@@ -131,6 +131,10 @@ class PipelineScheduler:
131
131
  if self.pipeline_run.status == PipelineRun.PipelineRunStatus.RUNNING:
132
132
  return True
133
133
 
134
+ lock_key = f'pipeline_run_{self.pipeline_run.id}'
135
+ if not lock.try_acquire_lock(lock_key):
136
+ return
137
+
134
138
  tags = self.build_tags()
135
139
 
136
140
  is_integration = PipelineType.INTEGRATION == self.pipeline.type
@@ -167,6 +171,8 @@ class PipelineScheduler:
167
171
  error=error_msg,
168
172
  )
169
173
  return False
174
+ finally:
175
+ lock.release_lock(lock_key)
170
176
 
171
177
  self.pipeline_run.update(
172
178
  started_at=datetime.now(tz=pytz.UTC),
@@ -296,7 +302,7 @@ class PipelineScheduler:
296
302
  error_msg = 'Failed blocks: '\
297
303
  f'{", ".join([b.block_uuid for b in failed_block_runs])}.'
298
304
  else:
299
- error_msg = 'Pipelien run timed out.'
305
+ error_msg = 'Pipeline run timed out.'
300
306
  self.notification_sender.send_pipeline_run_failure_message(
301
307
  pipeline=self.pipeline,
302
308
  pipeline_run=self.pipeline_run,
@@ -1099,6 +1105,7 @@ def run_block(
1099
1105
  return ExecutorFactory.get_block_executor(
1100
1106
  pipeline,
1101
1107
  block_uuid,
1108
+ block_run_id=block_run.id,
1102
1109
  execution_partition=execution_partition,
1103
1110
  ).execute(
1104
1111
  block_run_id=block_run.id,
@@ -1493,16 +1500,17 @@ def schedule_all():
1493
1500
  )
1494
1501
  else:
1495
1502
  payload['create_block_runs'] = False
1496
- pipeline_run = PipelineRun.create(**payload)
1497
- # Log Git sync status for new pipeline runs if a git sync result exists
1498
- if git_sync_result:
1499
- pipeline_scheduler = PipelineScheduler(pipeline_run)
1500
- log_git_sync(
1501
- git_sync_result,
1502
- pipeline_scheduler.logger,
1503
- pipeline_scheduler.build_tags(),
1504
- )
1505
- initial_pipeline_runs.append(pipeline_run)
1503
+ pipeline_run = PipelineRun.create(prevent_duplicates=True, **payload)
1504
+ if pipeline_run:
1505
+ # Log Git sync status for new pipeline runs if a git sync result exists
1506
+ if git_sync_result:
1507
+ pipeline_scheduler = PipelineScheduler(pipeline_run)
1508
+ log_git_sync(
1509
+ git_sync_result,
1510
+ pipeline_scheduler.logger,
1511
+ pipeline_scheduler.build_tags(),
1512
+ )
1513
+ initial_pipeline_runs.append(pipeline_run)
1506
1514
 
1507
1515
  # Enforce pipeline concurrency limit
1508
1516
  pipeline_run_quota = None
@@ -139,6 +139,10 @@ class PipelineScheduler:
139
139
  if self.pipeline_run.status == PipelineRun.PipelineRunStatus.RUNNING:
140
140
  return True
141
141
 
142
+ lock_key = f'pipeline_run_{self.pipeline_run.id}'
143
+ if not lock.try_acquire_lock(lock_key):
144
+ return
145
+
142
146
  tags = self.build_tags()
143
147
 
144
148
  is_integration = PipelineType.INTEGRATION == self.pipeline.type
@@ -175,6 +179,8 @@ class PipelineScheduler:
175
179
  error=error_msg,
176
180
  )
177
181
  return False
182
+ finally:
183
+ lock.release_lock(lock_key)
178
184
 
179
185
  self.pipeline_run.update(
180
186
  started_at=datetime.now(tz=pytz.UTC),
@@ -304,7 +310,7 @@ class PipelineScheduler:
304
310
  error_msg = 'Failed blocks: '\
305
311
  f'{", ".join([b.block_uuid for b in failed_block_runs])}.'
306
312
  else:
307
- error_msg = 'Pipelien run timed out.'
313
+ error_msg = 'Pipeline run timed out.'
308
314
  self.notification_sender.send_pipeline_run_failure_message(
309
315
  pipeline=self.pipeline,
310
316
  pipeline_run=self.pipeline_run,
@@ -1114,6 +1120,7 @@ def run_block(
1114
1120
  return ExecutorFactory.get_block_executor(
1115
1121
  pipeline,
1116
1122
  block_uuid,
1123
+ block_run_id=block_run.id,
1117
1124
  execution_partition=execution_partition,
1118
1125
  ).execute(
1119
1126
  block_run_id=block_run.id,
@@ -1559,16 +1566,18 @@ def schedule_all():
1559
1566
  )
1560
1567
  else:
1561
1568
  payload['create_block_runs'] = False
1562
- pipeline_run = PipelineRun.create(**payload)
1563
- # Log Git sync status for new pipeline runs if a git sync result exists
1564
- if git_sync_result:
1565
- pipeline_scheduler = PipelineScheduler(pipeline_run)
1566
- log_git_sync(
1567
- git_sync_result,
1568
- pipeline_scheduler.logger,
1569
- pipeline_scheduler.build_tags(),
1570
- )
1571
- initial_pipeline_runs.append(pipeline_run)
1569
+ pipeline_run = PipelineRun.create(prevent_duplicates=True, **payload)
1570
+ if pipeline_run:
1571
+ # Log Git sync status for new pipeline runs if a git sync result
1572
+ # exists
1573
+ if git_sync_result:
1574
+ pipeline_scheduler = PipelineScheduler(pipeline_run)
1575
+ log_git_sync(
1576
+ git_sync_result,
1577
+ pipeline_scheduler.logger,
1578
+ pipeline_scheduler.build_tags(),
1579
+ )
1580
+ initial_pipeline_runs.append(pipeline_run)
1572
1581
 
1573
1582
  # Enforce pipeline concurrency limit
1574
1583
  pipeline_run_quota = None
@@ -5,6 +5,7 @@ INTERACTIONS_DIRECTORY_NAME = 'interactions'
5
5
 
6
6
  class InteractionInputType(str, Enum):
7
7
  CHECKBOX = 'checkbox'
8
+ CODE = 'code'
8
9
  DROPDOWN_MENU = 'dropdown_menu'
9
10
  SWITCH = 'switch'
10
11
  TEXT_FIELD = 'text_field'
@@ -36,6 +36,7 @@ class InteractionInputOption:
36
36
  @dataclass
37
37
  class InteractionInputStyle:
38
38
  input_type: InteractionInputStyleInputType = None
39
+ language: str = None
39
40
  multiline: bool = None
40
41
 
41
42
  def __post_init__(self):
@@ -65,10 +66,10 @@ class InteractionInput:
65
66
  if self.type and isinstance(self.type, str):
66
67
  self.type = InteractionInputType(self.type)
67
68
 
68
- def to_dict(self) -> Dict:
69
+ def to_dict(self, **kwargs) -> Dict:
69
70
  return dict(
70
- options=[i.to_dict() for i in self.options],
71
- style=self.style.to_dict() if self.style else None,
71
+ options=[i.to_dict(**kwargs) for i in self.options],
72
+ style=self.style.to_dict(**kwargs) if self.style else None,
72
73
  type=self.type.value if self.type else None,
73
74
  )
74
75
 
@@ -38,7 +38,7 @@ class CreatePage(BasePage):
38
38
  @classmethod
39
39
  async def disabled(self, current_user: User = None, **kwargs) -> bool:
40
40
  pipelines = kwargs.get('pipelines') or []
41
- for pipeline in pipelines:
41
+ for pipeline in [p for p in pipelines if p]:
42
42
  pipeline_schedule = PipelineScheduleResource.model_class(pipeline_uuid=pipeline.uuid)
43
43
  resource = PipelineScheduleResource(pipeline_schedule, current_user)
44
44
  policy = resource.policy_class()(resource, current_user)
@@ -12,4 +12,4 @@ DATAFRAME_OUTPUT_SAMPLE_COUNT = 10
12
12
  # Dockerfile depends on it because it runs ./scripts/install_mage.sh and uses
13
13
  # the last line to determine the version to install.
14
14
  VERSION = \
15
- '0.9.57'
15
+ '0.9.59'