mage-ai 0.9.74__py3-none-any.whl → 0.9.79__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.
Files changed (420) hide show
  1. mage_ai/ai/llm_pipeline_wizard.py +6 -4
  2. mage_ai/ai/openai_client.py +7 -5
  3. mage_ai/api/policies/PipelineSchedulePolicy.py +1 -0
  4. mage_ai/api/presenters/PipelineSchedulePresenter.py +11 -2
  5. mage_ai/api/resources/GitFileResource.py +8 -0
  6. mage_ai/api/resources/PipelineScheduleResource.py +20 -14
  7. mage_ai/api/resources/PipelineTriggerResource.py +3 -1
  8. mage_ai/api/resources/SessionResource.py +2 -2
  9. mage_ai/api/resources/SyncResource.py +1 -1
  10. mage_ai/api/resources/UserResource.py +1 -1
  11. mage_ai/cli/main.py +8 -1
  12. mage_ai/data_cleaner/analysis/charts.py +1 -1
  13. mage_ai/data_cleaner/cleaning_rules/reformat_values.py +1 -1
  14. mage_ai/data_integrations/destinations/constants.py +3 -0
  15. mage_ai/data_integrations/sources/constants.py +2 -0
  16. mage_ai/data_preparation/executors/block_executor.py +8 -3
  17. mage_ai/data_preparation/executors/pipeline_executor.py +35 -19
  18. mage_ai/data_preparation/git/utils.py +2 -2
  19. mage_ai/data_preparation/logging/logger_manager.py +31 -2
  20. mage_ai/data_preparation/models/block/__init__.py +33 -27
  21. mage_ai/data_preparation/models/block/dbt/dbt_adapter.py +20 -8
  22. mage_ai/data_preparation/models/block/dynamic/constants.py +0 -1
  23. mage_ai/data_preparation/models/block/dynamic/counter.py +1 -3
  24. mage_ai/data_preparation/models/block/outputs.py +7 -1
  25. mage_ai/data_preparation/models/block/r/__init__.py +16 -5
  26. mage_ai/data_preparation/models/block/sql/__init__.py +2 -0
  27. mage_ai/data_preparation/models/block/sql/mssql.py +8 -0
  28. mage_ai/data_preparation/models/block/sql/utils/shared.py +6 -2
  29. mage_ai/data_preparation/models/constants.py +4 -1
  30. mage_ai/data_preparation/models/pipeline.py +11 -2
  31. mage_ai/data_preparation/models/project/__init__.py +3 -1
  32. mage_ai/data_preparation/models/triggers/__init__.py +1 -1
  33. mage_ai/data_preparation/storage/local_storage.py +4 -1
  34. mage_ai/data_preparation/templates/constants.py +7 -0
  35. mage_ai/data_preparation/templates/data_exporters/streaming/elasticsearch.yaml +3 -0
  36. mage_ai/data_preparation/templates/data_loaders/airtable.py +28 -0
  37. mage_ai/data_preparation/templates/data_loaders/streaming/nats.yaml +6 -3
  38. mage_ai/data_preparation/templates/repo/io_config.yaml +2 -0
  39. mage_ai/io/airtable.py +104 -0
  40. mage_ai/io/base.py +30 -1
  41. mage_ai/io/bigquery.py +36 -0
  42. mage_ai/io/config.py +6 -0
  43. mage_ai/io/mssql.py +21 -9
  44. mage_ai/io/mysql.py +6 -1
  45. mage_ai/io/oracledb.py +2 -4
  46. mage_ai/io/postgres.py +41 -19
  47. mage_ai/io/qdrant.py +1 -1
  48. mage_ai/io/redshift.py +13 -0
  49. mage_ai/io/sql.py +1 -0
  50. mage_ai/io/utils.py +18 -0
  51. mage_ai/orchestration/db/__init__.py +23 -3
  52. mage_ai/orchestration/db/migrations/versions/39d36f1dab73_create_genericjob.py +47 -0
  53. mage_ai/orchestration/db/models/oauth.py +2 -1
  54. mage_ai/orchestration/db/models/schedules.py +108 -6
  55. mage_ai/orchestration/db/models/schedules_project_platform.py +1 -1
  56. mage_ai/orchestration/db/models/secrets.py +11 -1
  57. mage_ai/orchestration/job_manager.py +19 -0
  58. mage_ai/orchestration/metrics/pipeline_run.py +1 -1
  59. mage_ai/orchestration/notification/sender.py +2 -2
  60. mage_ai/orchestration/pipeline_scheduler_original.py +150 -6
  61. mage_ai/orchestration/pipeline_scheduler_project_platform.py +4 -5
  62. mage_ai/orchestration/queue/config.py +11 -1
  63. mage_ai/orchestration/queue/process_queue.py +4 -0
  64. mage_ai/orchestration/utils/distributed_lock.py +8 -1
  65. mage_ai/orchestration/utils/resources.py +56 -2
  66. mage_ai/sample_datasets/salary_survey.csv +52 -52
  67. mage_ai/server/api/base.py +41 -0
  68. mage_ai/server/api/constants.py +1 -0
  69. mage_ai/server/api/triggers.py +9 -0
  70. mage_ai/server/constants.py +1 -1
  71. mage_ai/server/frontend_dist/404.html +3 -3
  72. mage_ai/server/frontend_dist/_next/static/TUo4RceCdMufBTBTq8CAq/_buildManifest.js +1 -0
  73. mage_ai/server/frontend_dist/_next/static/chunks/{1187-839336d276186105.js → 1187-4560c3895e1d7099.js} +1 -1
  74. mage_ai/server/frontend_dist/_next/static/chunks/{1598-0adca9dce3ba4c60.js → 1598-cbf3f5a6078fc3f5.js} +1 -1
  75. mage_ai/server/frontend_dist/_next/static/chunks/2717-638a944d24d5abde.js +1 -0
  76. mage_ai/server/frontend_dist/_next/static/chunks/3548-36f746b1824004f2.js +1 -0
  77. mage_ai/server/frontend_dist/_next/static/chunks/{3763-39a5174f6a3924db.js → 3763-aabe2703076636b0.js} +1 -1
  78. mage_ai/server/frontend_dist/_next/static/chunks/3782-3e2acb5ed45b582b.js +1 -0
  79. mage_ai/server/frontend_dist/_next/static/chunks/449-5e2253c6aba42557.js +1 -0
  80. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/5627-d5e559859dd0e1e0.js → frontend_dist/_next/static/chunks/5627-10e76bafa5a26f5f.js} +1 -1
  81. mage_ai/server/frontend_dist/_next/static/chunks/{5699-e49718dfc9eb2854.js → 5699-e99379e332bd0b41.js} +1 -1
  82. mage_ai/server/frontend_dist/_next/static/chunks/{7966-163da2621b8c987c.js → 7966-a5a7db345ce81263.js} +1 -1
  83. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-b697b35dfc4e6e26.js +2 -0
  84. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/compute-ed67fa8e81662e8b.js → frontend_dist/_next/static/chunks/pages/compute-9e2dea78024e3bb4.js} +1 -1
  85. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/files-e0ecd7ced09a63b2.js → frontend_dist/_next/static/chunks/pages/files-e08c7fe76f968f9c.js} +1 -1
  86. mage_ai/server/frontend_dist/_next/static/chunks/pages/global-data-products/{[...slug]-c7a729477ecda50e.js → [...slug]-30c3807057a4e65b.js} +1 -1
  87. mage_ai/server/frontend_dist/_next/static/chunks/pages/{global-data-products-fd6ae6a358a60a0c.js → global-data-products-8dcb3b31af9e0e39.js} +1 -1
  88. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks/[...slug]-8e50243797a7fe59.js → frontend_dist/_next/static/chunks/pages/global-hooks/[...slug]-85a64b64d27214b6.js} +1 -1
  89. mage_ai/server/frontend_dist/_next/static/chunks/pages/{global-hooks-d0c003446332dc0d.js → global-hooks-4ff959d51b8a9502.js} +1 -1
  90. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/{files-a69ed8e9f814490c.js → files-d08a460641d0efaa.js} +1 -1
  91. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/{overview-1aad7093c6d39257.js → overview-aae747f487e08d51.js} +1 -1
  92. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/{pipeline-runs-528d30e0d13b0cc7.js → pipeline-runs-09a842d64a6ada62.js} +1 -1
  93. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/{settings-fb9201d9cf63031d.js → settings-2e98e57d9376a458.js} +1 -1
  94. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users/{[user]-000f5a980a07da39.js → [user]-7be6e41ad66089bb.js} +1 -1
  95. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/new-e4e613f6e817a733.js → frontend_dist/_next/static/chunks/pages/manage/users/new-4c088833063bfa07.js} +1 -1
  96. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users-5db54821a3059c69.js +1 -0
  97. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/manage-34d718b8a4066c23.js → frontend_dist/_next/static/chunks/pages/manage-868fcd8cbeb265f0.js} +1 -1
  98. mage_ai/server/frontend_dist/_next/static/chunks/pages/{oauth-3bfd1b8d7f036726.js → oauth-6ceceb62191dfe8a.js} +1 -1
  99. mage_ai/server/frontend_dist/_next/static/chunks/pages/overview-f65416f6dbe30ad3.js +1 -0
  100. mage_ai/server/frontend_dist/_next/static/chunks/pages/{pipeline-runs-5f8c100e648efa8a.js → pipeline-runs-2d0136b51b57de93.js} +1 -1
  101. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills/{[...slug]-688c652f3296bb9c.js → [...slug]-1ad5238742e25b4c.js} +1 -1
  102. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-bd11e87d026bfbf9.js +1 -0
  103. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{dashboard-1236e36d39b1637d.js → dashboard-0f4f47f721b0723f.js} +1 -1
  104. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-5ae8efe9e0530212.js +1 -0
  105. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-fe91dfb0091f6bc6.js +1 -0
  106. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-0d68d4bf6290fefb.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-cf794b2d22a80f31.js} +1 -1
  107. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-9254358d58f07714.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-a964caef91bed9e1.js} +1 -1
  108. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/{monitors-821001e690caebe2.js → monitors-80bebb4401eefe25.js} +1 -1
  109. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-2eae7cb017027682.js +1 -0
  110. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs-2d4b2a0800a66b33.js → frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs-776b2e5b0b6ceba8.js} +1 -1
  111. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-03d9bca3bc5e6088.js +1 -0
  112. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-707ed8ca942ca802.js +1 -0
  113. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers/{[...slug]-259143ed3cf59e31.js → [...slug]-8429f17d4146e1ec.js} +1 -1
  114. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-193045d9836d8d80.js +1 -0
  115. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-d25d07db166cbb04.js +1 -0
  116. mage_ai/server/frontend_dist/_next/static/chunks/pages/platform/global-hooks/{[...slug]-5eeec927e4202b63.js → [...slug]-6834ae87bd668cb2.js} +1 -1
  117. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/platform/global-hooks-fbe9ad995d46d837.js → frontend_dist/_next/static/chunks/pages/platform/global-hooks-b3f7309a23e592b2.js} +1 -1
  118. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/account/{profile-fc659962d4015cb3.js → profile-f8b7374385e1f1bf.js} +1 -1
  119. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/preferences-8de68502a9afa299.js +1 -0
  120. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/settings-a4f88c334414402b.js → frontend_dist/_next/static/chunks/pages/settings/platform/settings-50fb6a34f3913f1f.js} +1 -1
  121. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-4deb9579ef99a3c6.js → [...slug]-2e5c098c21ea32b7.js} +1 -1
  122. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{permissions-e0cda2f2bfce8d61.js → permissions-54e4b15b9585bfc4.js} +1 -1
  123. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-040f83d75d0f6537.js +1 -0
  124. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-910257d16c604ebd.js → [...slug]-95088f43034e3c95.js} +1 -1
  125. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{roles-4f7a0756806cee34.js → roles-e9149e1fcf218f42.js} +1 -1
  126. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/{sync-data-208d6f955204d704.js → sync-data-75b67ae4a00818ef.js} +1 -1
  127. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users/{[...slug]-c89dc67e5a1706a8.js → [...slug]-557dda05ca6c6124.js} +1 -1
  128. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users-fa61dc6c1370e6a5.js +1 -0
  129. mage_ai/server/frontend_dist/_next/static/chunks/pages/{sign-in-054b33312d3193c3.js → sign-in-593c40985d63fcf7.js} +1 -1
  130. mage_ai/server/frontend_dist/_next/static/chunks/pages/templates/{[...slug]-b6ed6a5d818bfd20.js → [...slug]-252c4b6b818345d5.js} +1 -1
  131. mage_ai/server/frontend_dist/_next/static/chunks/pages/{templates-852357bc983af2ea.js → templates-ca528bc607753ab8.js} +1 -1
  132. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/terminal-1f9c56d671bbc67d.js → frontend_dist/_next/static/chunks/pages/terminal-287362c1defcc96b.js} +1 -1
  133. mage_ai/server/frontend_dist/_next/static/chunks/pages/test-2f83af8c9f1378fe.js +1 -0
  134. mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-d9de73fb799efed8.js +1 -0
  135. mage_ai/server/{frontend_dist_base_path_template/_next/static/chunks/pages/version-control-ae3469b992a341d6.js → frontend_dist/_next/static/chunks/pages/version-control-573f0225d7a703ed.js} +1 -1
  136. mage_ai/server/frontend_dist/block-layout.html +3 -3
  137. mage_ai/server/frontend_dist/compute.html +6 -6
  138. mage_ai/server/frontend_dist/files.html +6 -6
  139. mage_ai/server/frontend_dist/global-data-products/[...slug].html +6 -6
  140. mage_ai/server/frontend_dist/global-data-products.html +6 -6
  141. mage_ai/server/frontend_dist/global-hooks/[...slug].html +6 -6
  142. mage_ai/server/frontend_dist/global-hooks.html +6 -6
  143. mage_ai/server/frontend_dist/index.html +3 -3
  144. mage_ai/server/frontend_dist/manage/files.html +6 -6
  145. mage_ai/server/frontend_dist/manage/overview.html +6 -6
  146. mage_ai/server/frontend_dist/manage/pipeline-runs.html +6 -6
  147. mage_ai/server/frontend_dist/manage/settings.html +6 -6
  148. mage_ai/server/frontend_dist/manage/users/[user].html +6 -6
  149. mage_ai/server/frontend_dist/manage/users/new.html +6 -6
  150. mage_ai/server/frontend_dist/manage/users.html +6 -6
  151. mage_ai/server/frontend_dist/manage.html +6 -6
  152. mage_ai/server/frontend_dist/oauth.html +5 -5
  153. mage_ai/server/frontend_dist/overview.html +6 -6
  154. mage_ai/server/frontend_dist/pipeline-runs.html +6 -6
  155. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills/[...slug].html +6 -6
  156. mage_ai/server/frontend_dist/pipelines/[pipeline]/backfills.html +6 -6
  157. mage_ai/server/frontend_dist/pipelines/[pipeline]/dashboard.html +6 -6
  158. mage_ai/server/frontend_dist/pipelines/[pipeline]/edit.html +3 -3
  159. mage_ai/server/frontend_dist/pipelines/[pipeline]/logs.html +6 -6
  160. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runs.html +6 -6
  161. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors/block-runtime.html +6 -6
  162. mage_ai/server/frontend_dist/pipelines/[pipeline]/monitors.html +6 -6
  163. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs/[run].html +6 -6
  164. mage_ai/server/frontend_dist/pipelines/[pipeline]/runs.html +6 -6
  165. mage_ai/server/frontend_dist/pipelines/[pipeline]/settings.html +6 -6
  166. mage_ai/server/frontend_dist/pipelines/[pipeline]/syncs.html +6 -6
  167. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers/[...slug].html +6 -6
  168. mage_ai/server/frontend_dist/pipelines/[pipeline]/triggers.html +6 -6
  169. mage_ai/server/frontend_dist/pipelines/[pipeline].html +3 -3
  170. mage_ai/server/frontend_dist/pipelines.html +6 -6
  171. mage_ai/server/frontend_dist/platform/global-hooks/[...slug].html +6 -6
  172. mage_ai/server/frontend_dist/platform/global-hooks.html +6 -6
  173. mage_ai/server/frontend_dist/settings/account/profile.html +6 -6
  174. mage_ai/server/frontend_dist/settings/platform/preferences.html +6 -6
  175. mage_ai/server/frontend_dist/settings/platform/settings.html +6 -6
  176. mage_ai/server/frontend_dist/settings/workspace/permissions/[...slug].html +6 -6
  177. mage_ai/server/frontend_dist/settings/workspace/permissions.html +6 -6
  178. mage_ai/server/frontend_dist/settings/workspace/preferences.html +6 -6
  179. mage_ai/server/frontend_dist/settings/workspace/roles/[...slug].html +6 -6
  180. mage_ai/server/frontend_dist/settings/workspace/roles.html +6 -6
  181. mage_ai/server/frontend_dist/settings/workspace/sync-data.html +6 -6
  182. mage_ai/server/frontend_dist/settings/workspace/users/[...slug].html +6 -6
  183. mage_ai/server/frontend_dist/settings/workspace/users.html +6 -6
  184. mage_ai/server/frontend_dist/settings.html +3 -3
  185. mage_ai/server/frontend_dist/sign-in.html +7 -7
  186. mage_ai/server/frontend_dist/templates/[...slug].html +6 -6
  187. mage_ai/server/frontend_dist/templates.html +6 -6
  188. mage_ai/server/frontend_dist/terminal.html +6 -6
  189. mage_ai/server/frontend_dist/test.html +3 -3
  190. mage_ai/server/frontend_dist/triggers.html +6 -6
  191. mage_ai/server/frontend_dist/v2/canvas.html +2 -2
  192. mage_ai/server/frontend_dist/v2.html +2 -2
  193. mage_ai/server/frontend_dist/version-control.html +6 -6
  194. mage_ai/server/frontend_dist_base_path_template/404.html +3 -3
  195. mage_ai/server/frontend_dist_base_path_template/_next/static/2QL-FT4lFR0a9bDZ7lNd9/_buildManifest.js +1 -0
  196. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{1187-839336d276186105.js → 1187-4560c3895e1d7099.js} +1 -1
  197. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{1598-0adca9dce3ba4c60.js → 1598-cbf3f5a6078fc3f5.js} +1 -1
  198. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2717-638a944d24d5abde.js +1 -0
  199. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3548-36f746b1824004f2.js +1 -0
  200. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{3763-39a5174f6a3924db.js → 3763-aabe2703076636b0.js} +1 -1
  201. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3782-3e2acb5ed45b582b.js +1 -0
  202. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/449-5e2253c6aba42557.js +1 -0
  203. mage_ai/server/{frontend_dist/_next/static/chunks/5627-d5e559859dd0e1e0.js → frontend_dist_base_path_template/_next/static/chunks/5627-10e76bafa5a26f5f.js} +1 -1
  204. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{5699-e49718dfc9eb2854.js → 5699-e99379e332bd0b41.js} +1 -1
  205. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{7966-163da2621b8c987c.js → 7966-a5a7db345ce81263.js} +1 -1
  206. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-f205accb03b9ff43.js +2 -0
  207. mage_ai/server/{frontend_dist/_next/static/chunks/pages/compute-ed67fa8e81662e8b.js → frontend_dist_base_path_template/_next/static/chunks/pages/compute-9e2dea78024e3bb4.js} +1 -1
  208. mage_ai/server/{frontend_dist/_next/static/chunks/pages/files-e0ecd7ced09a63b2.js → frontend_dist_base_path_template/_next/static/chunks/pages/files-e08c7fe76f968f9c.js} +1 -1
  209. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/global-data-products/{[...slug]-c7a729477ecda50e.js → [...slug]-30c3807057a4e65b.js} +1 -1
  210. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{global-data-products-fd6ae6a358a60a0c.js → global-data-products-8dcb3b31af9e0e39.js} +1 -1
  211. mage_ai/server/{frontend_dist/_next/static/chunks/pages/global-hooks/[...slug]-8e50243797a7fe59.js → frontend_dist_base_path_template/_next/static/chunks/pages/global-hooks/[...slug]-85a64b64d27214b6.js} +1 -1
  212. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{global-hooks-d0c003446332dc0d.js → global-hooks-4ff959d51b8a9502.js} +1 -1
  213. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/{files-a69ed8e9f814490c.js → files-d08a460641d0efaa.js} +1 -1
  214. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/{overview-1aad7093c6d39257.js → overview-aae747f487e08d51.js} +1 -1
  215. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/{pipeline-runs-528d30e0d13b0cc7.js → pipeline-runs-09a842d64a6ada62.js} +1 -1
  216. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/{settings-fb9201d9cf63031d.js → settings-2e98e57d9376a458.js} +1 -1
  217. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/{[user]-000f5a980a07da39.js → [user]-7be6e41ad66089bb.js} +1 -1
  218. mage_ai/server/{frontend_dist/_next/static/chunks/pages/manage/users/new-e4e613f6e817a733.js → frontend_dist_base_path_template/_next/static/chunks/pages/manage/users/new-4c088833063bfa07.js} +1 -1
  219. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users-5db54821a3059c69.js +1 -0
  220. mage_ai/server/{frontend_dist/_next/static/chunks/pages/manage-34d718b8a4066c23.js → frontend_dist_base_path_template/_next/static/chunks/pages/manage-868fcd8cbeb265f0.js} +1 -1
  221. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{oauth-3bfd1b8d7f036726.js → oauth-6ceceb62191dfe8a.js} +1 -1
  222. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/overview-f65416f6dbe30ad3.js +1 -0
  223. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{pipeline-runs-5f8c100e648efa8a.js → pipeline-runs-2d0136b51b57de93.js} +1 -1
  224. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills/{[...slug]-688c652f3296bb9c.js → [...slug]-1ad5238742e25b4c.js} +1 -1
  225. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-bd11e87d026bfbf9.js +1 -0
  226. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{dashboard-1236e36d39b1637d.js → dashboard-0f4f47f721b0723f.js} +1 -1
  227. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-5ae8efe9e0530212.js +1 -0
  228. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/logs-fe91dfb0091f6bc6.js +1 -0
  229. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-0d68d4bf6290fefb.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runs-cf794b2d22a80f31.js} +1 -1
  230. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-9254358d58f07714.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/monitors/block-runtime-a964caef91bed9e1.js} +1 -1
  231. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/{monitors-821001e690caebe2.js → monitors-80bebb4401eefe25.js} +1 -1
  232. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-2eae7cb017027682.js +1 -0
  233. mage_ai/server/{frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs-2d4b2a0800a66b33.js → frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs-776b2e5b0b6ceba8.js} +1 -1
  234. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-03d9bca3bc5e6088.js +1 -0
  235. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/syncs-707ed8ca942ca802.js +1 -0
  236. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers/{[...slug]-259143ed3cf59e31.js → [...slug]-8429f17d4146e1ec.js} +1 -1
  237. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers-193045d9836d8d80.js +1 -0
  238. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-d25d07db166cbb04.js +1 -0
  239. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/platform/global-hooks/{[...slug]-5eeec927e4202b63.js → [...slug]-6834ae87bd668cb2.js} +1 -1
  240. mage_ai/server/{frontend_dist/_next/static/chunks/pages/platform/global-hooks-fbe9ad995d46d837.js → frontend_dist_base_path_template/_next/static/chunks/pages/platform/global-hooks-b3f7309a23e592b2.js} +1 -1
  241. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/account/{profile-fc659962d4015cb3.js → profile-f8b7374385e1f1bf.js} +1 -1
  242. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/preferences-8de68502a9afa299.js +1 -0
  243. mage_ai/server/{frontend_dist/_next/static/chunks/pages/settings/platform/settings-a4f88c334414402b.js → frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/settings-50fb6a34f3913f1f.js} +1 -1
  244. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/permissions/{[...slug]-4deb9579ef99a3c6.js → [...slug]-2e5c098c21ea32b7.js} +1 -1
  245. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{permissions-e0cda2f2bfce8d61.js → permissions-54e4b15b9585bfc4.js} +1 -1
  246. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-040f83d75d0f6537.js +1 -0
  247. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/roles/{[...slug]-910257d16c604ebd.js → [...slug]-95088f43034e3c95.js} +1 -1
  248. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{roles-4f7a0756806cee34.js → roles-e9149e1fcf218f42.js} +1 -1
  249. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/{sync-data-208d6f955204d704.js → sync-data-75b67ae4a00818ef.js} +1 -1
  250. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users/{[...slug]-c89dc67e5a1706a8.js → [...slug]-557dda05ca6c6124.js} +1 -1
  251. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users-fa61dc6c1370e6a5.js +1 -0
  252. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{sign-in-054b33312d3193c3.js → sign-in-593c40985d63fcf7.js} +1 -1
  253. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/templates/{[...slug]-b6ed6a5d818bfd20.js → [...slug]-252c4b6b818345d5.js} +1 -1
  254. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{templates-852357bc983af2ea.js → templates-ca528bc607753ab8.js} +1 -1
  255. mage_ai/server/{frontend_dist/_next/static/chunks/pages/terminal-1f9c56d671bbc67d.js → frontend_dist_base_path_template/_next/static/chunks/pages/terminal-287362c1defcc96b.js} +1 -1
  256. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/test-2f83af8c9f1378fe.js +1 -0
  257. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/triggers-d9de73fb799efed8.js +1 -0
  258. mage_ai/server/{frontend_dist/_next/static/chunks/pages/version-control-ae3469b992a341d6.js → frontend_dist_base_path_template/_next/static/chunks/pages/version-control-573f0225d7a703ed.js} +1 -1
  259. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/{webpack-12ad70eb5c31aa92.js → webpack-5f4be622608d9267.js} +1 -1
  260. mage_ai/server/frontend_dist_base_path_template/block-layout.html +3 -3
  261. mage_ai/server/frontend_dist_base_path_template/compute.html +6 -6
  262. mage_ai/server/frontend_dist_base_path_template/files.html +6 -6
  263. mage_ai/server/frontend_dist_base_path_template/global-data-products/[...slug].html +6 -6
  264. mage_ai/server/frontend_dist_base_path_template/global-data-products.html +6 -6
  265. mage_ai/server/frontend_dist_base_path_template/global-hooks/[...slug].html +6 -6
  266. mage_ai/server/frontend_dist_base_path_template/global-hooks.html +6 -6
  267. mage_ai/server/frontend_dist_base_path_template/index.html +3 -3
  268. mage_ai/server/frontend_dist_base_path_template/manage/files.html +6 -6
  269. mage_ai/server/frontend_dist_base_path_template/manage/overview.html +6 -6
  270. mage_ai/server/frontend_dist_base_path_template/manage/pipeline-runs.html +6 -6
  271. mage_ai/server/frontend_dist_base_path_template/manage/settings.html +6 -6
  272. mage_ai/server/frontend_dist_base_path_template/manage/users/[user].html +6 -6
  273. mage_ai/server/frontend_dist_base_path_template/manage/users/new.html +6 -6
  274. mage_ai/server/frontend_dist_base_path_template/manage/users.html +6 -6
  275. mage_ai/server/frontend_dist_base_path_template/manage.html +6 -6
  276. mage_ai/server/frontend_dist_base_path_template/oauth.html +5 -5
  277. mage_ai/server/frontend_dist_base_path_template/overview.html +6 -6
  278. mage_ai/server/frontend_dist_base_path_template/pipeline-runs.html +6 -6
  279. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills/[...slug].html +6 -6
  280. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/backfills.html +6 -6
  281. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/dashboard.html +6 -6
  282. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/edit.html +3 -3
  283. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/logs.html +6 -6
  284. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runs.html +6 -6
  285. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors/block-runtime.html +6 -6
  286. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/monitors.html +6 -6
  287. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs/[run].html +6 -6
  288. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/runs.html +6 -6
  289. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/settings.html +6 -6
  290. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/syncs.html +6 -6
  291. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers/[...slug].html +6 -6
  292. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline]/triggers.html +6 -6
  293. mage_ai/server/frontend_dist_base_path_template/pipelines/[pipeline].html +3 -3
  294. mage_ai/server/frontend_dist_base_path_template/pipelines.html +6 -6
  295. mage_ai/server/frontend_dist_base_path_template/platform/global-hooks/[...slug].html +6 -6
  296. mage_ai/server/frontend_dist_base_path_template/platform/global-hooks.html +6 -6
  297. mage_ai/server/frontend_dist_base_path_template/settings/account/profile.html +6 -6
  298. mage_ai/server/frontend_dist_base_path_template/settings/platform/preferences.html +6 -6
  299. mage_ai/server/frontend_dist_base_path_template/settings/platform/settings.html +6 -6
  300. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions/[...slug].html +6 -6
  301. mage_ai/server/frontend_dist_base_path_template/settings/workspace/permissions.html +6 -6
  302. mage_ai/server/frontend_dist_base_path_template/settings/workspace/preferences.html +6 -6
  303. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles/[...slug].html +6 -6
  304. mage_ai/server/frontend_dist_base_path_template/settings/workspace/roles.html +6 -6
  305. mage_ai/server/frontend_dist_base_path_template/settings/workspace/sync-data.html +6 -6
  306. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users/[...slug].html +6 -6
  307. mage_ai/server/frontend_dist_base_path_template/settings/workspace/users.html +6 -6
  308. mage_ai/server/frontend_dist_base_path_template/settings.html +3 -3
  309. mage_ai/server/frontend_dist_base_path_template/sign-in.html +7 -7
  310. mage_ai/server/frontend_dist_base_path_template/templates/[...slug].html +6 -6
  311. mage_ai/server/frontend_dist_base_path_template/templates.html +6 -6
  312. mage_ai/server/frontend_dist_base_path_template/terminal.html +6 -6
  313. mage_ai/server/frontend_dist_base_path_template/test.html +3 -3
  314. mage_ai/server/frontend_dist_base_path_template/triggers.html +6 -6
  315. mage_ai/server/frontend_dist_base_path_template/v2/canvas.html +2 -2
  316. mage_ai/server/frontend_dist_base_path_template/v2.html +2 -2
  317. mage_ai/server/frontend_dist_base_path_template/version-control.html +6 -6
  318. mage_ai/server/scheduler_manager.py +2 -0
  319. mage_ai/server/server.py +13 -0
  320. mage_ai/server/terminal_server.py +3 -0
  321. mage_ai/server/utils/output_display.py +5 -3
  322. mage_ai/services/aws/events/events.py +2 -2
  323. mage_ai/services/gcp/cloud_run/cloud_run.py +1 -1
  324. mage_ai/services/teams/config.py +13 -2
  325. mage_ai/services/teams/teams.py +13 -11
  326. mage_ai/settings/server.py +12 -1
  327. mage_ai/shared/constants.py +3 -1
  328. mage_ai/shared/croniter.py +1398 -0
  329. mage_ai/shared/enum.py +2 -5
  330. mage_ai/shared/environments.py +27 -3
  331. mage_ai/streaming/sinks/elasticsearch.py +15 -5
  332. mage_ai/streaming/sinks/kafka.py +21 -3
  333. mage_ai/streaming/sources/kafka.py +64 -7
  334. mage_ai/streaming/sources/kafka_oauth.py +182 -0
  335. mage_ai/tests/api/endpoints/test_blocks.py +1 -101
  336. mage_ai/tests/api/endpoints/test_configuration_options.py +1 -48
  337. mage_ai/tests/api/endpoints/test_configuration_options_project_platform.py +68 -0
  338. mage_ai/tests/api/endpoints/test_custom_designs.py +1 -106
  339. mage_ai/tests/api/endpoints/test_custom_designs_project_platform.py +132 -0
  340. mage_ai/tests/api/endpoints/test_dbt_blocks.py +111 -0
  341. mage_ai/tests/api/endpoints/test_file_contents.py +0 -48
  342. mage_ai/tests/api/endpoints/test_file_contents_with_project_platform.py +66 -0
  343. mage_ai/tests/api/endpoints/test_pipelines.py +0 -134
  344. mage_ai/tests/api/endpoints/test_pipelines_with_project_platform.py +143 -0
  345. mage_ai/tests/data_preparation/executors/test_block_executor.py +3 -3
  346. mage_ai/tests/data_preparation/logging/test_logger_manager.py +24 -5
  347. mage_ai/tests/data_preparation/models/block/dynamic/test_counter.py +1 -3
  348. mage_ai/tests/data_preparation/models/block/hook/test_hook_block.py +3 -3
  349. mage_ai/tests/data_preparation/models/test_block.py +7 -0
  350. mage_ai/tests/data_preparation/models/test_pipeline.py +55 -0
  351. mage_ai/tests/data_preparation/models/test_variable.py +2 -0
  352. mage_ai/tests/data_preparation/test_repo_manager.py +0 -63
  353. mage_ai/tests/data_preparation/test_repo_manager_project_platform.py +67 -0
  354. mage_ai/tests/data_preparation/test_variable_manager.py +0 -51
  355. mage_ai/tests/data_preparation/test_variable_manager_project_platform.py +41 -0
  356. mage_ai/tests/io/create_table/test_postgresql.py +28 -0
  357. mage_ai/tests/orchestration/db/models/test_schedules.py +1 -1
  358. mage_ai/tests/orchestration/notification/test_config.py +3 -3
  359. mage_ai/tests/orchestration/notification/test_sender.py +5 -1
  360. mage_ai/tests/orchestration/utils/__init__.py +0 -0
  361. mage_ai/tests/orchestration/utils/test_resources.py +235 -0
  362. mage_ai/tests/shared/test_croniter.py +2541 -0
  363. mage_ai/tests/streaming/sinks/test_kafka.py +130 -0
  364. mage_ai/tests/streaming/sources/test_kafka.py +125 -3
  365. mage_ai/tests/streaming/sources/test_kafka_oauth.py +208 -0
  366. mage_ai/tests/streaming/sources/test_kafka_raw_value.py +105 -0
  367. mage_ai/usage_statistics/logger.py +99 -15
  368. mage_ai-0.9.79.dist-info/METADATA +358 -0
  369. {mage_ai-0.9.74.dist-info → mage_ai-0.9.79.dist-info}/RECORD +377 -359
  370. {mage_ai-0.9.74.dist-info → mage_ai-0.9.79.dist-info}/WHEEL +1 -1
  371. mage_ai/server/frontend_dist/_next/static/chunks/1557-1ad0c64c2d08e569.js +0 -1
  372. mage_ai/server/frontend_dist/_next/static/chunks/2717-d65056b6b5e124eb.js +0 -1
  373. mage_ai/server/frontend_dist/_next/static/chunks/3548-b2c5edfb710886a6.js +0 -1
  374. mage_ai/server/frontend_dist/_next/static/chunks/3782-4b3091e550f809a2.js +0 -1
  375. mage_ai/server/frontend_dist/_next/static/chunks/pages/_app-5bdff745074fb350.js +0 -2
  376. mage_ai/server/frontend_dist/_next/static/chunks/pages/manage/users-a5e9d77ed5b50205.js +0 -1
  377. mage_ai/server/frontend_dist/_next/static/chunks/pages/overview-69af3253ad0d0d89.js +0 -1
  378. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/backfills-fe112809feb25b05.js +0 -1
  379. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/edit-e9ca358209cdf93d.js +0 -1
  380. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/logs-a29f1615d2e7d330.js +0 -1
  381. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-6d382ae5bad9745c.js +0 -1
  382. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/settings-cd49372ae1702963.js +0 -1
  383. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/syncs-135be8974f7f5f2b.js +0 -1
  384. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines/[pipeline]/triggers-3af13e89adff4d6c.js +0 -1
  385. mage_ai/server/frontend_dist/_next/static/chunks/pages/pipelines-b578b075a8d857e3.js +0 -1
  386. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/platform/preferences-058d283ee178c038.js +0 -1
  387. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/preferences-7b02bb70462144cb.js +0 -1
  388. mage_ai/server/frontend_dist/_next/static/chunks/pages/settings/workspace/users-5212c01a9dc558da.js +0 -1
  389. mage_ai/server/frontend_dist/_next/static/chunks/pages/test-86b12cc12d4a625f.js +0 -1
  390. mage_ai/server/frontend_dist/_next/static/chunks/pages/triggers-2481c40b18d5b6d4.js +0 -1
  391. mage_ai/server/frontend_dist/_next/static/pLWT6Sqd09xYpufCVIqnz/_buildManifest.js +0 -1
  392. mage_ai/server/frontend_dist_base_path_template/_next/static/JQewSAObpbhO0wrdAM6Ng/_buildManifest.js +0 -1
  393. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/1557-1ad0c64c2d08e569.js +0 -1
  394. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/2717-d65056b6b5e124eb.js +0 -1
  395. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3548-b2c5edfb710886a6.js +0 -1
  396. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/3782-4b3091e550f809a2.js +0 -1
  397. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/_app-90de19bc03f1484b.js +0 -2
  398. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/manage/users-a5e9d77ed5b50205.js +0 -1
  399. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/overview-69af3253ad0d0d89.js +0 -1
  400. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/backfills-fe112809feb25b05.js +0 -1
  401. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/edit-e9ca358209cdf93d.js +0 -1
  402. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/logs-a29f1615d2e7d330.js +0 -1
  403. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/runs/[run]-6d382ae5bad9745c.js +0 -1
  404. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/settings-cd49372ae1702963.js +0 -1
  405. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/syncs-135be8974f7f5f2b.js +0 -1
  406. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines/[pipeline]/triggers-3af13e89adff4d6c.js +0 -1
  407. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/pipelines-b578b075a8d857e3.js +0 -1
  408. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/platform/preferences-058d283ee178c038.js +0 -1
  409. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/preferences-7b02bb70462144cb.js +0 -1
  410. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/settings/workspace/users-5212c01a9dc558da.js +0 -1
  411. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/test-86b12cc12d4a625f.js +0 -1
  412. mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/triggers-2481c40b18d5b6d4.js +0 -1
  413. mage_ai-0.9.74.dist-info/METADATA +0 -544
  414. /mage_ai/server/frontend_dist/_next/static/{pLWT6Sqd09xYpufCVIqnz → TUo4RceCdMufBTBTq8CAq}/_ssgManifest.js +0 -0
  415. /mage_ai/server/frontend_dist/_next/static/chunks/pages/{_app-5bdff745074fb350.js.LICENSE.txt → _app-b697b35dfc4e6e26.js.LICENSE.txt} +0 -0
  416. /mage_ai/server/frontend_dist_base_path_template/_next/static/{JQewSAObpbhO0wrdAM6Ng → 2QL-FT4lFR0a9bDZ7lNd9}/_ssgManifest.js +0 -0
  417. /mage_ai/server/frontend_dist_base_path_template/_next/static/chunks/pages/{_app-90de19bc03f1484b.js.LICENSE.txt → _app-f205accb03b9ff43.js.LICENSE.txt} +0 -0
  418. {mage_ai-0.9.74.dist-info → mage_ai-0.9.79.dist-info}/entry_points.txt +0 -0
  419. {mage_ai-0.9.74.dist-info → mage_ai-0.9.79.dist-info/licenses}/LICENSE +0 -0
  420. {mage_ai-0.9.74.dist-info → mage_ai-0.9.79.dist-info}/top_level.txt +0 -0
@@ -156,16 +156,18 @@ TEMPLATE_CLASSIFICATION_FUNCTION = [
156
156
  "type": "string",
157
157
  "description": "Programming language of the code block. "
158
158
  f"Default value is {BlockLanguage.__name__}__python.",
159
- "enum": [f"{BlockLanguage.__name__}__{type.name.lower()}"
160
- for type in BlockLanguage]
159
+ "enum": [
160
+ f"{BlockLanguage.__name__}__{type.name.lower()}"
161
+ for type in BlockLanguage]
161
162
  },
162
163
  PipelineType.__name__: {
163
164
  "type": "string",
164
165
  "description": "Type of pipeline to build. Default value is "
165
166
  f"{PipelineType.__name__}__python if pipeline type "
166
167
  "is not mentioned in the description.",
167
- "enum": [f"{PipelineType.__name__}__{type.name.lower()}"
168
- for type in PipelineType]
168
+ "enum": [
169
+ f"{PipelineType.__name__}__{type.name.lower()}"
170
+ for type in PipelineType]
169
171
  },
170
172
  ActionType.__name__: {
171
173
  "type": "string",
@@ -42,16 +42,18 @@ tools = [
42
42
  "type": "string",
43
43
  "description": "Programming language of the code block. "
44
44
  f"Default value is {BlockLanguage.__name__}__python.",
45
- "enum": [f"{BlockLanguage.__name__}__{type.name.lower()}"
46
- for type in BlockLanguage]
45
+ "enum": [
46
+ f"{BlockLanguage.__name__}__{type.name.lower()}"
47
+ for type in BlockLanguage]
47
48
  },
48
49
  PipelineType.__name__: {
49
50
  "type": "string",
50
51
  "description": "Type of pipeline to build. Default value is "
51
52
  f"{PipelineType.__name__}__python if pipeline type "
52
53
  "is not mentioned in the description.",
53
- "enum": [f"{PipelineType.__name__}__{type.name.lower()}"
54
- for type in PipelineType]
54
+ "enum": [
55
+ f"{PipelineType.__name__}__{type.name.lower()}"
56
+ for type in PipelineType]
55
57
  },
56
58
  ActionType.__name__: {
57
59
  "type": "string",
@@ -85,7 +87,7 @@ class OpenAIClient(AIClient):
85
87
  open_ai_config.openai_api_key or os.getenv('OPENAI_API_KEY')
86
88
  openai.api_key = openai_api_key
87
89
  self.llm = OpenAI(openai_api_key=openai_api_key, temperature=0)
88
- self.openai_client = OpenAILib()
90
+ self.openai_client = OpenAILib(api_key=openai_api_key)
89
91
 
90
92
  def __chat_completion_request(self, messages):
91
93
  try:
@@ -100,6 +100,7 @@ PipelineSchedulePolicy.allow_read(PipelineSchedulePresenter.default_attributes +
100
100
  PipelineSchedulePolicy.allow_read(PipelineSchedulePresenter.default_attributes + [
101
101
  'event_matchers',
102
102
  'next_pipeline_run_date',
103
+ 'rotate_token',
103
104
  'tags',
104
105
  ], scopes=[
105
106
  OauthScope.CLIENT_PRIVATE,
@@ -1,5 +1,6 @@
1
1
  from mage_ai.api.operations import constants
2
2
  from mage_ai.api.presenters.BasePresenter import BasePresenter
3
+ from mage_ai.settings.server import HIDE_API_TRIGGER_TOKEN
3
4
 
4
5
 
5
6
  class PipelineSchedulePresenter(BasePresenter):
@@ -32,8 +33,6 @@ class PipelineSchedulePresenter(BasePresenter):
32
33
  ])
33
34
  data['tags'] = sorted([tag.name for tag in self.get_tag_associations])
34
35
  data['next_pipeline_run_date'] = self.model.next_execution_date()
35
-
36
- return data
37
36
  elif 'with_runtime_average' == display_format:
38
37
  data = self.model.to_dict()
39
38
  data['runtime_average'] = self.model.runtime_average()
@@ -47,6 +46,16 @@ class PipelineSchedulePresenter(BasePresenter):
47
46
  else:
48
47
  data = self.model.to_dict()
49
48
 
49
+ if display_format == constants.UPDATE:
50
+ rotate_token = kwargs.get(
51
+ 'payload', dict(),
52
+ ).get(
53
+ 'pipeline_schedule', dict(),
54
+ ).get('rotate_token')
55
+ else:
56
+ rotate_token = False
57
+ if HIDE_API_TRIGGER_TOKEN and not rotate_token:
58
+ data['token'] = '[API_TOKEN_PLACEHOLDER]'
50
59
  return data
51
60
 
52
61
 
@@ -32,6 +32,14 @@ class GitFileResource(GenericResource):
32
32
  pass
33
33
 
34
34
  file_path_absolute = os.path.join(git_manager.repo_path, file_path)
35
+
36
+ # Prevent path traversal by resolving the absolute path location
37
+ # and checking if it's within the repo
38
+ if not os.path.abspath(file_path_absolute).startswith(
39
+ os.path.abspath(git_manager.repo_path)
40
+ ):
41
+ raise Exception("Access denied: Attempted path traversal")
42
+
35
43
  file = File.from_path(file_path_absolute)
36
44
  if not file.exists():
37
45
  file = File.from_path(file_path_absolute, '')
@@ -29,7 +29,8 @@ from mage_ai.orchestration.db.models.tags import (
29
29
  )
30
30
  from mage_ai.settings.platform import project_platform_activated
31
31
  from mage_ai.settings.repo import get_repo_path
32
- from mage_ai.shared.hash import merge_dict
32
+ from mage_ai.settings.server import HIDE_API_TRIGGER_TOKEN
33
+ from mage_ai.shared.hash import ignore_keys, merge_dict
33
34
 
34
35
 
35
36
  class PipelineScheduleResource(DatabaseResource):
@@ -157,17 +158,15 @@ class PipelineScheduleResource(DatabaseResource):
157
158
  ),
158
159
  func.sum(
159
160
  case(
160
- [
161
- (
162
- PipelineRun.status.in_(
163
- [
164
- PipelineRun.PipelineRunStatus.INITIAL,
165
- PipelineRun.PipelineRunStatus.RUNNING,
166
- ]
167
- ),
168
- 1,
169
- )
170
- ],
161
+ (
162
+ PipelineRun.status.in_(
163
+ [
164
+ PipelineRun.PipelineRunStatus.INITIAL,
165
+ PipelineRun.PipelineRunStatus.RUNNING,
166
+ ]
167
+ ),
168
+ 1,
169
+ ),
171
170
  else_=0,
172
171
  )
173
172
  ).label('in_progress_runs_count'),
@@ -282,6 +281,7 @@ class PipelineScheduleResource(DatabaseResource):
282
281
 
283
282
  @safe_db_query
284
283
  def update(self, payload, **kwargs):
284
+ # Update associated event matchers
285
285
  arr = payload.pop('event_matchers', None)
286
286
  event_matchers = []
287
287
  if arr is not None:
@@ -320,6 +320,7 @@ class PipelineScheduleResource(DatabaseResource):
320
320
  ]
321
321
  em.update(pipeline_schedules=ps)
322
322
 
323
+ # Update associated tags
323
324
  tag_names = payload.pop('tags', None)
324
325
  if tag_names is not None:
325
326
  # 1. Fetch all tag associations
@@ -408,7 +409,11 @@ class PipelineScheduleResource(DatabaseResource):
408
409
 
409
410
  old_name = self.model.name
410
411
 
411
- resource = super().update(payload)
412
+ # Rotate token
413
+ if payload.get('rotate_token'):
414
+ payload['token'] = uuid.uuid4().hex
415
+
416
+ resource = super().update(ignore_keys(payload, ['rotate_token']))
412
417
  updated_model = resource.model
413
418
 
414
419
  repo_path = get_repo_path(user=self.current_user)
@@ -424,9 +429,10 @@ class PipelineScheduleResource(DatabaseResource):
424
429
  sla=updated_model.sla,
425
430
  start_time=updated_model.start_time,
426
431
  status=updated_model.status,
427
- token=updated_model.token,
428
432
  variables=updated_model.variables,
429
433
  )
434
+ if not HIDE_API_TRIGGER_TOKEN:
435
+ trigger.token = updated_model.token
430
436
 
431
437
  update_only_if_exists = (
432
438
  not pipeline.should_save_trigger_in_code_automatically()
@@ -8,6 +8,7 @@ from mage_ai.data_preparation.models.triggers import (
8
8
  from mage_ai.orchestration.db import safe_db_query
9
9
  from mage_ai.orchestration.db.models.schedules import PipelineSchedule
10
10
  from mage_ai.settings.repo import get_repo_path
11
+ from mage_ai.settings.server import HIDE_API_TRIGGER_TOKEN
11
12
 
12
13
 
13
14
  class PipelineTriggerResource(GenericResource):
@@ -50,9 +51,10 @@ class PipelineTriggerResource(GenericResource):
50
51
  sla=pipeline_schedule.sla,
51
52
  start_time=pipeline_schedule.start_time,
52
53
  status=pipeline_schedule.status,
53
- token=pipeline_schedule.token,
54
54
  variables=pipeline_schedule.variables,
55
55
  )
56
+ if not HIDE_API_TRIGGER_TOKEN:
57
+ trigger.token = pipeline_schedule.token
56
58
  else:
57
59
  trigger = Trigger(**payload)
58
60
 
@@ -6,7 +6,7 @@ from mage_ai.authentication.ldap import new_ldap_connection
6
6
  from mage_ai.authentication.oauth2 import encode_token, generate_access_token
7
7
  from mage_ai.authentication.passwords import verify_password
8
8
  from mage_ai.authentication.providers.constants import NAME_TO_PROVIDER
9
- from mage_ai.orchestration.db import safe_db_query
9
+ from mage_ai.orchestration.db import safe_db_query, safe_db_query_async
10
10
  from mage_ai.orchestration.db.models.oauth import Role, User
11
11
  from mage_ai.settings import (
12
12
  AUTHENTICATION_MODE,
@@ -20,7 +20,7 @@ from mage_ai.usage_statistics.logger import UsageStatisticLogger
20
20
 
21
21
  class SessionResource(BaseResource):
22
22
  @classmethod
23
- @safe_db_query
23
+ @safe_db_query_async
24
24
  async def create(self, payload, _, **kwargs):
25
25
  email = payload.get('email')
26
26
  password = payload.get('password')
@@ -163,7 +163,7 @@ class SyncResource(GenericResource):
163
163
  access_token = user_payload.pop('access_token', None)
164
164
  if access_token:
165
165
  secret_name = get_access_token_secret_name(user=user)
166
- secret = Secret.query.filter(Secret.name == secret_name).one_or_none()
166
+ secret = Secret.repo_query.filter(Secret.name == secret_name).one_or_none()
167
167
  if secret:
168
168
  secret.delete()
169
169
  create_secret(secret_name, access_token, repo_name=repo_name)
@@ -28,7 +28,7 @@ class UserResource(DatabaseResource):
28
28
  results = (
29
29
  User.
30
30
  query.
31
- order_by(User.username.asc())
31
+ order_by(User.id.asc())
32
32
  )
33
33
 
34
34
  if user and user.is_admin:
mage_ai/cli/main.py CHANGED
@@ -194,7 +194,11 @@ def run(
194
194
  from mage_ai.orchestration.db.models.schedules import PipelineRun
195
195
  from mage_ai.orchestration.utils.git import log_git_sync, run_git_sync
196
196
  from mage_ai.server.logger import Logger
197
- from mage_ai.settings import SENTRY_DSN, SENTRY_TRACES_SAMPLE_RATE
197
+ from mage_ai.settings import (
198
+ SENTRY_DSN,
199
+ SENTRY_SERVER_NAME,
200
+ SENTRY_TRACES_SAMPLE_RATE,
201
+ )
198
202
  from mage_ai.shared.hash import merge_dict
199
203
 
200
204
  logger = Logger().new_server_logger(__name__)
@@ -204,7 +208,10 @@ def run(
204
208
  sentry_sdk.init(
205
209
  sentry_dsn,
206
210
  traces_sample_rate=SENTRY_TRACES_SAMPLE_RATE,
211
+ server_name=SENTRY_SERVER_NAME,
207
212
  )
213
+ import atexit
214
+ atexit.register(lambda: sentry_sdk.flush(timeout=5))
208
215
  (enable_new_relic, application) = initialize_new_relic()
209
216
 
210
217
  with (
@@ -312,7 +312,7 @@ def build_overview_data(
312
312
  increment(f"{DD_KEY}.build_overview_time_series.succeeded", tags)
313
313
 
314
314
  """
315
- Build sample data for scatter plot. Sample data consits of two parts:
315
+ Build sample data for scatter plot. Sample data consists of two parts:
316
316
  1. Numeric features
317
317
  2. Low cardinality categorical features
318
318
  """
@@ -224,7 +224,7 @@ class ReformatDateSubRule(ReformatValuesSubRule):
224
224
  1. If column is not of dtype category or text, no suggestion
225
225
  2. If column does not contain string types, no suggestion
226
226
  3. Try use Pandas datetime parse to convert from string to datetime.
227
- If more than DATE_MATCHES_LB entries are succesfully converted, suggest
227
+ If more than DATE_MATCHES_LB entries are successfully converted, suggest
228
228
  conversion to datetime type
229
229
  """
230
230
  dtype = self.column_types[column]
@@ -1,9 +1,11 @@
1
1
  DESTINATIONS = [
2
+ dict(name='Airtable'),
2
3
  dict(name='Amazon S3'),
3
4
  dict(name='BigQuery'),
4
5
  dict(name='Clickhouse'),
5
6
  dict(name='Delta Lake Azure'),
6
7
  dict(name='Delta Lake S3'),
8
+ dict(name='Doris'),
7
9
  dict(name='Elasticsearch'),
8
10
  dict(name='Google Cloud Storage'),
9
11
  dict(name='Kafka'),
@@ -20,5 +22,6 @@ DESTINATIONS = [
20
22
  dict(name='Redshift'),
21
23
  dict(name='Salesforce'),
22
24
  dict(name='Snowflake'),
25
+ dict(name='Teradata'),
23
26
  dict(name='Trino'),
24
27
  ]
@@ -3,6 +3,7 @@ from mage_ai.shared.hash import index_by
3
3
 
4
4
  SQL_SOURCES = [
5
5
  dict(name='BigQuery'),
6
+ dict(name='Doris'),
6
7
  dict(
7
8
  name='Microsoft SQL Server',
8
9
  uuid='mssql',
@@ -53,6 +54,7 @@ SOURCES = sorted([
53
54
  dict(name='Sftp'),
54
55
  dict(name='Stripe'),
55
56
  dict(name='Tableau'),
57
+ dict(name='Teradata'),
56
58
  dict(name='Twitter Ads'),
57
59
  dict(name='Zendesk'),
58
60
  ] + SQL_SOURCES, key=lambda x: x['name'])
@@ -693,7 +693,7 @@ class BlockExecutor:
693
693
  ),
694
694
  tags=tags,
695
695
  )
696
- self._execute_callback(
696
+ self.execute_callback(
697
697
  'on_failure',
698
698
  block_run_id=block_run_id,
699
699
  callback_kwargs=dict(__error=error, retry=self.retry_metadata),
@@ -748,7 +748,7 @@ class BlockExecutor:
748
748
  # success callback because this isn’t the last data integration block that needs
749
749
  # to run.
750
750
  if not data_integration_metadata or is_original_block:
751
- self._execute_callback(
751
+ self.execute_callback(
752
752
  'on_success',
753
753
  block_run_id=block_run_id,
754
754
  callback_kwargs=dict(retry=self.retry_metadata),
@@ -1253,7 +1253,7 @@ class BlockExecutor:
1253
1253
 
1254
1254
  return result
1255
1255
 
1256
- def _execute_callback(
1256
+ def execute_callback(
1257
1257
  self,
1258
1258
  callback: str,
1259
1259
  global_vars: Dict,
@@ -1275,6 +1275,11 @@ class BlockExecutor:
1275
1275
  dynamic_block_index: Index of the dynamic block.
1276
1276
  dynamic_upstream_block_uuids: List of UUIDs of the dynamic upstream blocks.
1277
1277
  """
1278
+ if logging_tags is None:
1279
+ logging_tags = self.build_tags(
1280
+ block_run_id=block_run_id,
1281
+ pipeline_run_id=pipeline_run.id if pipeline_run is not None else None,
1282
+ )
1278
1283
  upstream_block_uuids_override = []
1279
1284
  if is_dynamic_block_child(self.block):
1280
1285
  if not self.block_run and block_run_id:
@@ -10,10 +10,13 @@ from mage_ai.data_preparation.logging.logger import DictLogger
10
10
  from mage_ai.data_preparation.logging.logger_manager_factory import LoggerManagerFactory
11
11
  from mage_ai.data_preparation.models.pipeline import Pipeline
12
12
  from mage_ai.orchestration.db.models.schedules import BlockRun, PipelineRun
13
+ from mage_ai.server.logger import Logger
13
14
  from mage_ai.shared.hash import merge_dict
14
15
  from mage_ai.usage_statistics.constants import EventNameType, EventObjectType
15
16
  from mage_ai.usage_statistics.logger import UsageStatisticLogger
16
17
 
18
+ logger = Logger().new_server_logger(__name__)
19
+
17
20
 
18
21
  class PipelineExecutor:
19
22
  def __init__(self, pipeline: Pipeline, execution_partition: str = None):
@@ -53,25 +56,38 @@ class PipelineExecutor:
53
56
  update_status (bool): Whether to update the execution status.
54
57
  **kwargs: Additional keyword arguments.
55
58
  """
56
- if pipeline_run_id is None:
57
- # Execute the pipeline without block runs
58
- asyncio.run(self.pipeline.execute(
59
- analyze_outputs=analyze_outputs,
60
- global_vars=global_vars,
61
- run_sensors=run_sensors,
62
- run_tests=run_tests,
63
- update_status=update_status,
64
- ))
65
- else:
66
- # Supported pipeline types: Standard batch pipeline
67
- pipeline_run = PipelineRun.query.get(pipeline_run_id)
68
- if pipeline_run.status != PipelineRun.PipelineRunStatus.RUNNING:
69
- return
70
- asyncio.run(self.__run_blocks(
71
- pipeline_run,
72
- allow_blocks_to_fail=allow_blocks_to_fail,
73
- global_vars=global_vars,
74
- ))
59
+ # Create the async task to execute
60
+ async def _execute_task():
61
+ if pipeline_run_id is None:
62
+ # Execute the pipeline without block runs
63
+ await self.pipeline.execute(
64
+ analyze_outputs=analyze_outputs,
65
+ global_vars=global_vars,
66
+ run_sensors=run_sensors,
67
+ run_tests=run_tests,
68
+ update_status=update_status,
69
+ )
70
+ else:
71
+ # Supported pipeline types: Standard batch pipeline
72
+ pipeline_run = PipelineRun.query.get(pipeline_run_id)
73
+ if pipeline_run.status != PipelineRun.PipelineRunStatus.RUNNING:
74
+ return
75
+ await self.__run_blocks(
76
+ pipeline_run,
77
+ allow_blocks_to_fail=allow_blocks_to_fail,
78
+ global_vars=global_vars,
79
+ )
80
+ # Execute the task based on current context
81
+ try:
82
+ loop = asyncio.get_running_loop()
83
+ logger.info(f'[PipelineExecutor] Found running loop {loop}')
84
+ # We're in an async context, use create_task
85
+ task = asyncio.create_task(_execute_task())
86
+ loop.run_until_complete(task)
87
+ except RuntimeError:
88
+ # No running loop, safe to use asyncio.run
89
+ logger.info('[PipelineExecutor] No running loop, using asyncio.run')
90
+ asyncio.run(_execute_task())
75
91
 
76
92
  self.logger_manager.output_logs_to_destination()
77
93
 
@@ -215,7 +215,7 @@ def check_connection(git, remote_url: str) -> None:
215
215
 
216
216
 
217
217
  async def check_connection_async(git, remote_name: str) -> None:
218
- proc = git.ls_remote(remote_name, as_process=True)
218
+ proc = git.ls_remote(remote_name, 'HEAD', as_process=True)
219
219
 
220
220
  await poll_process_with_timeout(
221
221
  proc,
@@ -228,7 +228,7 @@ async def check_connection_async(git, remote_name: str) -> None:
228
228
 
229
229
 
230
230
  async def validate_authentication_for_remote_url(git, remote_url: str) -> None:
231
- proc = git.ls_remote(remote_url, as_process=True)
231
+ proc = git.ls_remote(remote_url, 'HEAD', as_process=True)
232
232
 
233
233
  await poll_process_with_timeout(
234
234
  proc,
@@ -3,6 +3,7 @@ import io
3
3
  import logging
4
4
  import logging.handlers
5
5
  import os
6
+ import traceback
6
7
  from datetime import datetime
7
8
  from typing import Callable, Dict, List
8
9
 
@@ -107,6 +108,18 @@ class LoggerManager:
107
108
 
108
109
  self.storage = LocalStorage()
109
110
 
111
+ def __del__(self):
112
+ """
113
+ Close the log file if the logger uses the file handler.
114
+ """
115
+ for handler in list(self.logger.handlers):
116
+ try:
117
+ if isinstance(handler, (logging.FileHandler, logging.handlers.RotatingFileHandler)):
118
+ self.logger.removeHandler(handler)
119
+ handler.close()
120
+ except Exception:
121
+ traceback.print_exc()
122
+
110
123
  def create_stream_handler(self):
111
124
  """
112
125
  Create a stream handler to output logs to a stream (e.g., in-memory buffer).
@@ -139,15 +152,31 @@ class LoggerManager:
139
152
  str_to_timedelta(log_retention_period)).strftime(
140
153
  format='%Y%m%dT%H%M%S')
141
154
 
155
+ from mage_ai.data_preparation.models.constants import PipelineType
156
+ from mage_ai.data_preparation.models.pipeline import Pipeline
142
157
  if self.pipeline_uuid is None:
143
- from mage_ai.data_preparation.models.pipeline import Pipeline
144
-
145
158
  pipeline_uuids = Pipeline.get_all_pipelines(self.repo_path)
146
159
  else:
147
160
  pipeline_uuids = [self.pipeline_uuid]
148
161
 
149
162
  for pipeline_uuid in pipeline_uuids:
150
163
  print(f'Removing old logs from pipeline {pipeline_uuid}')
164
+ # Skip cleaning up logs for streaming pipelines
165
+ skip_clean_up_logs = False
166
+ try:
167
+ p = Pipeline.get(pipeline_uuid)
168
+ if p.type == PipelineType.STREAMING:
169
+ print(f'Pipeline {pipeline_uuid} is a Streaming pipeline. '
170
+ 'Skip cleaning up logs.')
171
+ skip_clean_up_logs = True
172
+ except Exception as e:
173
+ print(f'Fail to load pipeline {pipeline_uuid} due to error {e}. '
174
+ 'Skip cleaning up logs.')
175
+ skip_clean_up_logs = True
176
+
177
+ if skip_clean_up_logs:
178
+ continue
179
+
151
180
  pipeline_log_path = self.get_log_filepath_prefix(pipeline_uuid=pipeline_uuid)
152
181
  dirs = self.storage.listdir(pipeline_log_path)
153
182
  for dirname in dirs:
@@ -878,7 +878,7 @@ class Block(
878
878
  relative_path: bool = False,
879
879
  ) -> str:
880
880
  file_extension = BLOCK_LANGUAGE_TO_FILE_EXTENSION[language]
881
- block_directory = block_type + 's' if block_type != BlockType.CUSTOM else block_type
881
+ block_directory = f'{block_type}s' if block_type != BlockType.CUSTOM else block_type
882
882
 
883
883
  parts = []
884
884
  if not relative_path:
@@ -1010,7 +1010,7 @@ class Block(
1010
1010
  self,
1011
1011
  content: str,
1012
1012
  ) -> str:
1013
- return '@' + self.type + '\n' + content
1013
+ return f'@{self.type}\n{content}'
1014
1014
 
1015
1015
  @classmethod
1016
1016
  def after_create(cls, block: 'Block', **kwargs) -> None:
@@ -1199,7 +1199,7 @@ class Block(
1199
1199
 
1200
1200
  @classmethod
1201
1201
  def file_directory_name(self, block_type: BlockType) -> str:
1202
- return block_type + 's' if block_type != BlockType.CUSTOM else block_type
1202
+ return f'{block_type}s' if block_type != BlockType.CUSTOM else block_type
1203
1203
 
1204
1204
  @classmethod
1205
1205
  def block_type_from_path(
@@ -1218,7 +1218,7 @@ class Block(
1218
1218
  for block_type in BlockType:
1219
1219
  if BlockType.CUSTOM == block_type and dir_name == block_type:
1220
1220
  return BlockType.CUSTOM
1221
- elif dir_name == block_type + 's':
1221
+ elif dir_name == f'{block_type}s':
1222
1222
  return block_type
1223
1223
 
1224
1224
  @classmethod
@@ -3941,7 +3941,6 @@ class Block(
3941
3941
  for v in b.output_variables(execution_partition=execution_partition):
3942
3942
  objs.append(
3943
3943
  self.get_variable_object(
3944
- self.pipeline_uuid,
3945
3944
  b.uuid,
3946
3945
  v,
3947
3946
  partition=execution_partition,
@@ -4465,29 +4464,36 @@ class CallbackBlock(AddonBlock):
4465
4464
  elif 'on_success' == callback:
4466
4465
  callback_functions_legacy = success_functions
4467
4466
  callback_status = CallbackStatus.SUCCESS
4467
+ elif 'on_cancelled' == callback:
4468
+ callback_functions_legacy = []
4469
+ callback_status = CallbackStatus.CANCELLED
4468
4470
 
4469
- # Fetch input variables
4470
- input_vars, kwargs_vars, upstream_block_uuids = self.fetch_input_variables(
4471
- None,
4472
- dynamic_block_index=dynamic_block_index,
4473
- dynamic_block_indexes=dynamic_block_indexes,
4474
- dynamic_upstream_block_uuids=dynamic_upstream_block_uuids,
4475
- execution_partition=execution_partition,
4476
- from_notebook=from_notebook,
4477
- global_vars=global_vars,
4478
- metadata=metadata,
4479
- upstream_block_uuids=[parent_block.uuid] if parent_block else None,
4480
- upstream_block_uuids_override=upstream_block_uuids_override,
4481
- )
4482
-
4483
- # Copied logic from the method self.execute_block
4484
- outputs_from_input_vars = {}
4485
- upstream_block_uuids_length = len(upstream_block_uuids)
4486
- for idx, input_var in enumerate(input_vars):
4487
- if idx < upstream_block_uuids_length:
4488
- upstream_block_uuid = upstream_block_uuids[idx]
4489
- outputs_from_input_vars[upstream_block_uuid] = input_var
4490
- outputs_from_input_vars[f'df_{idx + 1}'] = input_var
4471
+ if callback_status in [CallbackStatus.FAILURE, CallbackStatus.SUCCESS]:
4472
+ # Fetch input variables
4473
+ input_vars, kwargs_vars, upstream_block_uuids = self.fetch_input_variables(
4474
+ None,
4475
+ dynamic_block_index=dynamic_block_index,
4476
+ dynamic_block_indexes=dynamic_block_indexes,
4477
+ dynamic_upstream_block_uuids=dynamic_upstream_block_uuids,
4478
+ execution_partition=execution_partition,
4479
+ from_notebook=from_notebook,
4480
+ global_vars=global_vars,
4481
+ metadata=metadata,
4482
+ upstream_block_uuids=[parent_block.uuid] if parent_block else None,
4483
+ upstream_block_uuids_override=upstream_block_uuids_override,
4484
+ )
4485
+ # Copied logic from the method self.execute_block
4486
+ outputs_from_input_vars = {}
4487
+ upstream_block_uuids_length = len(upstream_block_uuids)
4488
+ for idx, input_var in enumerate(input_vars):
4489
+ if idx < upstream_block_uuids_length:
4490
+ upstream_block_uuid = upstream_block_uuids[idx]
4491
+ outputs_from_input_vars[upstream_block_uuid] = input_var
4492
+ outputs_from_input_vars[f'df_{idx + 1}'] = input_var
4493
+ else:
4494
+ input_vars = []
4495
+ kwargs_vars = []
4496
+ upstream_block_uuids = []
4491
4497
 
4492
4498
  global_vars_copy = global_vars.copy()
4493
4499
  for kwargs_var in kwargs_vars: