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
@@ -0,0 +1,39 @@
1
+ import asyncio
2
+ from datetime import datetime
3
+ from typing import Dict, List
4
+
5
+ from mage_ai.cache.block import BlockCache
6
+ from mage_ai.command_center.blocks.utils import add_application_actions, build_and_score
7
+ from mage_ai.command_center.factory import BaseFactory
8
+ from mage_ai.shared.hash import merge_dict
9
+
10
+
11
+ class BlockFactory(BaseFactory):
12
+ async def fetch_items(self, **kwargs) -> List[Dict]:
13
+ items = []
14
+
15
+ if self.search:
16
+ now = datetime.utcnow().timestamp()
17
+ cache = await BlockCache.initialize_cache()
18
+ mapping = cache.get(cache.cache_key)
19
+ print(f'[BlockFactory] Load: {len(mapping)} - {datetime.utcnow().timestamp() - now}')
20
+
21
+ data_array = mapping.items()
22
+ now = datetime.utcnow().timestamp()
23
+ await asyncio.gather(
24
+ *[build_and_score(self, data, items) for data in data_array]
25
+ )
26
+ print(
27
+ f'[BlockFactory] Search {self.search}: '
28
+ f'{len(items)} - {datetime.utcnow().timestamp() - now}',
29
+ )
30
+
31
+ now = datetime.utcnow().timestamp()
32
+ items = await self.rank_items(items)
33
+ items = [merge_dict(
34
+ item_dict,
35
+ add_application_actions(item_dict),
36
+ ) for item_dict in items]
37
+ print(f'[BlockFactory] Rank items: {datetime.utcnow().timestamp() - now}')
38
+
39
+ return items
@@ -0,0 +1,127 @@
1
+ import urllib.parse
2
+ from pathlib import Path
3
+ from typing import Dict, List, Tuple
4
+
5
+ from mage_ai.api.operations.constants import OperationType
6
+ from mage_ai.command_center.constants import (
7
+ ApplicationType,
8
+ ButtonActionType,
9
+ ItemType,
10
+ ObjectType,
11
+ )
12
+ from mage_ai.command_center.utils import shorten_directory
13
+
14
+
15
+ def add_application_actions(item_dict: Dict) -> Dict:
16
+ uuid = item_dict.get('uuid')
17
+ block_metadata = (item_dict.get('metadata') or {}).get('block') or {}
18
+ file_path = block_metadata.get('file_path')
19
+
20
+ actions = []
21
+ buttons = []
22
+ pipelines = block_metadata.get('pipelines')
23
+ if pipelines:
24
+ pipeline_uuid = pipelines[0].get('uuid')
25
+ actions.append(dict(
26
+ page=dict(
27
+ path=f'/pipelines/{pipeline_uuid}/edit',
28
+ ),
29
+ uuid='open_block_in_pipeline',
30
+ ))
31
+ buttons.append(dict(
32
+ label='Open block in pipeline',
33
+ keyboard_shortcuts=[[13]],
34
+ action_types=[
35
+ ButtonActionType.EXECUTE,
36
+ ],
37
+ ))
38
+
39
+ return dict(
40
+ applications=[
41
+ dict(
42
+ application_type=ApplicationType.DETAIL,
43
+ actions=[
44
+ dict(
45
+ request=dict(
46
+ operation=OperationType.DETAIL,
47
+ resource='blocks',
48
+ resource_id=urllib.parse.quote_plus(uuid or ''),
49
+ response_resource_key='block',
50
+ query=dict(
51
+ file_path=urllib.parse.quote_plus(file_path or ''),
52
+ ),
53
+ ),
54
+ uuid='block_detail',
55
+ ),
56
+ ],
57
+ buttons=buttons,
58
+ uuid='model_detail',
59
+ ),
60
+ ],
61
+ actions=actions,
62
+ )
63
+
64
+
65
+ async def build_and_score(
66
+ factory,
67
+ data_input: Tuple[str, Dict],
68
+ items: List[Dict],
69
+ add_application: bool = False,
70
+ ):
71
+ uuid, data = data_input
72
+ block = data.get('block') or {}
73
+ pipelines = [d.get('pipeline') for d in (data.get('pipelines') or [])]
74
+
75
+ file_path = block.get('file_path') or f'{uuid}'
76
+ if not Path(file_path).suffix:
77
+ file_path = f'{file_path}.py'
78
+
79
+ path_dict = shorten_directory(file_path)
80
+ directory = path_dict.get('directory')
81
+
82
+ title = block.get('name') or uuid
83
+ parts = []
84
+ if block.get('name'):
85
+ parts = Path(block.get('name')).parts
86
+ elif uuid:
87
+ parts = Path(uuid).parts
88
+
89
+ if parts:
90
+ title = parts[len(parts) - 1]
91
+
92
+ description = directory
93
+ if len(pipelines) == 1:
94
+ description = f'{description} in 1 pipeline'
95
+ else:
96
+ description = f'{description} in {len(pipelines)} pipelines'
97
+
98
+ item_dict = dict(
99
+ item_type=ItemType.DETAIL,
100
+ object_type=ObjectType.BLOCK,
101
+ title=title,
102
+ description=description,
103
+ uuid=uuid,
104
+ metadata=dict(
105
+ block=dict(
106
+ file_path=file_path,
107
+ language=block.get('language'),
108
+ pipelines=pipelines,
109
+ type=block.get('type'),
110
+ ),
111
+ ),
112
+ display_settings_by_attribute=dict(
113
+ description=dict(
114
+ text_styles=dict(
115
+ monospace=True,
116
+ small=True,
117
+ ),
118
+ ),
119
+ ),
120
+ )
121
+
122
+ if add_application:
123
+ item_dict.update(add_application_actions(item_dict))
124
+
125
+ scored = factory.filter_score(item_dict)
126
+ if scored:
127
+ items.append(scored)
@@ -0,0 +1,66 @@
1
+ from enum import Enum
2
+
3
+ SETTINGS_FILENAME = '.command_center.yaml'
4
+
5
+
6
+ class ItemTagEnum(str, Enum):
7
+ PINNED = 'pinned'
8
+ RECENT = 'recent'
9
+
10
+
11
+ class ItemType(str, Enum):
12
+ ACTION = 'action' # Cast spell
13
+ CREATE = 'create' # Conjure
14
+ DETAIL = 'detail' # Enchant
15
+ LIST = 'list' # Enchant
16
+ NAVIGATE = 'navigate' # Teleport
17
+ OPEN = 'open' # Summon - open shows a view on the same page vs navigating to another page
18
+ SUPPORT = 'support' # Reinforcements
19
+
20
+
21
+ class ObjectType(str, Enum):
22
+ APPLICATION = 'application'
23
+ BLOCK = 'block'
24
+ CHAT = 'chat'
25
+ CODE = 'code'
26
+ DOCUMENT = 'document'
27
+ FILE = 'file'
28
+ FOLDER = 'folder'
29
+ GIT = 'git'
30
+ PIPELINE = 'pipeline'
31
+ PIPELINE_RUN = 'pipeline_run'
32
+ TRIGGER = 'trigger'
33
+
34
+
35
+ class FileExtension(str, Enum):
36
+ CSV = 'csv'
37
+ JSON = 'json'
38
+ MD = 'md'
39
+ PY = 'py'
40
+ R = 'r'
41
+ SH = 'sh'
42
+ SQL = 'sql'
43
+ TXT = 'txt'
44
+ YAML = 'yaml'
45
+ YML = 'yml'
46
+
47
+
48
+ class InteractionType(str, Enum):
49
+ CLICK = 'click'
50
+ OPEN_FILE = 'open_file'
51
+ SCROLL = 'scroll'
52
+
53
+
54
+ class ApplicationType(str, Enum):
55
+ DETAIL = 'detail'
56
+ DETAIL_LIST = 'detail_list'
57
+ FORM = 'form'
58
+
59
+
60
+ class ButtonActionType(str, Enum):
61
+ ADD_APPLICATION = 'add_application'
62
+ CLOSE_APPLICATION = 'close_application' # Go back out of the current application.
63
+ CUSTOM_ACTIONS = 'custom_actions'
64
+ EXECUTE = 'execute' # Executes the actions associated to the application’s item.
65
+ REPLACE_APPLICATION = 'replace_application'
66
+ RESET_FORM = 'reset_form' # If there is a form filled out, clear out all the values.
@@ -0,0 +1,161 @@
1
+ import asyncio
2
+ from collections.abc import Iterable
3
+ from pathlib import Path
4
+ from typing import Dict, List, Union
5
+
6
+ from thefuzz import fuzz
7
+
8
+ from mage_ai.command_center.constants import ObjectType
9
+ from mage_ai.command_center.models import Application, Item
10
+ from mage_ai.data_preparation.models.project import Project
11
+ from mage_ai.orchestration.db.models.oauth import User
12
+ from mage_ai.shared.array import flatten
13
+ from mage_ai.shared.hash import ignore_keys, merge_dict
14
+
15
+ DEFAULT_RATIO = 65
16
+
17
+
18
+ class BaseFactory:
19
+ def __init__(
20
+ self,
21
+ application: Dict = None,
22
+ component: str = None,
23
+ item: Dict = None,
24
+ page: str = None,
25
+ page_history: List[Dict] = None,
26
+ picks: str = None,
27
+ search: str = None,
28
+ search_history: List[Dict] = None,
29
+ search_ratio: int = DEFAULT_RATIO,
30
+ user: User = None,
31
+ ):
32
+ self.application = Application.load(**application) if application else application
33
+ self.component = component
34
+ self.item = Item.load(**item) if item else item
35
+ self.page = page
36
+ self.page_history = page_history
37
+ self.picks = picks
38
+ self.search = search
39
+ self.search_history = search_history
40
+ self.search_ratio = search_ratio
41
+ self.user = user
42
+
43
+ @classmethod
44
+ async def create_items(
45
+ self,
46
+ factory_or_items: List[Union['BaseFactory', List[Dict]]],
47
+ **kwargs,
48
+ ) -> List[Item]:
49
+ async def process_factory_items(
50
+ class_or_items: Union['BaseFactory', List[Dict]],
51
+ cls=self,
52
+ kwargs=kwargs,
53
+ ) -> List[Item]:
54
+ is_iterable = isinstance(class_or_items, Iterable)
55
+ factory_class = class_or_items if not is_iterable and issubclass(
56
+ class_or_items,
57
+ cls,
58
+ ) else cls
59
+ items_dicts = class_or_items if is_iterable else None
60
+
61
+ return await factory_class(**kwargs).process(items_dicts)
62
+
63
+ application = kwargs.get('application')
64
+ item = kwargs.get('item')
65
+ if application and item:
66
+ object_type = item.get('object_type')
67
+ if ObjectType.PIPELINE == object_type:
68
+ from mage_ai.command_center.pipelines.factory import PipelineFactory
69
+ factory_or_items = [PipelineFactory]
70
+ elif ObjectType.TRIGGER == object_type:
71
+ from mage_ai.command_center.triggers.factory import TriggerFactory
72
+ factory_or_items = [TriggerFactory]
73
+
74
+ return flatten(await asyncio.gather(
75
+ *[process_factory_items(class_or_items) for class_or_items in factory_or_items]
76
+ ))
77
+
78
+ @property
79
+ def project(self) -> Project:
80
+ return Project(root_project=True)
81
+
82
+ # Subclasses MUST override this
83
+ async def fetch_items(self, **kwargs) -> List[Dict]:
84
+ raise Exception
85
+
86
+ # Subclasses can override this
87
+ def get_item_uuid(self, item_dict: Dict, **kwargs) -> str:
88
+ return item_dict.get('uuid') or ''
89
+
90
+ # Subclasses can override this
91
+ def get_searchable_text(self, item_dict: Dict, **kwargs) -> str:
92
+ arr = []
93
+ for key in ['title', 'description', 'uuid', 'item_type', 'object_type']:
94
+ if item_dict.get(key):
95
+ value = item_dict.get(key)
96
+ if value:
97
+ value = value.lower()
98
+ extension = Path(value).suffix
99
+ if extension:
100
+ arr.append(Path(value).stem)
101
+ arr.append(extension)
102
+ arr.append(value)
103
+
104
+ text = ' '.join(arr)
105
+ return ' '.join([
106
+ text,
107
+ text.replace('_', ' '),
108
+ ])
109
+
110
+ # Subclasses can override this
111
+ def score_item(self, _item_dict: Dict, score: int = None) -> int:
112
+ return score
113
+
114
+ def filter_score(self, item_dict: Dict) -> Union[None, Dict]:
115
+ score = 0
116
+ if self.search:
117
+ score = fuzz.partial_token_sort_ratio(
118
+ self.search,
119
+ self.get_searchable_text(item_dict),
120
+ )
121
+ if score < self.search_ratio:
122
+ return None
123
+
124
+ condition = item_dict.get('condition')
125
+ if (not condition or condition(dict(project=self.project, user=self.user))):
126
+ return merge_dict(item_dict, dict(score=self.score_item(item_dict, score=score)))
127
+
128
+ return None
129
+
130
+ async def process(self, items_dicts: List[Dict] = None) -> List[Item]:
131
+ items_dicts_scored = []
132
+ if items_dicts:
133
+ for item_dict in items_dicts:
134
+ item_scored = self.filter_score(item_dict)
135
+ if item_scored:
136
+ items_dicts_scored.append(item_scored)
137
+ else:
138
+ items_dicts_scored = await self.fetch_items()
139
+
140
+ return await self.__post_process_items(self.__build_items(items_dicts_scored))
141
+
142
+ async def rank_items(self, items_or_dicts: List[Union[Dict, Item]]) -> List[Union[Dict, Item]]:
143
+ return [item for item in sorted(
144
+ items_or_dicts,
145
+ key=lambda i: (i.score if isinstance(
146
+ i,
147
+ Item,
148
+ ) else i.get('score') if i else -100) or - 100,
149
+ reverse=True,
150
+ )]
151
+
152
+ def __build_items(self, items_dicts_scored: List[Dict]) -> List[Item]:
153
+ return [Item.load(**merge_dict(ignore_keys(item_dict, [
154
+ 'condition',
155
+ ]), dict(
156
+ title=item_dict.get('title') or item_dict.get('uuid'),
157
+ uuid=item_dict.get('uuid') or item_dict.get('title'),
158
+ ))) for item_dict in items_dicts_scored if item_dict]
159
+
160
+ async def __post_process_items(self, items: List[Item]) -> List[Item]:
161
+ return await self.rank_items(items)
File without changes
@@ -0,0 +1,235 @@
1
+ import urllib.parse
2
+ from typing import Dict
3
+
4
+ from mage_ai.api.operations.constants import OperationType
5
+ from mage_ai.api.policies.FilePolicy import FilePolicy
6
+ from mage_ai.command_center.constants import (
7
+ ApplicationType,
8
+ ButtonActionType,
9
+ InteractionType,
10
+ ItemType,
11
+ ObjectType,
12
+ )
13
+ from mage_ai.presenters.interactions.constants import InteractionInputType
14
+
15
+ ITEMS = [
16
+ dict(
17
+ item_type=ItemType.CREATE,
18
+ object_type=ObjectType.FILE,
19
+ title='Create a new file',
20
+ applications=[
21
+ dict(
22
+ application_type=ApplicationType.FORM,
23
+ buttons=[
24
+ dict(
25
+ label='Cancel',
26
+ tooltip='Discard changes and go back.',
27
+ keyboard_shortcuts=[['metaKey', 27]],
28
+ action_types=[
29
+ ButtonActionType.RESET_FORM,
30
+ ButtonActionType.CLOSE_APPLICATION,
31
+ ],
32
+ ),
33
+ dict(
34
+ label='Create new file',
35
+ tooltip='Save changes and create the new file.',
36
+ keyboard_shortcuts=[[13]],
37
+ action_types=[
38
+ ButtonActionType.EXECUTE,
39
+ ButtonActionType.RESET_FORM,
40
+ ],
41
+ ),
42
+ ],
43
+ settings=[
44
+ dict(
45
+ label='Directory',
46
+ description=(
47
+ 'The location to create the file in. '
48
+ 'Must be relative to the top level directory.'
49
+ ),
50
+ placeholder='e.g. utils',
51
+ display_settings=dict(
52
+ icon_uuid='FolderOutline',
53
+ ),
54
+ name='request.payload.file.dir_path',
55
+ type=InteractionInputType.TEXT_FIELD,
56
+ required=True,
57
+ monospace=True,
58
+ action_uuid='create_file',
59
+ ),
60
+ dict(
61
+ label='File name',
62
+ description='A descriptive name of the file to be created.',
63
+ display_settings=dict(
64
+ icon_uuid='File',
65
+ ),
66
+ placeholder='e.g. magic_powers.py',
67
+ name='request.payload.file.name',
68
+ type=InteractionInputType.TEXT_FIELD,
69
+ required=True,
70
+ monospace=True,
71
+ action_uuid='create_file',
72
+ ),
73
+ ],
74
+ uuid='new_file',
75
+ ),
76
+ ],
77
+ actions=[
78
+ dict(
79
+ request=dict(
80
+ operation=OperationType.CREATE,
81
+ payload=dict(
82
+ file=dict(
83
+ overwrite=False,
84
+ ),
85
+ file_json_only=True,
86
+ ),
87
+ resource='files',
88
+ response_resource_key='file'
89
+ ),
90
+ uuid='create_file',
91
+ ),
92
+ dict(
93
+ interaction=dict(
94
+ type=InteractionType.OPEN_FILE,
95
+ ),
96
+ upstream_action_value_key_mapping=dict(
97
+ create_file={
98
+ 'data.file.path': 'interaction.options.file_path',
99
+ }
100
+ ),
101
+ uuid='open_file',
102
+ ),
103
+ ],
104
+ condition=lambda opts: FilePolicy(
105
+ None,
106
+ opts.get('user'),
107
+ ).has_at_least_editor_role(),
108
+ ),
109
+ dict(
110
+ item_type=ItemType.CREATE,
111
+ object_type=ObjectType.FOLDER,
112
+ title='Create a new folder',
113
+ applications=[
114
+ dict(
115
+ application_type=ApplicationType.FORM,
116
+ buttons=[
117
+ dict(
118
+ label='Cancel',
119
+ tooltip='Discard changes and go back.',
120
+ keyboard_shortcuts=[['metaKey', 27]],
121
+ action_types=[
122
+ ButtonActionType.RESET_FORM,
123
+ ButtonActionType.CLOSE_APPLICATION,
124
+ ],
125
+ ),
126
+ dict(
127
+ label='Create new folder',
128
+ tooltip='Save changes and create the new folder.',
129
+ keyboard_shortcuts=[[13]],
130
+ action_types=[
131
+ ButtonActionType.EXECUTE,
132
+ ButtonActionType.RESET_FORM,
133
+ ],
134
+ ),
135
+ ],
136
+ settings=[
137
+ dict(
138
+ label='Directory',
139
+ description='The parent directory of this folder.',
140
+ placeholder='e.g. utils',
141
+ display_settings=dict(
142
+ icon_uuid='FolderOutline',
143
+ ),
144
+ name='request.payload.folder.path',
145
+ type=InteractionInputType.TEXT_FIELD,
146
+ required=True,
147
+ monospace=True,
148
+ action_uuid='create_folder',
149
+ ),
150
+ dict(
151
+ label='Folder name',
152
+ description='A descriptive name of the folder to be created.',
153
+ display_settings=dict(
154
+ icon_uuid='Alphabet',
155
+ ),
156
+ placeholder='e.g. transformers',
157
+ name='request.payload.folder.name',
158
+ type=InteractionInputType.TEXT_FIELD,
159
+ required=True,
160
+ monospace=True,
161
+ action_uuid='create_folder',
162
+ ),
163
+ ],
164
+ uuid='new_folder',
165
+ ),
166
+ ],
167
+ actions=[
168
+ dict(
169
+ request=dict(
170
+ operation=OperationType.CREATE,
171
+ payload=dict(
172
+ folder=dict(
173
+ overwrite=False,
174
+ ),
175
+ ),
176
+ resource='folders',
177
+ response_resource_key='folder'
178
+ ),
179
+ uuid='create_folder',
180
+ ),
181
+ dict(
182
+ page=dict(
183
+ path='/files',
184
+ ),
185
+ uuid='navigate_folder',
186
+ ),
187
+ ],
188
+ condition=lambda opts: FilePolicy(
189
+ None,
190
+ opts.get('user'),
191
+ ).has_at_least_editor_role(),
192
+ ),
193
+ ]
194
+
195
+
196
+ def add_application_actions(item_dict: Dict) -> Dict:
197
+ uuid = item_dict.get('uuid')
198
+
199
+ return dict(
200
+ applications=[
201
+ dict(
202
+ application_type=ApplicationType.DETAIL,
203
+ actions=[
204
+ dict(
205
+ request=dict(
206
+ operation=OperationType.DETAIL,
207
+ resource='file_contents',
208
+ resource_id=urllib.parse.quote_plus(uuid),
209
+ response_resource_key='file_content',
210
+ ),
211
+ uuid='file_content_detail',
212
+ ),
213
+ ],
214
+ buttons=[
215
+ dict(
216
+ label='Open file',
217
+ keyboard_shortcuts=[[13]],
218
+ action_types=[
219
+ ButtonActionType.EXECUTE,
220
+ ],
221
+ ),
222
+ ],
223
+ uuid='model_detail',
224
+ ),
225
+ ],
226
+ actions=[
227
+ dict(
228
+ interaction=dict(
229
+ options=dict(file_path=uuid),
230
+ type=InteractionType.OPEN_FILE,
231
+ ),
232
+ uuid='open_file',
233
+ ),
234
+ ],
235
+ )