mage-ai 0.9.46__py3-none-any.whl → 0.9.48__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 (405) hide show
  1. mage_ai/api/operations/base.py +27 -5
  2. mage_ai/api/policies/GlobalHookPolicy.py +1 -1
  3. mage_ai/api/policies/IntegrationSourcePolicy.py +62 -0
  4. mage_ai/api/policies/OauthPolicy.py +6 -6
  5. mage_ai/api/presenters/GlobalHookPresenter.py +1 -1
  6. mage_ai/api/presenters/IntegrationSourcePresenter.py +9 -2
  7. mage_ai/api/presenters/PipelinePresenter.py +3 -0
  8. mage_ai/api/presenters/PipelineRunPresenter.py +8 -3
  9. mage_ai/api/presenters/PipelineSchedulePresenter.py +22 -1
  10. mage_ai/api/resources/BlockResource.py +5 -0
  11. mage_ai/api/resources/DataProviderResource.py +2 -0
  12. mage_ai/api/resources/IntegrationSourceResource.py +149 -2
  13. mage_ai/data_integrations/sources/constants.py +5 -0
  14. mage_ai/data_integrations/utils/scheduler.py +57 -2
  15. mage_ai/data_preparation/executors/block_executor.py +30 -2
  16. mage_ai/data_preparation/executors/pipeline_executor.py +19 -4
  17. mage_ai/data_preparation/models/block/__init__.py +75 -32
  18. mage_ai/data_preparation/models/block/data_integration/constants.py +3 -0
  19. mage_ai/data_preparation/models/block/data_integration/mixins.py +6 -6
  20. mage_ai/data_preparation/models/block/data_integration/utils.py +198 -39
  21. mage_ai/data_preparation/models/block/sql/bigquery.py +2 -2
  22. mage_ai/data_preparation/models/block/sql/snowflake.py +2 -2
  23. mage_ai/data_preparation/models/block/sql/trino.py +2 -2
  24. mage_ai/data_preparation/models/block/sql/utils/shared.py +20 -3
  25. mage_ai/data_preparation/models/block/utils.py +53 -29
  26. mage_ai/data_preparation/models/global_hooks/constants.py +50 -1
  27. mage_ai/data_preparation/models/global_hooks/models.py +148 -84
  28. mage_ai/data_preparation/models/global_hooks/predicates.py +316 -0
  29. mage_ai/data_preparation/models/pipeline.py +7 -0
  30. mage_ai/data_preparation/models/pipelines/integration_pipeline.py +0 -1
  31. mage_ai/data_preparation/models/project/__init__.py +0 -2
  32. mage_ai/data_preparation/preferences.py +29 -18
  33. mage_ai/data_preparation/repo_manager.py +12 -2
  34. mage_ai/data_preparation/sync/__init__.py +2 -0
  35. mage_ai/data_preparation/templates/constants.py +14 -0
  36. mage_ai/data_preparation/templates/data_exporters/chroma.py +24 -0
  37. mage_ai/data_preparation/templates/data_exporters/streaming/rabbitmq.yaml +7 -0
  38. mage_ai/data_preparation/templates/data_loaders/chroma.py +27 -0
  39. mage_ai/data_preparation/templates/repo/io_config.yaml +3 -0
  40. mage_ai/io/base.py +1 -0
  41. mage_ai/io/chroma.py +162 -0
  42. mage_ai/io/config.py +8 -0
  43. mage_ai/orchestration/db/models/schedules.py +169 -34
  44. mage_ai/orchestration/pipeline_scheduler.py +59 -89
  45. mage_ai/server/constants.py +1 -1
  46. mage_ai/server/frontend_dist/404.html +2 -2
  47. mage_ai/server/frontend_dist/_next/static/chunks/{1749-9a6276b2918fdae1.js → 1749-bf512b4dabbab7fa.js} +1 -1
  48. mage_ai/server/frontend_dist/_next/static/chunks/1952-0f9a12782f0aaae6.js +1 -0
  49. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/2714-1e79e9f2e998b544.js → frontend_dist/_next/static/chunks/2714-68fef54789d7eaeb.js} +1 -1
  50. mage_ai/server/frontend_dist/_next/static/chunks/2717-14191a781cf2f286.js +1 -0
  51. mage_ai/server/frontend_dist/_next/static/chunks/3419-a7a52bcaaa687b07.js +1 -0
  52. mage_ai/server/frontend_dist/_next/static/chunks/3437-e81a62f33337ca06.js +1 -0
  53. mage_ai/server/frontend_dist/_next/static/chunks/3943-3cb1f765210dd7a4.js +1 -0
  54. mage_ai/server/frontend_dist/_next/static/chunks/4138-2c16e6d2f22246cd.js +1 -0
  55. mage_ai/server/frontend_dist/_next/static/chunks/4267-cb102e060a43d9bd.js +1 -0
  56. mage_ai/server/frontend_dist/_next/static/chunks/{4366-93e09e5a4a7e182c.js → 4366-3e52497942acbafe.js} +1 -1
  57. mage_ai/server/frontend_dist/_next/static/chunks/{4783-1a21d9be47574bba.js → 4783-422429203610c318.js} +1 -1
  58. mage_ai/server/frontend_dist/_next/static/chunks/{5499-76cf8f023c6b0985.js → 5499-c2853ef57d39fde8.js} +1 -1
  59. mage_ai/server/frontend_dist/_next/static/chunks/5810-e26a0768db1cfdba.js +1 -0
  60. mage_ai/server/frontend_dist/_next/static/chunks/{5896-14e5a23b1c6a0769.js → 5896-7b8e36634d7d94eb.js} +1 -1
  61. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/6285-e9b45335bfb9ccaf.js → frontend_dist/_next/static/chunks/6285-648f9a732e100b2f.js} +1 -1
  62. mage_ai/server/frontend_dist/_next/static/chunks/6798-b904395b0c18647b.js +1 -0
  63. mage_ai/server/frontend_dist/_next/static/chunks/6990-303bb87fc50f1755.js +1 -0
  64. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/7022-070ec0144a4d029c.js → frontend_dist/_next/static/chunks/7022-e76cae3ba5ee5312.js} +1 -1
  65. mage_ai/server/frontend_dist/_next/static/chunks/{7361-694e1e4fb9c97d68.js → 7361-6c5c9063b9f91700.js} +1 -1
  66. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/7858-d9df72e95e438284.js → frontend_dist/_next/static/chunks/7858-26a5a5d04fa3c703.js} +1 -1
  67. mage_ai/server/frontend_dist/_next/static/chunks/{8146-92e7ccfed169ee9c.js → 8146-27f0e31f309897a5.js} +1 -1
  68. mage_ai/server/frontend_dist/_next/static/chunks/8264-9d6a7cea289e29ff.js +1 -0
  69. mage_ai/server/frontend_dist/_next/static/chunks/845-9a73c65fe3fdc328.js +1 -0
  70. mage_ai/server/frontend_dist/_next/static/chunks/8487-608d62c0eef1f29a.js +1 -0
  71. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/1845-5ce774d5ab81ed57.js → frontend_dist/_next/static/chunks/8731-2f78ec7b7760be8f.js} +1 -1
  72. mage_ai/server/frontend_dist/_next/static/chunks/90-93d18aaecef0685b.js +1 -0
  73. mage_ai/server/frontend_dist/_next/static/chunks/9264-727704fc34e74ae0.js +1 -0
  74. mage_ai/server/frontend_dist/_next/static/chunks/9618-4eb49cdbd1ba11d7.js +1 -0
  75. mage_ai/server/frontend_dist/_next/static/chunks/9624-48fba6b4e6966fb7.js +1 -0
  76. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/976-18c98af60b76f1a7.js → frontend_dist/_next/static/chunks/976-0a8c2c4d7acd957b.js} +1 -1
  77. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-8254de4f793643d0.js +1 -0
  78. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/block-layout-a24cb24b6f08bbc9.js → frontend_dist/_next/static/chunks/pages/block-layout-b926f6eb1ee9a53b.js} +1 -1
  79. mage_ai/server/frontend_dist/_next/static/chunks/pages/compute-a9402b51e9fe748e.js +1 -0
  80. mage_ai/server/frontend_dist/_next/static/chunks/pages/files-85cecae037fd7a70.js +1 -0
  81. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-data-products/{[...slug]-cfd68e760ae00958.js → [...slug]-c3c9523ea8072c11.js} +1 -1
  82. mage_ai/server/frontend_dist/_next/static/chunks/pages/{global-data-products-c3b79ef31007f95b.js → global-data-products-4d046f15202a1c8d.js} +1 -1
  83. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-hooks/[...slug]-286133386c97a2b6.js +1 -0
  84. mage_ai/server/frontend_dist/_next/static/chunks/pages/{global-hooks-e561ae38cf5592e8.js → global-hooks-3da370825153056c.js} +1 -1
  85. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/manage/files-449a022f2f0f2d94.js → frontend_dist/_next/static/chunks/pages/manage/files-39b73da5a15590f6.js} +1 -1
  86. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/{settings-60845f0b59142f32.js → settings-666748ff5d101411.js} +1 -1
  87. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/[user]-9384c5f1efa2ac18.js → frontend_dist/_next/static/chunks/pages/manage/users/[user]-be27631e67dbe070.js} +1 -1
  88. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/new-abd8571907664fdf.js → frontend_dist/_next/static/chunks/pages/manage/users/new-1932ce64823b372b.js} +1 -1
  89. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/manage/users-28a930b148d99766.js → frontend_dist/_next/static/chunks/pages/manage/users-ed509c75cf23f0f5.js} +1 -1
  90. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/manage-f83deb790548693b.js → frontend_dist/_next/static/chunks/pages/manage-1feebec1124123fc.js} +1 -1
  91. mage_ai/server/frontend_dist/_next/static/chunks/pages/{oauth-8bb62c4f6a511c43.js → oauth-e9b8f19c30381c28.js} +1 -1
  92. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/overview-f0c40645f385f23f.js → frontend_dist/_next/static/chunks/pages/overview-7b2ba2d5405c05fe.js} +1 -1
  93. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipeline-runs-70fc3351bd11025f.js +1 -0
  94. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-6ee3b88a5bb4ce94.js +1 -0
  95. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-c9cf383bc13ce7b8.js +1 -0
  96. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-571c0962333b92f0.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-7bca6f718b939934.js} +1 -1
  97. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-c119f630038b0685.js +1 -0
  98. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-146051325c92d742.js +1 -0
  99. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/{block-runs-ddddcddd2f74b4f6.js → block-runs-15d307e6ba934a56.js} +1 -1
  100. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-4a238307feddb522.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-f6196e563b960e5c.js} +1 -1
  101. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors-e051057d9fe94f23.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors-25dbd73201d99e80.js} +1 -1
  102. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-06e55db757959ef8.js +1 -0
  103. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs-2d20b2cd08907afd.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs-ec3c45cfa027db58.js} +1 -1
  104. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-495e877aa7ed709e.js +1 -0
  105. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-49adfeed5157d92b.js +1 -0
  106. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-6143e028225390f5.js +1 -0
  107. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-0886f6320fef7131.js +1 -0
  108. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-e82a763d742cc034.js +1 -0
  109. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/account/profile-50d20fa715d454af.js +1 -0
  110. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-b78b1be5b9ed84b9.js → [...slug]-2bbd63b7e93a8600.js} +1 -1
  111. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{permissions-37b78a436eeab258.js → permissions-4ea156c39608caab.js} +1 -1
  112. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-f3c29ec53ee35795.js +1 -0
  113. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-db05a80d18c168e5.js → [...slug]-64ec8928d2542f3c.js} +1 -1
  114. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{roles-f55c77e4f46c8d33.js → roles-835e6ec2a48ec583.js} +1 -1
  115. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{sync-data-2a1f8737561fdd94.js → sync-data-0769149af025de30.js} +1 -1
  116. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users/{[...slug]-e3bf6e5d8bb250c4.js → [...slug]-612a65c42bcadef0.js} +1 -1
  117. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{users-20f0a050a42a015d.js → users-e3365b4029a8db33.js} +1 -1
  118. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/sign-in-99e2748e3c1d57a3.js → frontend_dist/_next/static/chunks/pages/sign-in-f3a33e8f83abdb58.js} +1 -1
  119. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/templates/[...slug]-f44ccd1499ffd23a.js → frontend_dist/_next/static/chunks/pages/templates/[...slug]-f264097bf8120f31.js} +1 -1
  120. mage_ai/server/frontend_dist/_next/static/chunks/pages/{templates-1bfaa1c50e844813.js → templates-406e13cc5c4caab4.js} +1 -1
  121. mage_ai/server/frontend_dist/_next/static/chunks/pages/{terminal-ed121e305169cf1c.js → terminal-ef8ad878e5e7bb2f.js} +1 -1
  122. mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-a90728798f964700.js +1 -0
  123. mage_ai/server/frontend_dist/_next/static/chunks/pages/version-control-0e0c2713a2922be7.js +1 -0
  124. mage_ai/server/frontend_dist/_next/static/xxcdnITr3IkTdETH5ghqw/_buildManifest.js +1 -0
  125. mage_ai/server/frontend_dist/block-layout.html +2 -2
  126. mage_ai/server/frontend_dist/compute.html +5 -5
  127. mage_ai/server/frontend_dist/files.html +5 -5
  128. mage_ai/server/frontend_dist/global-data-products/[...slug].html +5 -5
  129. mage_ai/server/frontend_dist/global-data-products.html +5 -5
  130. mage_ai/server/frontend_dist/global-hooks/[...slug].html +5 -5
  131. mage_ai/server/frontend_dist/global-hooks.html +5 -5
  132. mage_ai/server/frontend_dist/index.html +2 -2
  133. mage_ai/server/frontend_dist/manage/files.html +5 -5
  134. mage_ai/server/frontend_dist/manage/settings.html +5 -5
  135. mage_ai/server/frontend_dist/manage/users/[user].html +5 -5
  136. mage_ai/server/frontend_dist/manage/users/new.html +5 -5
  137. mage_ai/server/frontend_dist/manage/users.html +5 -5
  138. mage_ai/server/frontend_dist/manage.html +5 -5
  139. mage_ai/server/frontend_dist/oauth.html +4 -4
  140. mage_ai/server/frontend_dist/overview.html +5 -5
  141. mage_ai/server/frontend_dist/pipeline-runs.html +5 -5
  142. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills/[...slug].html +5 -5
  143. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills.html +5 -5
  144. mage_ai/server/frontend_dist/pipelines/[pipeline]/dashboard.html +5 -5
  145. mage_ai/server/frontend_dist/pipelines/[pipeline]/edit.html +2 -2
  146. mage_ai/server/frontend_dist/pipelines/[pipeline]/logs.html +5 -5
  147. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runs.html +5 -5
  148. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runtime.html +5 -5
  149. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors.html +5 -5
  150. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs/[run].html +5 -5
  151. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs.html +5 -5
  152. mage_ai/server/frontend_dist/pipelines/[pipeline]/settings.html +5 -5
  153. mage_ai/server/frontend_dist/pipelines/[pipeline]/syncs.html +5 -5
  154. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers/[...slug].html +5 -5
  155. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers.html +5 -5
  156. mage_ai/server/frontend_dist/pipelines/[pipeline].html +2 -2
  157. mage_ai/server/frontend_dist/pipelines.html +5 -5
  158. mage_ai/server/frontend_dist/settings/account/profile.html +5 -5
  159. mage_ai/server/frontend_dist/settings/workspace/permissions/[...slug].html +5 -5
  160. mage_ai/server/frontend_dist/settings/workspace/permissions.html +5 -5
  161. mage_ai/server/frontend_dist/settings/workspace/preferences.html +5 -5
  162. mage_ai/server/frontend_dist/settings/workspace/roles/[...slug].html +5 -5
  163. mage_ai/server/frontend_dist/settings/workspace/roles.html +5 -5
  164. mage_ai/server/frontend_dist/settings/workspace/sync-data.html +5 -5
  165. mage_ai/server/frontend_dist/settings/workspace/users/[...slug].html +5 -5
  166. mage_ai/server/frontend_dist/settings/workspace/users.html +5 -5
  167. mage_ai/server/frontend_dist/settings.html +2 -2
  168. mage_ai/server/frontend_dist/sign-in.html +24 -24
  169. mage_ai/server/frontend_dist/templates/[...slug].html +5 -5
  170. mage_ai/server/frontend_dist/templates.html +5 -5
  171. mage_ai/server/frontend_dist/terminal.html +5 -5
  172. mage_ai/server/frontend_dist/test.html +5 -5
  173. mage_ai/server/frontend_dist/triggers.html +5 -5
  174. mage_ai/server/frontend_dist/version-control.html +5 -5
  175. mage_ai/server/frontend_dist_base_path_template/404.html +2 -2
  176. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{1749-9a6276b2918fdae1.js → 1749-bf512b4dabbab7fa.js} +1 -1
  177. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1952-0f9a12782f0aaae6.js +1 -0
  178. mage_ai/server/{frontend_dist/_next/static/chunks/2714-1e79e9f2e998b544.js → frontend_dist_base_path_template/_next/static/chunks/2714-68fef54789d7eaeb.js} +1 -1
  179. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2717-14191a781cf2f286.js +1 -0
  180. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3419-a7a52bcaaa687b07.js +1 -0
  181. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3437-e81a62f33337ca06.js +1 -0
  182. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3943-3cb1f765210dd7a4.js +1 -0
  183. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/4138-2c16e6d2f22246cd.js +1 -0
  184. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/4267-cb102e060a43d9bd.js +1 -0
  185. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{4366-93e09e5a4a7e182c.js → 4366-3e52497942acbafe.js} +1 -1
  186. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{4783-1a21d9be47574bba.js → 4783-422429203610c318.js} +1 -1
  187. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{5499-76cf8f023c6b0985.js → 5499-c2853ef57d39fde8.js} +1 -1
  188. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5810-e26a0768db1cfdba.js +1 -0
  189. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{5896-14e5a23b1c6a0769.js → 5896-7b8e36634d7d94eb.js} +1 -1
  190. mage_ai/server/{frontend_dist/_next/static/chunks/6285-e9b45335bfb9ccaf.js → frontend_dist_base_path_template/_next/static/chunks/6285-648f9a732e100b2f.js} +1 -1
  191. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/6798-b904395b0c18647b.js +1 -0
  192. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/6990-303bb87fc50f1755.js +1 -0
  193. mage_ai/server/{frontend_dist/_next/static/chunks/7022-070ec0144a4d029c.js → frontend_dist_base_path_template/_next/static/chunks/7022-e76cae3ba5ee5312.js} +1 -1
  194. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{7361-694e1e4fb9c97d68.js → 7361-6c5c9063b9f91700.js} +1 -1
  195. mage_ai/server/{frontend_dist/_next/static/chunks/7858-d9df72e95e438284.js → frontend_dist_base_path_template/_next/static/chunks/7858-26a5a5d04fa3c703.js} +1 -1
  196. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{8146-92e7ccfed169ee9c.js → 8146-27f0e31f309897a5.js} +1 -1
  197. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8264-9d6a7cea289e29ff.js +1 -0
  198. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/845-9a73c65fe3fdc328.js +1 -0
  199. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8487-608d62c0eef1f29a.js +1 -0
  200. mage_ai/server/{frontend_dist/_next/static/chunks/1845-5ce774d5ab81ed57.js → frontend_dist_base_path_template/_next/static/chunks/8731-2f78ec7b7760be8f.js} +1 -1
  201. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/90-93d18aaecef0685b.js +1 -0
  202. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9264-727704fc34e74ae0.js +1 -0
  203. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9618-4eb49cdbd1ba11d7.js +1 -0
  204. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9624-48fba6b4e6966fb7.js +1 -0
  205. mage_ai/server/{frontend_dist/_next/static/chunks/976-18c98af60b76f1a7.js → frontend_dist_base_path_template/_next/static/chunks/976-0a8c2c4d7acd957b.js} +1 -1
  206. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-8254de4f793643d0.js +1 -0
  207. mage_ai/server/{frontend_dist/_next/static/chunks/pages/block-layout-a24cb24b6f08bbc9.js → frontend_dist_base_path_template/_next/static/chunks/pages/block-layout-b926f6eb1ee9a53b.js} +1 -1
  208. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/compute-a9402b51e9fe748e.js +1 -0
  209. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/files-85cecae037fd7a70.js +1 -0
  210. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-data-products/{[...slug]-cfd68e760ae00958.js → [...slug]-c3c9523ea8072c11.js} +1 -1
  211. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{global-data-products-c3b79ef31007f95b.js → global-data-products-4d046f15202a1c8d.js} +1 -1
  212. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks/[...slug]-286133386c97a2b6.js +1 -0
  213. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{global-hooks-e561ae38cf5592e8.js → global-hooks-3da370825153056c.js} +1 -1
  214. mage_ai/server/{frontend_dist/_next/static/chunks/pages/manage/files-449a022f2f0f2d94.js → frontend_dist_base_path_template/_next/static/chunks/pages/manage/files-39b73da5a15590f6.js} +1 -1
  215. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/{settings-60845f0b59142f32.js → settings-666748ff5d101411.js} +1 -1
  216. mage_ai/server/{frontend_dist/_next/static/chunks/pages/manage/users/[user]-9384c5f1efa2ac18.js → frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/[user]-be27631e67dbe070.js} +1 -1
  217. mage_ai/server/{frontend_dist/_next/static/chunks/pages/manage/users/new-abd8571907664fdf.js → frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/new-1932ce64823b372b.js} +1 -1
  218. mage_ai/server/{frontend_dist/_next/static/chunks/pages/manage/users-28a930b148d99766.js → frontend_dist_base_path_template/_next/static/chunks/pages/manage/users-ed509c75cf23f0f5.js} +1 -1
  219. mage_ai/server/{frontend_dist/_next/static/chunks/pages/manage-f83deb790548693b.js → frontend_dist_base_path_template/_next/static/chunks/pages/manage-1feebec1124123fc.js} +1 -1
  220. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{oauth-8bb62c4f6a511c43.js → oauth-e9b8f19c30381c28.js} +1 -1
  221. mage_ai/server/{frontend_dist/_next/static/chunks/pages/overview-f0c40645f385f23f.js → frontend_dist_base_path_template/_next/static/chunks/pages/overview-7b2ba2d5405c05fe.js} +1 -1
  222. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipeline-runs-70fc3351bd11025f.js +1 -0
  223. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-6ee3b88a5bb4ce94.js +1 -0
  224. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-c9cf383bc13ce7b8.js +1 -0
  225. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-571c0962333b92f0.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/dashboard-7bca6f718b939934.js} +1 -1
  226. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-c119f630038b0685.js +1 -0
  227. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/logs-146051325c92d742.js +1 -0
  228. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/{block-runs-ddddcddd2f74b4f6.js → block-runs-15d307e6ba934a56.js} +1 -1
  229. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-4a238307feddb522.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-f6196e563b960e5c.js} +1 -1
  230. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors-e051057d9fe94f23.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors-25dbd73201d99e80.js} +1 -1
  231. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-06e55db757959ef8.js +1 -0
  232. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs-2d20b2cd08907afd.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs-ec3c45cfa027db58.js} +1 -1
  233. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-495e877aa7ed709e.js +1 -0
  234. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/syncs-49adfeed5157d92b.js +1 -0
  235. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-6143e028225390f5.js +1 -0
  236. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers-0886f6320fef7131.js +1 -0
  237. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-e82a763d742cc034.js +1 -0
  238. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/account/profile-50d20fa715d454af.js +1 -0
  239. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-b78b1be5b9ed84b9.js → [...slug]-2bbd63b7e93a8600.js} +1 -1
  240. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{permissions-37b78a436eeab258.js → permissions-4ea156c39608caab.js} +1 -1
  241. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-f3c29ec53ee35795.js +1 -0
  242. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-db05a80d18c168e5.js → [...slug]-64ec8928d2542f3c.js} +1 -1
  243. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{roles-f55c77e4f46c8d33.js → roles-835e6ec2a48ec583.js} +1 -1
  244. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{sync-data-2a1f8737561fdd94.js → sync-data-0769149af025de30.js} +1 -1
  245. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users/{[...slug]-e3bf6e5d8bb250c4.js → [...slug]-612a65c42bcadef0.js} +1 -1
  246. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{users-20f0a050a42a015d.js → users-e3365b4029a8db33.js} +1 -1
  247. mage_ai/server/{frontend_dist/_next/static/chunks/pages/sign-in-99e2748e3c1d57a3.js → frontend_dist_base_path_template/_next/static/chunks/pages/sign-in-f3a33e8f83abdb58.js} +1 -1
  248. mage_ai/server/{frontend_dist/_next/static/chunks/pages/templates/[...slug]-f44ccd1499ffd23a.js → frontend_dist_base_path_template/_next/static/chunks/pages/templates/[...slug]-f264097bf8120f31.js} +1 -1
  249. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{templates-1bfaa1c50e844813.js → templates-406e13cc5c4caab4.js} +1 -1
  250. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{terminal-ed121e305169cf1c.js → terminal-ef8ad878e5e7bb2f.js} +1 -1
  251. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/triggers-a90728798f964700.js +1 -0
  252. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/version-control-0e0c2713a2922be7.js +1 -0
  253. mage_ai/server/frontend_dist_base_path_template/_next/static/gDn6inKdLyj35NvURBSCV/_buildManifest.js +1 -0
  254. mage_ai/server/frontend_dist_base_path_template/block-layout.html +2 -2
  255. mage_ai/server/frontend_dist_base_path_template/compute.html +5 -5
  256. mage_ai/server/frontend_dist_base_path_template/files.html +5 -5
  257. mage_ai/server/frontend_dist_base_path_template/global-data-products/[...slug].html +5 -5
  258. mage_ai/server/frontend_dist_base_path_template/global-data-products.html +5 -5
  259. mage_ai/server/frontend_dist_base_path_template/global-hooks/[...slug].html +5 -5
  260. mage_ai/server/frontend_dist_base_path_template/global-hooks.html +5 -5
  261. mage_ai/server/frontend_dist_base_path_template/index.html +2 -2
  262. mage_ai/server/frontend_dist_base_path_template/manage/files.html +5 -5
  263. mage_ai/server/frontend_dist_base_path_template/manage/settings.html +5 -5
  264. mage_ai/server/frontend_dist_base_path_template/manage/users/[user].html +5 -5
  265. mage_ai/server/frontend_dist_base_path_template/manage/users/new.html +5 -5
  266. mage_ai/server/frontend_dist_base_path_template/manage/users.html +5 -5
  267. mage_ai/server/frontend_dist_base_path_template/manage.html +5 -5
  268. mage_ai/server/frontend_dist_base_path_template/oauth.html +4 -4
  269. mage_ai/server/frontend_dist_base_path_template/overview.html +5 -5
  270. mage_ai/server/frontend_dist_base_path_template/pipeline-runs.html +5 -5
  271. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills/[...slug].html +5 -5
  272. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills.html +5 -5
  273. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/dashboard.html +5 -5
  274. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/edit.html +2 -2
  275. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/logs.html +5 -5
  276. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runs.html +5 -5
  277. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runtime.html +5 -5
  278. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors.html +5 -5
  279. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs/[run].html +5 -5
  280. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs.html +5 -5
  281. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/settings.html +5 -5
  282. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/syncs.html +5 -5
  283. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers/[...slug].html +5 -5
  284. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers.html +5 -5
  285. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline].html +2 -2
  286. mage_ai/server/frontend_dist_base_path_template/pipelines.html +5 -5
  287. mage_ai/server/frontend_dist_base_path_template/settings/account/profile.html +5 -5
  288. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions/[...slug].html +5 -5
  289. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions.html +5 -5
  290. mage_ai/server/frontend_dist_base_path_template/settings/workspace/preferences.html +5 -5
  291. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles/[...slug].html +5 -5
  292. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles.html +5 -5
  293. mage_ai/server/frontend_dist_base_path_template/settings/workspace/sync-data.html +5 -5
  294. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users/[...slug].html +5 -5
  295. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users.html +5 -5
  296. mage_ai/server/frontend_dist_base_path_template/settings.html +2 -2
  297. mage_ai/server/frontend_dist_base_path_template/sign-in.html +20 -20
  298. mage_ai/server/frontend_dist_base_path_template/templates/[...slug].html +5 -5
  299. mage_ai/server/frontend_dist_base_path_template/templates.html +5 -5
  300. mage_ai/server/frontend_dist_base_path_template/terminal.html +5 -5
  301. mage_ai/server/frontend_dist_base_path_template/test.html +5 -5
  302. mage_ai/server/frontend_dist_base_path_template/triggers.html +5 -5
  303. mage_ai/server/frontend_dist_base_path_template/version-control.html +5 -5
  304. mage_ai/server/server.py +11 -3
  305. mage_ai/services/k8s/job_manager.py +1 -0
  306. mage_ai/settings/repo.py +3 -0
  307. mage_ai/shared/files.py +47 -0
  308. mage_ai/shared/models.py +1 -0
  309. mage_ai/streaming/constants.py +1 -0
  310. mage_ai/streaming/sinks/postgres.py +2 -0
  311. mage_ai/streaming/sinks/rabbitmq.py +76 -0
  312. mage_ai/streaming/sinks/sink_factory.py +4 -0
  313. mage_ai/streaming/sources/nats_js.py +12 -1
  314. mage_ai/tests/api/operations/test_operations_with_hooks.py +136 -91
  315. mage_ai/tests/api/policies/test_oauth_policy.py +38 -0
  316. mage_ai/tests/data_preparation/executors/test_block_executor.py +2 -0
  317. mage_ai/tests/data_preparation/models/global_hooks/test_global_hooks.py +33 -8
  318. mage_ai/tests/data_preparation/models/global_hooks/test_hook.py +82 -38
  319. mage_ai/tests/data_preparation/models/global_hooks/test_predicates.py +803 -0
  320. mage_ai/tests/data_preparation/models/global_hooks/test_utils.py +6 -1
  321. mage_ai/tests/data_preparation/models/test_block.py +26 -0
  322. mage_ai/tests/data_preparation/models/test_pipeline.py +15 -0
  323. mage_ai/tests/factory.py +40 -2
  324. mage_ai/tests/orchestration/test_pipeline_scheduler.py +82 -1
  325. mage_ai/tests/services/k8s/test_job_manager.py +16 -0
  326. mage_ai/tests/shared/mixins.py +60 -23
  327. mage_ai/tests/streaming/sinks/test_rabbitmq.py +36 -0
  328. {mage_ai-0.9.46.dist-info → mage_ai-0.9.48.dist-info}/METADATA +7 -4
  329. {mage_ai-0.9.46.dist-info → mage_ai-0.9.48.dist-info}/RECORD +335 -321
  330. {mage_ai-0.9.46.dist-info → mage_ai-0.9.48.dist-info}/WHEEL +1 -1
  331. mage_ai/server/frontend_dist/_next/static/9jB4XPuz6BzxBcG9VNao5/_buildManifest.js +0 -1
  332. mage_ai/server/frontend_dist/_next/static/chunks/1952-ac7722e8b1ab88fe.js +0 -1
  333. mage_ai/server/frontend_dist/_next/static/chunks/3419-f8d518d024e7b5c8.js +0 -1
  334. mage_ai/server/frontend_dist/_next/static/chunks/3943-9e1105393a3be0de.js +0 -1
  335. mage_ai/server/frontend_dist/_next/static/chunks/4267-fd4d8049e83178de.js +0 -1
  336. mage_ai/server/frontend_dist/_next/static/chunks/5810-12eadc488265d55b.js +0 -1
  337. mage_ai/server/frontend_dist/_next/static/chunks/595-0d174b1f9fbfce4f.js +0 -1
  338. mage_ai/server/frontend_dist/_next/static/chunks/600-705fe234320ec5de.js +0 -1
  339. mage_ai/server/frontend_dist/_next/static/chunks/6333-bc1b433b428a9095.js +0 -1
  340. mage_ai/server/frontend_dist/_next/static/chunks/722-a1584445357a276c.js +0 -1
  341. mage_ai/server/frontend_dist/_next/static/chunks/8264-0d582a6ca33c3dfa.js +0 -1
  342. mage_ai/server/frontend_dist/_next/static/chunks/8487-032ef9b17d20aad9.js +0 -1
  343. mage_ai/server/frontend_dist/_next/static/chunks/90-a7308bae028d7001.js +0 -1
  344. mage_ai/server/frontend_dist/_next/static/chunks/9264-1d4f0327d42fed91.js +0 -1
  345. mage_ai/server/frontend_dist/_next/static/chunks/9618-2c5045255ac5a6e7.js +0 -1
  346. mage_ai/server/frontend_dist/_next/static/chunks/9624-334e7db5c84cb4ea.js +0 -1
  347. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-ebef928183f9a3bb.js +0 -1
  348. mage_ai/server/frontend_dist/_next/static/chunks/pages/compute-419775ca1293b354.js +0 -1
  349. mage_ai/server/frontend_dist/_next/static/chunks/pages/files-0f2d4be6fdca86ca.js +0 -1
  350. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-hooks/[...slug]-77edfa32d000e88b.js +0 -1
  351. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipeline-runs-b35d37bfba8fbccc.js +0 -1
  352. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-10e9a2d19541caa2.js +0 -1
  353. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-c8d3a5289ab93f88.js +0 -1
  354. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-ff7e9108502f5716.js +0 -1
  355. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-ef680455ae54ccbe.js +0 -1
  356. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-0691711636fa95c7.js +0 -1
  357. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-2914e326a5f1ffe0.js +0 -1
  358. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-b75bf17498e87354.js +0 -1
  359. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-3a7500e6e53084d3.js +0 -1
  360. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-c0e551d265a8d467.js +0 -1
  361. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-e47db5c3eaf683af.js +0 -1
  362. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/account/profile-55ac955dfa9a5a8d.js +0 -1
  363. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-29c92a9bc54ae5cd.js +0 -1
  364. mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-572d82d6eb7a5d43.js +0 -1
  365. mage_ai/server/frontend_dist/_next/static/chunks/pages/version-control-2d26d80370a2e481.js +0 -1
  366. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1952-ac7722e8b1ab88fe.js +0 -1
  367. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3419-f8d518d024e7b5c8.js +0 -1
  368. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3943-9e1105393a3be0de.js +0 -1
  369. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/4267-fd4d8049e83178de.js +0 -1
  370. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/5810-12eadc488265d55b.js +0 -1
  371. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/595-0d174b1f9fbfce4f.js +0 -1
  372. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/600-705fe234320ec5de.js +0 -1
  373. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/6333-bc1b433b428a9095.js +0 -1
  374. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/722-a1584445357a276c.js +0 -1
  375. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8264-0d582a6ca33c3dfa.js +0 -1
  376. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/8487-032ef9b17d20aad9.js +0 -1
  377. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/90-a7308bae028d7001.js +0 -1
  378. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9264-1d4f0327d42fed91.js +0 -1
  379. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9618-2c5045255ac5a6e7.js +0 -1
  380. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/9624-334e7db5c84cb4ea.js +0 -1
  381. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-ebef928183f9a3bb.js +0 -1
  382. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/compute-419775ca1293b354.js +0 -1
  383. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/files-0f2d4be6fdca86ca.js +0 -1
  384. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks/[...slug]-77edfa32d000e88b.js +0 -1
  385. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipeline-runs-b35d37bfba8fbccc.js +0 -1
  386. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills/[...slug]-10e9a2d19541caa2.js +0 -1
  387. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-c8d3a5289ab93f88.js +0 -1
  388. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-ff7e9108502f5716.js +0 -1
  389. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/logs-ef680455ae54ccbe.js +0 -1
  390. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-0691711636fa95c7.js +0 -1
  391. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-2914e326a5f1ffe0.js +0 -1
  392. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/syncs-b75bf17498e87354.js +0 -1
  393. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers/[...slug]-3a7500e6e53084d3.js +0 -1
  394. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers-c0e551d265a8d467.js +0 -1
  395. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-e47db5c3eaf683af.js +0 -1
  396. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/account/profile-55ac955dfa9a5a8d.js +0 -1
  397. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-29c92a9bc54ae5cd.js +0 -1
  398. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/triggers-572d82d6eb7a5d43.js +0 -1
  399. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/version-control-2d26d80370a2e481.js +0 -1
  400. mage_ai/server/frontend_dist_base_path_template/_next/static/uPDjJYpJMst1q6psbRyte/_buildManifest.js +0 -1
  401. /mage_ai/server/frontend_dist/_next/static/{9jB4XPuz6BzxBcG9VNao5 → xxcdnITr3IkTdETH5ghqw}/_ssgManifest.js +0 -0
  402. /mage_ai/server/frontend_dist_base_path_template/_next/static/{uPDjJYpJMst1q6psbRyte → gDn6inKdLyj35NvURBSCV}/_ssgManifest.js +0 -0
  403. {mage_ai-0.9.46.dist-info → mage_ai-0.9.48.dist-info}/LICENSE +0 -0
  404. {mage_ai-0.9.46.dist-info → mage_ai-0.9.48.dist-info}/entry_points.txt +0 -0
  405. {mage_ai-0.9.46.dist-info → mage_ai-0.9.48.dist-info}/top_level.txt +0 -0
@@ -8,7 +8,9 @@ from mage_ai.data_integrations.sources.constants import SQL_SOURCES
8
8
  from mage_ai.data_integrations.utils.config import build_config, get_batch_fetch_limit
9
9
  from mage_ai.data_preparation.logging.logger import DictLogger
10
10
  from mage_ai.data_preparation.models.block.data_integration.constants import (
11
+ KEY_REPLICATION_METHOD,
11
12
  MAX_QUERY_STRING_SIZE,
13
+ REPLICATION_METHOD_INCREMENTAL,
12
14
  )
13
15
  from mage_ai.data_preparation.models.block.data_integration.utils import (
14
16
  convert_block_output_data_for_destination,
@@ -19,6 +21,7 @@ from mage_ai.data_preparation.models.block.data_integration.utils import (
19
21
  from mage_ai.data_preparation.models.pipelines.integration_pipeline import (
20
22
  IntegrationPipeline,
21
23
  )
24
+ from mage_ai.data_preparation.models.triggers import ScheduleInterval
22
25
  from mage_ai.orchestration.db import db_connection
23
26
  from mage_ai.orchestration.db.models.schedules import BlockRun, PipelineRun
24
27
  from mage_ai.orchestration.metrics.pipeline_run import calculate_metrics
@@ -253,6 +256,7 @@ def build_block_run_metadata(
253
256
  logging_tags: Dict = None,
254
257
  parent_stream: str = None,
255
258
  partition: str = None,
259
+ pipeline_run: PipelineRun = None,
256
260
  selected_streams: List[str] = None,
257
261
  ) -> List[Dict]:
258
262
  block_run_metadata = []
@@ -270,9 +274,11 @@ def build_block_run_metadata(
270
274
 
271
275
  if block.is_source():
272
276
  return __build_block_run_metadata_for_source(
277
+ block,
273
278
  data_integration_settings,
274
279
  logger,
275
280
  logging_tags=logging_tags,
281
+ pipeline_run=pipeline_run,
276
282
  selected_streams=selected_streams,
277
283
  )
278
284
 
@@ -377,9 +383,11 @@ def __build_block_run_metadata_for_destination(
377
383
 
378
384
 
379
385
  def __build_block_run_metadata_for_source(
386
+ block,
380
387
  data_integration_settings: Dict,
381
388
  logger: DictLogger,
382
389
  logging_tags: Dict = None,
390
+ pipeline_run: PipelineRun = None,
383
391
  selected_streams: List[str] = None,
384
392
  ) -> List[Dict]:
385
393
  block_run_metadata = []
@@ -388,20 +396,66 @@ def __build_block_run_metadata_for_source(
388
396
  config = data_integration_settings.get('config')
389
397
  batch_fetch_limit = get_batch_fetch_limit(config)
390
398
 
391
- streams = selected_streams or \
392
- [s.get('tap_stream_id') for s in get_selected_streams(catalog)]
399
+ stream_dicts_by_stream_id = index_by(
400
+ lambda x: x.get('tap_stream_id') or x.get('stream'),
401
+ get_selected_streams(catalog),
402
+ )
403
+
404
+ streams = []
405
+
406
+ if selected_streams:
407
+ streams = selected_streams
408
+ else:
409
+ streams = list(stream_dicts_by_stream_id.keys())
410
+
411
+ at_least_one_incremental = False
412
+
413
+ for stream_id in streams:
414
+ if at_least_one_incremental:
415
+ break
416
+
417
+ stream_dict = stream_dicts_by_stream_id.get(stream_id)
418
+ if not stream_dict:
419
+ continue
420
+
421
+ if REPLICATION_METHOD_INCREMENTAL == stream_dict.get(KEY_REPLICATION_METHOD):
422
+ at_least_one_incremental = True
423
+ break
424
+
425
+ execution_partition_previous = None
426
+
427
+ if at_least_one_incremental and pipeline_run:
428
+ pipeline_runs_completed = \
429
+ PipelineRun.recently_completed_pipeline_runs(
430
+ pipeline_run.pipeline_uuid,
431
+ pipeline_run_id=pipeline_run.id,
432
+ pipeline_schedule_id=(
433
+ None if
434
+ ScheduleInterval.ONCE == pipeline_run.pipeline_schedule.schedule_interval else
435
+ pipeline_run.pipeline_schedule_id
436
+ ),
437
+ sample_size=1,
438
+ )
439
+
440
+ if pipeline_runs_completed:
441
+ execution_partition_previous = pipeline_runs_completed[0].execution_partition
442
+
393
443
  data_integration_uuid = data_integration_settings.get('data_integration_uuid')
394
444
 
395
445
  is_sql_source = data_integration_uuid in SQL_SOURCES_UUID
396
446
  record_counts_by_stream = {}
397
447
  if is_sql_source:
448
+
398
449
  record_counts_by_stream = index_by(
399
450
  lambda x: x['id'],
400
451
  count_records(
401
452
  config,
402
453
  data_integration_uuid,
403
454
  streams,
455
+ block=block,
404
456
  catalog=catalog,
457
+ partition=execution_partition_previous,
458
+ variables=pipeline_run.variables if pipeline_run else None,
405
459
  ),
406
460
  )
407
461
 
@@ -432,6 +486,7 @@ def __build_block_run_metadata_for_source(
432
486
 
433
487
  for idx in range(number_of_batches):
434
488
  block_run_metadata.append(dict(
489
+ execution_partition_previous=execution_partition_previous,
435
490
  index=idx,
436
491
  number_of_batches=number_of_batches,
437
492
  stream=tap_stream_id,
@@ -84,6 +84,8 @@ class BlockExecutor:
84
84
  self,
85
85
  analyze_outputs: bool = False,
86
86
  block_run_id: int = None,
87
+ block_run_outputs_cache: Dict[str, List] = None,
88
+ cache_block_output_in_memory: bool = False,
87
89
  callback_url: Union[str, None] = None,
88
90
  global_vars: Union[Dict, None] = None,
89
91
  input_from_output: Union[Dict, None] = None,
@@ -105,6 +107,10 @@ class BlockExecutor:
105
107
  Args:
106
108
  analyze_outputs: Whether to analyze the outputs of the block.
107
109
  block_run_id: The ID of the block run.
110
+ block_run_outputs_cache: block uuid to block outputs mapping. It's used when
111
+ cache_block_output_in_memory is set to True.
112
+ cache_block_output_in_memory: Whether to cache the block output in memory. By default,
113
+ the block output is persisted on disk.
108
114
  callback_url: The URL for the callback.
109
115
  global_vars: Global variables for the block execution.
110
116
  input_from_output: Input from the output of a previous block.
@@ -512,6 +518,8 @@ class BlockExecutor:
512
518
  return self._execute(
513
519
  analyze_outputs=analyze_outputs,
514
520
  block_run_id=block_run_id,
521
+ block_run_outputs_cache=block_run_outputs_cache,
522
+ cache_block_output_in_memory=cache_block_output_in_memory,
515
523
  callback_url=callback_url,
516
524
  global_vars=global_vars,
517
525
  update_status=update_status,
@@ -620,6 +628,8 @@ class BlockExecutor:
620
628
  self,
621
629
  analyze_outputs: bool = False,
622
630
  block_run_id: int = None,
631
+ block_run_outputs_cache: Dict[str, List] = None,
632
+ cache_block_output_in_memory: bool = False,
623
633
  callback_url: Union[str, None] = None,
624
634
  global_vars: Union[Dict, None] = None,
625
635
  update_status: bool = False,
@@ -640,7 +650,11 @@ class BlockExecutor:
640
650
 
641
651
  Args:
642
652
  analyze_outputs: Whether to analyze the outputs of the block.
653
+ block_run_outputs_cache: block uuid to block outputs mapping. It's used when
654
+ cache_block_output_in_memory is set to True.
643
655
  callback_url: The URL for the callback.
656
+ cache_block_output_in_memory: Whether to cache the block output in memory. By default,
657
+ the block output is persisted on disk.
644
658
  global_vars: Global variables for the block execution.
645
659
  update_status: Whether to update the status of the block execution.
646
660
  input_from_output: Input from the output of a previous block.
@@ -659,7 +673,10 @@ class BlockExecutor:
659
673
  logging_tags = dict()
660
674
 
661
675
  extra_options = {}
662
- store_variables = True
676
+ if cache_block_output_in_memory:
677
+ store_variables = False
678
+ else:
679
+ store_variables = True
663
680
  is_data_integration = False
664
681
 
665
682
  if self.project.is_feature_enabled(FeatureUUID.DATA_INTEGRATION_IN_BATCH_PIPELINE):
@@ -735,6 +752,14 @@ class BlockExecutor:
735
752
  except Exception as err:
736
753
  print(f'[WARNING] BlockExecutor._execute: {err}')
737
754
 
755
+ is_source = self.block.is_source()
756
+ if is_source and data_integration_metadata:
757
+ execution_partition_previous = data_integration_metadata.get(
758
+ 'execution_partition_previous',
759
+ )
760
+ if execution_partition_previous:
761
+ extra_options['execution_partition_previous'] = execution_partition_previous
762
+
738
763
  if di_settings and \
739
764
  data_integration_metadata and \
740
765
  data_integration_metadata.get('controller') and \
@@ -746,7 +771,6 @@ class BlockExecutor:
746
771
  if is_data_integration:
747
772
  arr = []
748
773
 
749
- is_source = self.block.is_source()
750
774
  data_integration_uuid = di_settings.get('data_integration_uuid')
751
775
  catalog = di_settings.get('catalog', [])
752
776
 
@@ -770,6 +794,7 @@ class BlockExecutor:
770
794
  logging_tags=logging_tags,
771
795
  parent_stream=data_integration_metadata.get('parent_stream'),
772
796
  partition=self.execution_partition,
797
+ pipeline_run=pipeline_run,
773
798
  selected_streams=[stream],
774
799
  )
775
800
  for br_metadata in block_run_metadata:
@@ -949,6 +974,7 @@ class BlockExecutor:
949
974
 
950
975
  result = self.block.execute_sync(
951
976
  analyze_outputs=analyze_outputs,
977
+ block_run_outputs_cache=block_run_outputs_cache,
952
978
  execution_partition=self.execution_partition,
953
979
  global_vars=global_vars,
954
980
  logger=self.logger,
@@ -971,6 +997,7 @@ class BlockExecutor:
971
997
  global_vars=global_vars,
972
998
  logger=self.logger,
973
999
  logging_tags=logging_tags,
1000
+ outputs=result if cache_block_output_in_memory else None,
974
1001
  )
975
1002
  elif PipelineType.INTEGRATION != self.pipeline.type and \
976
1003
  (not is_data_integration or BlockLanguage.PYTHON == self.block.language):
@@ -979,6 +1006,7 @@ class BlockExecutor:
979
1006
  global_vars=global_vars,
980
1007
  logger=self.logger,
981
1008
  logging_tags=logging_tags,
1009
+ outputs=result if cache_block_output_in_memory else None,
982
1010
  update_tests=False,
983
1011
  dynamic_block_uuid=dynamic_block_uuid,
984
1012
  )
@@ -89,7 +89,10 @@ class PipelineExecutor:
89
89
  if global_vars is None:
90
90
  global_vars = dict()
91
91
 
92
- def create_block_task(block_run: BlockRun) -> asyncio.Task:
92
+ def create_block_task(
93
+ block_run: BlockRun,
94
+ block_run_outputs_cache: Dict[str, List],
95
+ ) -> asyncio.Task:
93
96
  async def execute_block() -> None:
94
97
  executor_kwargs = dict(
95
98
  pipeline=self.pipeline,
@@ -102,22 +105,34 @@ class PipelineExecutor:
102
105
  block_run_data['started_at'] = datetime.now(tz=pytz.UTC)
103
106
 
104
107
  block_run.update(**block_run_data)
105
- BlockExecutor(**executor_kwargs).execute(
108
+ return BlockExecutor(**executor_kwargs).execute(
106
109
  block_run_id=block_run.id,
110
+ block_run_outputs_cache=block_run_outputs_cache,
111
+ cache_block_output_in_memory=self.pipeline.cache_block_output_in_memory,
107
112
  global_vars=global_vars,
108
113
  pipeline_run_id=pipeline_run.id,
109
114
  )
110
115
 
111
116
  return asyncio.create_task(execute_block())
112
117
 
118
+ block_run_outputs_cache = dict()
119
+
113
120
  while not pipeline_run.all_blocks_completed(allow_blocks_to_fail):
121
+ # Update the statuses of the block runs to CONDITION_FAILED or UPSTREAM_FAILED.
122
+ pipeline_run.update_block_run_statuses(pipeline_run.initial_block_runs)
114
123
  executable_block_runs = pipeline_run.executable_block_runs(
115
124
  allow_blocks_to_fail=allow_blocks_to_fail,
116
125
  )
117
126
  if not executable_block_runs:
118
127
  return
119
- block_run_tasks = [create_block_task(b) for b in executable_block_runs]
120
- await asyncio.gather(*block_run_tasks)
128
+ block_run_tasks = [
129
+ create_block_task(b, block_run_outputs_cache=block_run_outputs_cache)
130
+ for b in executable_block_runs]
131
+ block_run_outputs = await asyncio.gather(*block_run_tasks)
132
+ if self.pipeline.cache_block_output_in_memory:
133
+ for idx, block_run in enumerate(executable_block_runs):
134
+ block_run_outputs_cache[block_run.block_uuid] = \
135
+ block_run_outputs[idx].get('output', [])
121
136
 
122
137
  def build_tags(self, **kwargs):
123
138
  default_tags = dict(
@@ -23,6 +23,7 @@ from jinja2 import Template
23
23
  import mage_ai.data_preparation.decorators
24
24
  from mage_ai.cache.block import BlockCache
25
25
  from mage_ai.data_cleaner.shared.utils import is_geo_dataframe, is_spark_dataframe
26
+ from mage_ai.data_integrations.sources.constants import SQL_SOURCES_MAPPING
26
27
  from mage_ai.data_preparation.logging.logger import DictLogger
27
28
  from mage_ai.data_preparation.logging.logger_manager_factory import LoggerManagerFactory
28
29
  from mage_ai.data_preparation.models.block.data_integration.mixins import (
@@ -466,11 +467,14 @@ class Block(DataIntegrationMixin, SparkBlock):
466
467
  uuid = settings.get('source') or settings.get('destination')
467
468
  mapping = grouped_templates.get(uuid) or {}
468
469
 
470
+ di_metadata = merge_dict(
471
+ extract(mapping or {}, ['name']),
472
+ settings,
473
+ )
474
+ di_metadata['sql'] = uuid in SQL_SOURCES_MAPPING
475
+
469
476
  return dict(
470
- data_integration=merge_dict(
471
- extract(mapping or {}, ['name']),
472
- settings,
473
- ),
477
+ data_integration=di_metadata,
474
478
  )
475
479
  elif BlockLanguage.PYTHON == self.language:
476
480
  try:
@@ -482,15 +486,18 @@ class Block(DataIntegrationMixin, SparkBlock):
482
486
  uuid = di_settings.get('data_integration_uuid')
483
487
  mapping = grouped_templates.get(uuid) or {}
484
488
 
489
+ di_metadata = merge_dict(
490
+ extract(mapping or {}, ['name']),
491
+ ignore_keys(di_settings or {}, [
492
+ 'catalog',
493
+ 'config',
494
+ 'data_integration_uuid',
495
+ ]),
496
+ )
497
+ di_metadata['sql'] = uuid in SQL_SOURCES_MAPPING
498
+
485
499
  return dict(
486
- data_integration=merge_dict(
487
- extract(mapping or {}, ['name']),
488
- ignore_keys(di_settings or {}, [
489
- 'catalog',
490
- 'config',
491
- 'data_integration_uuid',
492
- ]),
493
- ),
500
+ data_integration=di_metadata,
494
501
  )
495
502
  except Exception as err:
496
503
  if is_debug():
@@ -971,6 +978,7 @@ class Block(DataIntegrationMixin, SparkBlock):
971
978
  def execute_sync(
972
979
  self,
973
980
  analyze_outputs: bool = False,
981
+ block_run_outputs_cache: Dict[str, List] = None,
974
982
  build_block_output_stdout: Callable[..., object] = None,
975
983
  custom_code: str = None,
976
984
  execution_partition: str = None,
@@ -991,6 +999,7 @@ class Block(DataIntegrationMixin, SparkBlock):
991
999
  output_messages_to_logs: bool = False,
992
1000
  disable_json_serialization: bool = False,
993
1001
  data_integration_runtime_settings: Dict = None,
1002
+ execution_partition_previous: str = None,
994
1003
  **kwargs,
995
1004
  ) -> Dict:
996
1005
  if logging_tags is None:
@@ -1031,6 +1040,7 @@ class Block(DataIntegrationMixin, SparkBlock):
1031
1040
  )
1032
1041
 
1033
1042
  output = self.execute_block(
1043
+ block_run_outputs_cache=block_run_outputs_cache,
1034
1044
  build_block_output_stdout=build_block_output_stdout,
1035
1045
  custom_code=custom_code,
1036
1046
  execution_partition=execution_partition,
@@ -1044,6 +1054,7 @@ class Block(DataIntegrationMixin, SparkBlock):
1044
1054
  dynamic_upstream_block_uuids=dynamic_upstream_block_uuids,
1045
1055
  run_settings=run_settings,
1046
1056
  data_integration_runtime_settings=data_integration_runtime_settings,
1057
+ execution_partition_previous=execution_partition_previous,
1047
1058
  **kwargs,
1048
1059
  )
1049
1060
 
@@ -1209,6 +1220,7 @@ class Block(DataIntegrationMixin, SparkBlock):
1209
1220
 
1210
1221
  def execute_block(
1211
1222
  self,
1223
+ block_run_outputs_cache: Dict[str, List] = None,
1212
1224
  build_block_output_stdout: Callable[..., object] = None,
1213
1225
  custom_code: str = None,
1214
1226
  execution_partition: str = None,
@@ -1223,6 +1235,7 @@ class Block(DataIntegrationMixin, SparkBlock):
1223
1235
  dynamic_upstream_block_uuids: List[str] = None,
1224
1236
  run_settings: Dict = None,
1225
1237
  data_integration_runtime_settings: str = None,
1238
+ execution_partition_previous: str = None,
1226
1239
  **kwargs,
1227
1240
  ) -> Dict:
1228
1241
  if logging_tags is None:
@@ -1262,11 +1275,12 @@ class Block(DataIntegrationMixin, SparkBlock):
1262
1275
  else:
1263
1276
  input_vars, kwargs_vars, upstream_block_uuids = self.fetch_input_variables(
1264
1277
  input_args,
1265
- execution_partition,
1266
- global_vars,
1278
+ block_run_outputs_cache=block_run_outputs_cache,
1267
1279
  dynamic_block_index=dynamic_block_index,
1268
1280
  dynamic_upstream_block_uuids=dynamic_upstream_block_uuids,
1281
+ execution_partition=execution_partition,
1269
1282
  from_notebook=from_notebook,
1283
+ global_vars=global_vars,
1270
1284
  )
1271
1285
 
1272
1286
  outputs_from_input_vars = {}
@@ -1301,6 +1315,7 @@ class Block(DataIntegrationMixin, SparkBlock):
1301
1315
  upstream_block_uuids=upstream_block_uuids,
1302
1316
  run_settings=run_settings,
1303
1317
  data_integration_runtime_settings=data_integration_runtime_settings,
1318
+ execution_partition_previous=execution_partition_previous,
1304
1319
  **kwargs,
1305
1320
  )
1306
1321
 
@@ -1356,6 +1371,7 @@ class Block(DataIntegrationMixin, SparkBlock):
1356
1371
  upstream_block_uuids: List[str] = None,
1357
1372
  run_settings: Dict = None,
1358
1373
  data_integration_runtime_settings: str = None,
1374
+ execution_partition_previous: str = None,
1359
1375
  **kwargs,
1360
1376
  ) -> List:
1361
1377
  if logging_tags is None:
@@ -1379,6 +1395,7 @@ class Block(DataIntegrationMixin, SparkBlock):
1379
1395
  dynamic_block_index=dynamic_block_index,
1380
1396
  dynamic_upstream_block_uuids=dynamic_upstream_block_uuids,
1381
1397
  execution_partition=execution_partition,
1398
+ execution_partition_previous=execution_partition_previous,
1382
1399
  from_notebook=from_notebook,
1383
1400
  global_vars=global_vars,
1384
1401
  input_vars=input_vars,
@@ -1522,24 +1539,48 @@ class Block(DataIntegrationMixin, SparkBlock):
1522
1539
  def fetch_input_variables(
1523
1540
  self,
1524
1541
  input_args,
1525
- execution_partition: str = None,
1526
- global_vars: Dict = None,
1542
+ block_run_outputs_cache: Dict[str, List] = None,
1543
+ data_integration_settings_mapping: Dict = None,
1527
1544
  dynamic_block_index: int = None,
1528
1545
  dynamic_upstream_block_uuids: List[str] = None,
1546
+ execution_partition: str = None,
1529
1547
  from_notebook: bool = False,
1548
+ global_vars: Dict = None,
1530
1549
  upstream_block_uuids: List[str] = None,
1531
- data_integration_settings_mapping: Dict = None,
1532
1550
  ) -> Tuple[List, List, List]:
1551
+ """
1552
+ Fetch input variables for the current block's execution.
1553
+
1554
+ Args:
1555
+ input_args: The input arguments required for the block's execution.
1556
+ block_run_outputs_cache (Optional[Dict[str, List]]): A dictionary mapping block run
1557
+ UUIDs to their outputs.
1558
+ data_integration_settings_mapping (Optional[Dict]): A dictionary containing data
1559
+ integration settings.
1560
+ dynamic_block_index (Optional[int]): The index of the dynamic block, if applicable.
1561
+ dynamic_upstream_block_uuids (Optional[List[str]]): The UUIDs of the dynamic upstream
1562
+ blocks.
1563
+ execution_partition (Optional[str]): The execution partition for the block.
1564
+ from_notebook (Optional[bool]): A boolean indicating whether the execution is
1565
+ triggered from a notebook.
1566
+ global_vars (Optional[Dict]): A dictionary containing global variables.
1567
+ upstream_block_uuids (Optional[List[str]]): List of UUIDs of upstream blocks.
1568
+
1569
+ Returns:
1570
+ Tuple[List, List, List]: A tuple containing the input variables, kwargs variables, and
1571
+ upstream block UUIDs.
1572
+ """
1533
1573
  variables = fetch_input_variables(
1534
1574
  self.pipeline,
1535
1575
  upstream_block_uuids or self.upstream_block_uuids,
1536
1576
  input_args,
1537
- execution_partition,
1538
- global_vars,
1539
- dynamic_block_index,
1540
- dynamic_upstream_block_uuids,
1541
- from_notebook=from_notebook,
1577
+ block_run_outputs_cache=block_run_outputs_cache,
1542
1578
  data_integration_settings_mapping=data_integration_settings_mapping,
1579
+ dynamic_block_index=dynamic_block_index,
1580
+ dynamic_upstream_block_uuids=dynamic_upstream_block_uuids,
1581
+ execution_partition=execution_partition,
1582
+ from_notebook=from_notebook,
1583
+ global_vars=global_vars,
1543
1584
  )
1544
1585
 
1545
1586
  return variables
@@ -2279,6 +2320,7 @@ df = get_variable('{self.pipeline.uuid}', '{block_uuid}', 'df')
2279
2320
  global_vars: Dict = None,
2280
2321
  logger: Logger = None,
2281
2322
  logging_tags: Dict = None,
2323
+ outputs: List[Any] = None,
2282
2324
  update_tests: bool = True,
2283
2325
  dynamic_block_uuid: str = None,
2284
2326
  ) -> None:
@@ -2308,12 +2350,13 @@ df = get_variable('{self.pipeline.uuid}', '{block_uuid}', 'df')
2308
2350
  else:
2309
2351
  test_functions = self.test_functions
2310
2352
 
2311
- outputs = self.get_raw_outputs(
2312
- dynamic_block_uuid or self.uuid,
2313
- execution_partition=execution_partition,
2314
- from_notebook=from_notebook,
2315
- global_vars=global_vars,
2316
- )
2353
+ if outputs is None:
2354
+ outputs = self.get_raw_outputs(
2355
+ dynamic_block_uuid or self.uuid,
2356
+ execution_partition=execution_partition,
2357
+ from_notebook=from_notebook,
2358
+ global_vars=global_vars,
2359
+ )
2317
2360
 
2318
2361
  if logger and 'logger' not in global_vars:
2319
2362
  global_vars['logger'] = logger
@@ -3082,8 +3125,8 @@ class ConditionalBlock(AddonBlock):
3082
3125
  if parent_block is not None:
3083
3126
  input_vars, kwargs_vars, _ = parent_block.fetch_input_variables(
3084
3127
  None,
3085
- execution_partition,
3086
- global_vars,
3128
+ execution_partition=execution_partition,
3129
+ global_vars=global_vars,
3087
3130
  dynamic_block_index=dynamic_block_index,
3088
3131
  dynamic_upstream_block_uuids=dynamic_upstream_block_uuids,
3089
3132
  )
@@ -3158,11 +3201,11 @@ class CallbackBlock(AddonBlock):
3158
3201
  # Fetch input variables
3159
3202
  input_vars, kwargs_vars, upstream_block_uuids = self.fetch_input_variables(
3160
3203
  None,
3161
- execution_partition,
3162
- global_vars,
3163
3204
  dynamic_block_index=dynamic_block_index,
3164
3205
  dynamic_upstream_block_uuids=dynamic_upstream_block_uuids,
3206
+ execution_partition=execution_partition,
3165
3207
  from_notebook=from_notebook,
3208
+ global_vars=global_vars,
3166
3209
  upstream_block_uuids=[parent_block.uuid] if parent_block else None,
3167
3210
  )
3168
3211
 
@@ -50,6 +50,7 @@ EXECUTION_PARTITION_FROM_NOTEBOOK = '_from_notebook'
50
50
 
51
51
  OUTPUT_TYPE_RECORD = 'RECORD'
52
52
  OUTPUT_TYPE_SCHEMA = 'SCHEMA'
53
+ OUTPUT_TYPE_STATE = 'STATE'
53
54
  TYPE_OBJECT = 'object'
54
55
 
55
56
  KEY_BOOKMARK_PROPERTIES = 'bookmark_properties'
@@ -77,6 +78,8 @@ REPLICATION_METHOD_LOG_BASED = 'LOG_BASED'
77
78
  MB_1 = 1024 * 1000
78
79
  MAX_QUERY_STRING_SIZE = 10 * MB_1
79
80
 
81
+ VARIABLE_BOOKMARK_VALUES_KEY = '__bookmark_values__'
82
+
80
83
 
81
84
  class IngestMode(str, Enum):
82
85
  DISK = 'disk'
@@ -453,13 +453,13 @@ class DataIntegrationMixin:
453
453
  # Get the output as inputs for this block
454
454
  input_vars_fetched, kwargs_vars, up_block_uuids = self.fetch_input_variables(
455
455
  input_vars,
456
- execution_partition,
457
- global_vars,
456
+ data_integration_settings_mapping=data_integration_settings_mapping,
458
457
  dynamic_block_index=dynamic_block_index,
459
458
  dynamic_upstream_block_uuids=dynamic_upstream_block_uuids,
459
+ execution_partition=execution_partition,
460
460
  from_notebook=from_notebook,
461
+ global_vars=global_vars,
461
462
  upstream_block_uuids=block_uuids_to_fetch,
462
- data_integration_settings_mapping=data_integration_settings_mapping,
463
463
  )
464
464
 
465
465
  if block_uuids_to_fetch and is_debug():
@@ -515,13 +515,13 @@ class DataIntegrationMixin:
515
515
  kwargs_vars_inner, \
516
516
  _up_block_uuids = self.fetch_input_variables(
517
517
  None,
518
- execution_partition,
519
- global_vars,
518
+ data_integration_settings_mapping=data_integration_settings_mapping,
520
519
  dynamic_block_index=dynamic_block_index,
521
520
  dynamic_upstream_block_uuids=dynamic_upstream_block_uuids,
521
+ execution_partition=execution_partition,
522
522
  from_notebook=from_notebook,
523
+ global_vars=global_vars,
523
524
  upstream_block_uuids=[up_uuid],
524
- data_integration_settings_mapping=data_integration_settings_mapping,
525
525
  )
526
526
 
527
527
  if input_vars_inner: