orchestrator-core 4.6.5__tar.gz → 4.7.0__tar.gz

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 (392) hide show
  1. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/PKG-INFO +11 -11
  2. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/__init__.py +1 -1
  3. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/api.py +4 -0
  4. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/endpoints/processes.py +25 -9
  5. orchestrator_core-4.7.0/orchestrator/api/api_v1/endpoints/schedules.py +44 -0
  6. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/app.py +34 -1
  7. orchestrator_core-4.7.0/orchestrator/cli/scheduler.py +176 -0
  8. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/search/resize_embedding.py +3 -0
  9. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/models.py +26 -0
  10. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schemas/process.py +2 -2
  11. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schemas/workflow.py +1 -1
  12. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/llm_settings.py +0 -1
  13. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2020-10-19_a76b9185b334_add_generic_workflows_to_core.py +1 -0
  14. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2021-04-06_3c8b9185c221_add_validate_products_task.py +1 -0
  15. orchestrator_core-4.7.0/orchestrator/migrations/versions/schema/2025-11-18_961eddbd4c13_create_linker_table_workflow_apscheduler.py +106 -0
  16. orchestrator_core-4.7.0/orchestrator/migrations/versions/schema/2025-12-10_9736496e3eba_set_is_task_true_on_certain_tasks.py +40 -0
  17. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schedules/__init__.py +8 -7
  18. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schedules/scheduler.py +27 -1
  19. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schedules/scheduling.py +5 -1
  20. orchestrator_core-4.7.0/orchestrator/schedules/service.py +253 -0
  21. orchestrator_core-4.7.0/orchestrator/schemas/schedules.py +71 -0
  22. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/agent/prompts.py +10 -6
  23. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/agent/tools.py +55 -15
  24. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/aggregations/base.py +6 -2
  25. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/query/builder.py +75 -3
  26. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/query/mixins.py +57 -2
  27. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/query/queries.py +15 -1
  28. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/query/validation.py +43 -0
  29. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/processes.py +0 -7
  30. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/workflows.py +4 -0
  31. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/settings.py +48 -0
  32. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/auth.py +2 -2
  33. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/websocket/__init__.py +14 -0
  34. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/workflow.py +1 -1
  35. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/workflows/__init__.py +1 -0
  36. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/workflows/modify_note.py +10 -1
  37. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/workflows/removed_workflow.py +8 -1
  38. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/workflows/tasks/cleanup_tasks_log.py +9 -2
  39. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/workflows/tasks/resume_workflows.py +4 -0
  40. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/workflows/tasks/validate_product_type.py +7 -1
  41. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/workflows/tasks/validate_products.py +9 -1
  42. {orchestrator_core-4.6.5/orchestrator/schedules → orchestrator_core-4.7.0/orchestrator/workflows/tasks}/validate_subscriptions.py +16 -3
  43. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/workflows/translations/en-GB.json +2 -1
  44. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/pyproject.toml +15 -11
  45. orchestrator_core-4.6.5/orchestrator/cli/scheduler.py +0 -61
  46. orchestrator_core-4.6.5/orchestrator/schedules/resume_workflows.py +0 -21
  47. orchestrator_core-4.6.5/orchestrator/schedules/task_vacuum.py +0 -21
  48. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/LICENSE +0 -0
  49. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/README.md +0 -0
  50. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/agentic_app.py +0 -0
  51. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/__init__.py +0 -0
  52. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/__init__.py +0 -0
  53. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/endpoints/__init__.py +0 -0
  54. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/endpoints/agent.py +0 -0
  55. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/endpoints/health.py +0 -0
  56. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/endpoints/product_blocks.py +0 -0
  57. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/endpoints/products.py +0 -0
  58. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/endpoints/resource_types.py +0 -0
  59. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/endpoints/search.py +0 -0
  60. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/endpoints/settings.py +0 -0
  61. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/endpoints/subscription_customer_descriptions.py +0 -0
  62. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/endpoints/subscriptions.py +0 -0
  63. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/endpoints/translations.py +0 -0
  64. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/endpoints/user.py +0 -0
  65. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/endpoints/workflows.py +0 -0
  66. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/api_v1/endpoints/ws.py +0 -0
  67. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/error_handling.py +0 -0
  68. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/helpers.py +0 -0
  69. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/api/models.py +0 -0
  70. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/__init__.py +0 -0
  71. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/database.py +0 -0
  72. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/domain_gen_helpers/__init__.py +0 -0
  73. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/domain_gen_helpers/fixed_input_helpers.py +0 -0
  74. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/domain_gen_helpers/helpers.py +0 -0
  75. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/domain_gen_helpers/product_block_helpers.py +0 -0
  76. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/domain_gen_helpers/product_helpers.py +0 -0
  77. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/domain_gen_helpers/resource_type_helpers.py +0 -0
  78. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/domain_gen_helpers/types.py +0 -0
  79. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generate.py +0 -0
  80. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/__init__.py +0 -0
  81. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/custom_templates/README +0 -0
  82. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/custom_templates/additional_create_imports.j2 +0 -0
  83. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/custom_templates/additional_create_input_fields.j2 +0 -0
  84. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/custom_templates/additional_create_steps.j2 +0 -0
  85. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/custom_templates/additional_modify_imports.j2 +0 -0
  86. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/custom_templates/additional_modify_input_fields.j2 +0 -0
  87. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/custom_templates/additional_modify_steps.j2 +0 -0
  88. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/custom_templates/additional_terminate_imports.j2 +0 -0
  89. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/custom_templates/additional_terminate_input_fields.j2 +0 -0
  90. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/custom_templates/additional_terminate_steps.j2 +0 -0
  91. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/generator/__init__.py +0 -0
  92. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/generator/enums.py +0 -0
  93. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/generator/helpers.py +0 -0
  94. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/generator/migration.py +0 -0
  95. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/generator/product.py +0 -0
  96. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/generator/product_block.py +0 -0
  97. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/generator/settings.py +0 -0
  98. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/generator/translations.py +0 -0
  99. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/generator/unittest.py +0 -0
  100. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/generator/validations.py +0 -0
  101. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/generator/workflow.py +0 -0
  102. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/products/workshop/circuit.yaml +0 -0
  103. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/products/workshop/node.yaml +0 -0
  104. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/products/workshop/user.yaml +0 -0
  105. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/products/workshop/user_group.yaml +0 -0
  106. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/additional_create_imports.j2 +0 -0
  107. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/additional_create_steps.j2 +0 -0
  108. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/additional_modify_imports.j2 +0 -0
  109. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/additional_modify_steps.j2 +0 -0
  110. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/additional_terminate_steps.j2 +0 -0
  111. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/constrained_int_definitions.j2 +0 -0
  112. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/create_data_head.j2 +0 -0
  113. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/create_product.j2 +0 -0
  114. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/enums.j2 +0 -0
  115. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/lazy_workflow_instance.j2 +0 -0
  116. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/list_definitions.j2 +0 -0
  117. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/macros.j2 +0 -0
  118. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/modify_product.j2 +0 -0
  119. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/new_product_migration.j2 +0 -0
  120. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/product.j2 +0 -0
  121. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/product_block.j2 +0 -0
  122. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/shared_forms.j2 +0 -0
  123. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/shared_workflows.j2 +0 -0
  124. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/subscription_model_registry.j2 +0 -0
  125. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/terminate_product.j2 +0 -0
  126. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/test_create_workflow.j2 +0 -0
  127. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/test_modify_workflow.j2 +0 -0
  128. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/test_product_type.j2 +0 -0
  129. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/test_terminate_workflow.j2 +0 -0
  130. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/test_validate_workflow.j2 +0 -0
  131. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/generator/templates/validate_product.j2 +0 -0
  132. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/helpers/__init__.py +0 -0
  133. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/helpers/input_helpers.py +0 -0
  134. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/helpers/print_helpers.py +0 -0
  135. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/main.py +0 -0
  136. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/migrate_domain_models.py +0 -0
  137. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/migrate_tasks.py +0 -0
  138. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/migrate_workflows.py +0 -0
  139. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/migration_helpers.py +0 -0
  140. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/search/__init__.py +0 -0
  141. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/search/display.py +0 -0
  142. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/search/index_llm.py +0 -0
  143. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/search/search_explore.py +0 -0
  144. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/cli/search/speedtest.py +0 -0
  145. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/config/__init__.py +0 -0
  146. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/config/assignee.py +0 -0
  147. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/__init__.py +0 -0
  148. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/database.py +0 -0
  149. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/filters/__init__.py +0 -0
  150. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/filters/filters.py +0 -0
  151. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/filters/process.py +0 -0
  152. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/filters/product.py +0 -0
  153. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/filters/product_block.py +0 -0
  154. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/filters/resource_type.py +0 -0
  155. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/filters/search_filters/__init__.py +0 -0
  156. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/filters/search_filters/inferred_filter.py +0 -0
  157. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/filters/subscription.py +0 -0
  158. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/filters/workflow.py +0 -0
  159. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/helpers.py +0 -0
  160. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/listeners.py +0 -0
  161. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/loaders.py +0 -0
  162. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/queries/__init__.py +0 -0
  163. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/queries/subscription.py +0 -0
  164. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/queries/subscription_instance.py +0 -0
  165. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/range/__init__.py +0 -0
  166. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/range/range.py +0 -0
  167. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/sorting/__init__.py +0 -0
  168. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/sorting/process.py +0 -0
  169. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/sorting/product.py +0 -0
  170. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/sorting/product_block.py +0 -0
  171. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/sorting/resource_type.py +0 -0
  172. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/sorting/sorting.py +0 -0
  173. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/sorting/subscription.py +0 -0
  174. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/db/sorting/workflow.py +0 -0
  175. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/devtools/__init__.py +0 -0
  176. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/devtools/populator.py +0 -0
  177. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/devtools/scripts/__init__.py +0 -0
  178. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/devtools/scripts/migrate_20.py +0 -0
  179. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/devtools/scripts/migrate_30.py +0 -0
  180. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/devtools/scripts/shared.py +0 -0
  181. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/distlock/__init__.py +0 -0
  182. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/distlock/distlock_manager.py +0 -0
  183. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/distlock/managers/__init__.py +0 -0
  184. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/distlock/managers/memory_distlock_manager.py +0 -0
  185. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/distlock/managers/redis_distlock_manager.py +0 -0
  186. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/domain/__init__.py +0 -0
  187. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/domain/base.py +0 -0
  188. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/domain/context_cache.py +0 -0
  189. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/domain/customer_description.py +0 -0
  190. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/domain/helpers.py +0 -0
  191. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/domain/lifecycle.py +0 -0
  192. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/domain/subscription_instance_transform.py +0 -0
  193. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/exception_handlers.py +0 -0
  194. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/forms/__init__.py +0 -0
  195. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/forms/validators/__init__.py +0 -0
  196. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/forms/validators/customer_contact_list.py +0 -0
  197. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/forms/validators/customer_id.py +0 -0
  198. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/forms/validators/display_subscription.py +0 -0
  199. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/forms/validators/network_type_validators.py +0 -0
  200. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/forms/validators/product_id.py +0 -0
  201. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/__init__.py +0 -0
  202. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/autoregistration.py +0 -0
  203. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/extensions/__init__.py +0 -0
  204. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/extensions/model_cache.py +0 -0
  205. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/extensions/stats.py +0 -0
  206. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/loaders/__init__.py +0 -0
  207. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/loaders/subscriptions.py +0 -0
  208. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/mutations/customer_description.py +0 -0
  209. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/mutations/start_process.py +0 -0
  210. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/pagination.py +0 -0
  211. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/resolvers/__init__.py +0 -0
  212. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/resolvers/customer.py +0 -0
  213. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/resolvers/helpers.py +0 -0
  214. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/resolvers/process.py +0 -0
  215. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/resolvers/product.py +0 -0
  216. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/resolvers/product_block.py +0 -0
  217. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/resolvers/resource_type.py +0 -0
  218. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/resolvers/scheduled_tasks.py +0 -0
  219. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/resolvers/settings.py +0 -0
  220. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/resolvers/subscription.py +0 -0
  221. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/resolvers/version.py +0 -0
  222. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/resolvers/workflow.py +0 -0
  223. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schema.py +0 -0
  224. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schemas/__init__.py +0 -0
  225. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schemas/customer.py +0 -0
  226. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schemas/customer_description.py +0 -0
  227. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schemas/errors.py +0 -0
  228. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schemas/fixed_input.py +0 -0
  229. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schemas/helpers.py +0 -0
  230. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schemas/product.py +0 -0
  231. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schemas/product_block.py +0 -0
  232. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schemas/resource_type.py +0 -0
  233. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schemas/scheduled_task.py +0 -0
  234. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schemas/settings.py +0 -0
  235. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schemas/strawberry_pydantic_patch.py +0 -0
  236. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schemas/subscription.py +0 -0
  237. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/schemas/version.py +0 -0
  238. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/types.py +0 -0
  239. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/utils/__init__.py +0 -0
  240. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/utils/create_resolver_error_handler.py +0 -0
  241. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/utils/get_query_loaders.py +0 -0
  242. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/utils/get_selected_fields.py +0 -0
  243. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/utils/get_selected_paths.py +0 -0
  244. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/utils/get_subscription_product_blocks.py +0 -0
  245. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/utils/is_query_detailed.py +0 -0
  246. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/utils/override_class.py +0 -0
  247. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/graphql/utils/to_graphql_result_page.py +0 -0
  248. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/log_config.py +0 -0
  249. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/metrics/__init__.py +0 -0
  250. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/metrics/engine.py +0 -0
  251. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/metrics/init.py +0 -0
  252. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/metrics/processes.py +0 -0
  253. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/metrics/subscriptions.py +0 -0
  254. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/README +0 -0
  255. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/__init__.py +0 -0
  256. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/alembic.ini +0 -0
  257. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/env.py +0 -0
  258. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/helpers.py +0 -0
  259. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/script.py.mako +0 -0
  260. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/templates/alembic.ini.j2 +0 -0
  261. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/templates/env.py.j2 +0 -0
  262. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/templates/helpers.py.j2 +0 -0
  263. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2020-10-19_3323bcb934e7_fix_tsv_triggers.py +0 -0
  264. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2020-10-19_c112305b07d3_initial_schema_migration.py +0 -0
  265. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2021-07-01_6896a54e9483_add_product_block_relations.py +0 -0
  266. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2021-11-17_19cdd3ab86f6_fix_parse_websearch.py +0 -0
  267. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2022-02-16_bed6bc0b197a_rename_parent_and_child_block_relations.py +0 -0
  268. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2023-03-06_e05bb1967eff_add_subscriptions_search_view.py +0 -0
  269. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2023-05-25_b1970225392d_add_subscription_metadata_workflow.py +0 -0
  270. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2023-06-28_a09ac125ea73_add_throttling_to_refresh_subscriptions.py +0 -0
  271. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2023-06-28_a09ac125ea73_add_throttling_to_refresh_subscriptions.sql +0 -0
  272. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2023-07-17_165303a20fb1_customer_id_to_varchar.py +0 -0
  273. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2023-07-17_165303a20fb1_customer_id_to_varchar.sql +0 -0
  274. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2023-09-25_da5c9f4cce1c_add_subscription_metadata_to_fulltext_.py +0 -0
  275. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2023-09-25_da5c9f4cce1c_add_subscription_metadata_to_fulltext_.sql +0 -0
  276. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2023-12-06_048219045729_add_workflow_id_to_processes_table.py +0 -0
  277. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2024-09-27_460ec6748e37_add_uuid_search_workaround.py +0 -0
  278. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2024-09-27_460ec6748e37_add_uuid_search_workaround.sql +0 -0
  279. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2025-01-08_4c5859620539_add_version_column_to_subscription.py +0 -0
  280. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2025-01-19_4fjdn13f83ga_add_validate_product_type_task.py +0 -0
  281. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2025-02-12_bac6be6f2b4f_added_input_state_table.py +0 -0
  282. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2025-02-20_68d14db1b8da_make_workflow_description_mandatory.py +0 -0
  283. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_instance_as_json_function.py +0 -0
  284. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_instance_as_json_function.sql +0 -0
  285. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2025-04-09_fc5c993a4b4a_add_cascade_constraint_on_processes_.py +0 -0
  286. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2025-05-08_161918133bec_add_is_task_to_workflow.py +0 -0
  287. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2025-07-01_93fc5834c7e5_changed_timestamping_fields_in_process_steps.py +0 -0
  288. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2025-07-04_4b58e336d1bf_deprecating_workflow_target_in_.py +0 -0
  289. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/migrations/versions/schema/2025-07-28_850dccac3b02_update_description_of_resume_workflows_.py +0 -0
  290. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/py.typed +0 -0
  291. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schedules/validate_products.py +0 -0
  292. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schemas/__init__.py +0 -0
  293. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schemas/base.py +0 -0
  294. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schemas/engine_settings.py +0 -0
  295. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schemas/fixed_input.py +0 -0
  296. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schemas/problem_detail.py +0 -0
  297. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schemas/process.py +0 -0
  298. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schemas/product.py +0 -0
  299. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schemas/product_block.py +0 -0
  300. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schemas/resource_type.py +0 -0
  301. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schemas/search.py +0 -0
  302. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schemas/search_requests.py +0 -0
  303. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schemas/subscription.py +0 -0
  304. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schemas/subscription_descriptions.py +0 -0
  305. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/schemas/workflow.py +0 -0
  306. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/__init__.py +0 -0
  307. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/agent/__init__.py +0 -0
  308. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/agent/agent.py +0 -0
  309. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/agent/handlers.py +0 -0
  310. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/agent/json_patch.py +0 -0
  311. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/agent/state.py +0 -0
  312. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/agent/validation.py +0 -0
  313. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/aggregations/__init__.py +0 -0
  314. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/core/__init__.py +0 -0
  315. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/core/embedding.py +0 -0
  316. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/core/exceptions.py +0 -0
  317. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/core/types.py +0 -0
  318. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/core/validators.py +0 -0
  319. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/docs/index.md +0 -0
  320. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/docs/running_local_text_embedding_inference.md +0 -0
  321. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/filters/__init__.py +0 -0
  322. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/filters/base.py +0 -0
  323. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/filters/date_filters.py +0 -0
  324. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/filters/definitions.py +0 -0
  325. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/filters/ltree_filters.py +0 -0
  326. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/filters/numeric_filter.py +0 -0
  327. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/indexing/__init__.py +0 -0
  328. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/indexing/indexer.py +0 -0
  329. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/indexing/registry.py +0 -0
  330. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/indexing/tasks.py +0 -0
  331. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/indexing/traverse.py +0 -0
  332. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/llm_migration.py +0 -0
  333. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/query/__init__.py +0 -0
  334. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/query/engine.py +0 -0
  335. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/query/exceptions.py +0 -0
  336. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/query/export.py +0 -0
  337. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/query/results.py +0 -0
  338. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/query/state.py +0 -0
  339. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/retrieval/__init__.py +0 -0
  340. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/retrieval/pagination.py +0 -0
  341. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/retrieval/retrievers/__init__.py +0 -0
  342. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/retrieval/retrievers/base.py +0 -0
  343. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/retrieval/retrievers/fuzzy.py +0 -0
  344. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/retrieval/retrievers/hybrid.py +0 -0
  345. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/retrieval/retrievers/process.py +0 -0
  346. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/retrieval/retrievers/semantic.py +0 -0
  347. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/search/retrieval/retrievers/structured.py +0 -0
  348. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/security.py +0 -0
  349. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/__init__.py +0 -0
  350. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/executors/__init__.py +0 -0
  351. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/executors/celery.py +0 -0
  352. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/executors/threadpool.py +0 -0
  353. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/fixed_inputs.py +0 -0
  354. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/input_state.py +0 -0
  355. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/process_broadcast_thread.py +0 -0
  356. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/products.py +0 -0
  357. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/resource_types.py +0 -0
  358. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/settings.py +0 -0
  359. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/settings_env_variables.py +0 -0
  360. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/subscription_relations.py +0 -0
  361. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/subscriptions.py +0 -0
  362. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/tasks.py +0 -0
  363. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/services/translations.py +0 -0
  364. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/targets.py +0 -0
  365. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/types.py +0 -0
  366. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/__init__.py +0 -0
  367. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/crypt.py +0 -0
  368. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/datetime.py +0 -0
  369. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/deprecation_logger.py +0 -0
  370. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/docs.py +0 -0
  371. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/enrich_process.py +0 -0
  372. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/errors.py +0 -0
  373. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/expose_settings.py +0 -0
  374. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/fixed_inputs.py +0 -0
  375. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/functional.py +0 -0
  376. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/get_subscription_dict.py +0 -0
  377. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/get_updated_properties.py +0 -0
  378. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/helpers.py +0 -0
  379. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/json.py +0 -0
  380. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/redis.py +0 -0
  381. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/redis_client.py +0 -0
  382. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/search_query.py +0 -0
  383. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/state.py +0 -0
  384. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/strings.py +0 -0
  385. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/utils/validate_data_version.py +0 -0
  386. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/version.py +0 -0
  387. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/websocket/managers/broadcast_websocket_manager.py +0 -0
  388. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/websocket/managers/memory_websocket_manager.py +0 -0
  389. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/websocket/websocket_manager.py +0 -0
  390. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/workflows/steps.py +0 -0
  391. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/workflows/tasks/__init__.py +0 -0
  392. {orchestrator_core-4.6.5 → orchestrator_core-4.7.0}/orchestrator/workflows/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orchestrator-core
3
- Version: 4.6.5
3
+ Version: 4.7.0
4
4
  Summary: This is the orchestrator workflow engine.
5
5
  Author-email: SURF <automation-beheer@surf.nl>
6
6
  Requires-Python: >=3.11,<3.15
@@ -37,14 +37,14 @@ Requires-Dist: apscheduler>=3.11.0
37
37
  Requires-Dist: click==8.*
38
38
  Requires-Dist: deepmerge==2.0
39
39
  Requires-Dist: deprecated>=1.2.18
40
- Requires-Dist: fastapi~=0.121.1
40
+ Requires-Dist: fastapi~=0.124.0
41
41
  Requires-Dist: fastapi-etag==0.4.0
42
42
  Requires-Dist: itsdangerous>=2.2.0
43
43
  Requires-Dist: jinja2==3.1.6
44
44
  Requires-Dist: more-itertools~=10.8.0
45
45
  Requires-Dist: nwa-stdlib~=1.11.0
46
46
  Requires-Dist: oauth2-lib>=2.5.0
47
- Requires-Dist: orjson==3.11.4
47
+ Requires-Dist: orjson==3.11.5
48
48
  Requires-Dist: pgvector>=0.4.1
49
49
  Requires-Dist: prometheus-client==0.23.1
50
50
  Requires-Dist: psycopg2-binary==2.9.11
@@ -52,23 +52,23 @@ Requires-Dist: pydantic-forms>=1.4.0
52
52
  Requires-Dist: pydantic-settings~=2.12.0
53
53
  Requires-Dist: pydantic[email]~=2.12.4
54
54
  Requires-Dist: python-dateutil==2.9.0.post0
55
- Requires-Dist: python-rapidjson>=1.22,<1.23
55
+ Requires-Dist: python-rapidjson>=1.23,<1.24
56
56
  Requires-Dist: pytz==2025.2
57
- Requires-Dist: redis==5.3.1
57
+ Requires-Dist: redis==7.1.0
58
58
  Requires-Dist: semver==3.0.4
59
59
  Requires-Dist: sentry-sdk[fastapi]>=2.29.1
60
- Requires-Dist: sqlalchemy==2.0.44
61
- Requires-Dist: sqlalchemy-utils==0.42.0
60
+ Requires-Dist: sqlalchemy==2.0.45
61
+ Requires-Dist: sqlalchemy-utils==0.42.1
62
62
  Requires-Dist: strawberry-graphql>=0.281.0,<0.285.0
63
63
  Requires-Dist: structlog>=25.4.0
64
64
  Requires-Dist: tabulate==0.9.0
65
65
  Requires-Dist: typer==0.20.0
66
66
  Requires-Dist: uvicorn[standard]~=0.38.0
67
- Requires-Dist: pydantic-ai-slim >=1.9.0 ; extra == "agent"
68
- Requires-Dist: ag-ui-protocol>=0.1.8 ; extra == "agent"
67
+ Requires-Dist: pydantic-ai-slim >=1.27.0 ; extra == "agent"
68
+ Requires-Dist: ag-ui-protocol>=0.1.10 ; extra == "agent"
69
69
  Requires-Dist: litellm>=1.75.7 ; extra == "agent"
70
- Requires-Dist: celery~=5.5.1 ; extra == "celery"
71
- Requires-Dist: litellm>=1.75.7 ; extra == "search"
70
+ Requires-Dist: celery~=5.6.0 ; extra == "celery"
71
+ Requires-Dist: litellm>=1.80.0 ; extra == "search"
72
72
  Project-URL: Documentation, https://workfloworchestrator.org/orchestrator-core
73
73
  Project-URL: Homepage, https://workfloworchestrator.org/orchestrator-core
74
74
  Project-URL: Source, https://github.com/workfloworchestrator/orchestrator-core
@@ -13,7 +13,7 @@
13
13
 
14
14
  """This is the orchestrator workflow engine."""
15
15
 
16
- __version__ = "4.6.5"
16
+ __version__ = "4.7.0"
17
17
 
18
18
 
19
19
  from structlog import get_logger
@@ -22,6 +22,7 @@ from orchestrator.api.api_v1.endpoints import (
22
22
  product_blocks,
23
23
  products,
24
24
  resource_types,
25
+ schedules,
25
26
  settings,
26
27
  subscription_customer_descriptions,
27
28
  subscriptions,
@@ -88,6 +89,9 @@ api_router.include_router(
88
89
  api_router.include_router(
89
90
  ws.router, prefix="/ws", tags=["Core", "Events"]
90
91
  ) # Auth on the websocket is handled in the Websocket Manager
92
+ api_router.include_router(
93
+ schedules.router, prefix="/schedules", tags=["Core", "Schedules"], dependencies=[Depends(authorize)]
94
+ )
91
95
 
92
96
  if llm_settings.SEARCH_ENABLED:
93
97
  from orchestrator.api.api_v1.endpoints import search
@@ -13,6 +13,7 @@
13
13
 
14
14
  """Module that implements process related API endpoints."""
15
15
 
16
+ import asyncio
16
17
  import struct
17
18
  import zlib
18
19
  from http import HTTPStatus
@@ -62,10 +63,12 @@ from orchestrator.utils.enrich_process import enrich_process
62
63
  from orchestrator.websocket import (
63
64
  WS_CHANNELS,
64
65
  broadcast_invalidate_status_counts,
66
+ broadcast_invalidate_status_counts_async,
65
67
  broadcast_process_update_to_websocket,
66
68
  websocket_manager,
67
69
  )
68
70
  from orchestrator.workflow import ProcessStat, ProcessStatus, StepList, Workflow
71
+ from orchestrator.workflows import get_workflow
69
72
  from pydantic_forms.types import JSON, State
70
73
 
71
74
  router = APIRouter()
@@ -175,7 +178,7 @@ def delete(process_id: UUID) -> None:
175
178
  status_code=HTTPStatus.CREATED,
176
179
  dependencies=[Depends(check_global_lock, use_cache=False)],
177
180
  )
178
- def new_process(
181
+ async def new_process(
179
182
  workflow_key: str,
180
183
  request: Request,
181
184
  json_data: list[dict[str, Any]] | None = Body(...),
@@ -183,8 +186,21 @@ def new_process(
183
186
  user_model: OIDCUserModel | None = Depends(authenticate),
184
187
  ) -> dict[str, UUID]:
185
188
  broadcast_func = api_broadcast_process_data(request)
186
- process_id = start_process(
187
- workflow_key, user_inputs=json_data, user_model=user_model, user=user, broadcast_func=broadcast_func
189
+
190
+ workflow = get_workflow(workflow_key)
191
+ if not workflow:
192
+ raise_status(HTTPStatus.NOT_FOUND, "Workflow does not exist")
193
+
194
+ if not await workflow.authorize_callback(user_model):
195
+ raise_status(HTTPStatus.FORBIDDEN, f"User is not authorized to execute '{workflow_key}' workflow")
196
+
197
+ process_id = await asyncio.to_thread(
198
+ start_process,
199
+ workflow_key,
200
+ user_inputs=json_data,
201
+ user_model=user_model,
202
+ user=user,
203
+ broadcast_func=broadcast_func,
188
204
  )
189
205
 
190
206
  return {"id": process_id}
@@ -196,14 +212,14 @@ def new_process(
196
212
  status_code=HTTPStatus.NO_CONTENT,
197
213
  dependencies=[Depends(check_global_lock, use_cache=False)],
198
214
  )
199
- def resume_process_endpoint(
215
+ async def resume_process_endpoint(
200
216
  process_id: UUID,
201
217
  request: Request,
202
218
  json_data: JSON = Body(...),
203
219
  user: str = Depends(user_name),
204
220
  user_model: OIDCUserModel | None = Depends(authenticate),
205
221
  ) -> None:
206
- process = _get_process(process_id)
222
+ process = await asyncio.to_thread(_get_process, process_id)
207
223
 
208
224
  if not can_be_resumed(process.last_status):
209
225
  raise_status(HTTPStatus.CONFLICT, f"Resuming a {process.last_status.lower()} workflow is not possible")
@@ -211,16 +227,16 @@ def resume_process_endpoint(
211
227
  pstat = load_process(process)
212
228
  auth_resume, auth_retry = get_auth_callbacks(get_steps_to_evaluate_for_rbac(pstat), pstat.workflow)
213
229
  if process.last_status == ProcessStatus.SUSPENDED:
214
- if auth_resume is not None and not auth_resume(user_model):
230
+ if auth_resume is not None and not (await auth_resume(user_model)):
215
231
  raise_status(HTTPStatus.FORBIDDEN, "User is not authorized to resume step")
216
232
  elif process.last_status in (ProcessStatus.FAILED, ProcessStatus.WAITING):
217
- if auth_retry is not None and not auth_retry(user_model):
233
+ if auth_retry is not None and not (await auth_retry(user_model)):
218
234
  raise_status(HTTPStatus.FORBIDDEN, "User is not authorized to retry step")
219
235
 
220
- broadcast_invalidate_status_counts()
236
+ await broadcast_invalidate_status_counts_async()
221
237
  broadcast_func = api_broadcast_process_data(request)
222
238
 
223
- resume_process(process, user=user, user_inputs=json_data, broadcast_func=broadcast_func)
239
+ await asyncio.to_thread(resume_process, process, user=user, user_inputs=json_data, broadcast_func=broadcast_func)
224
240
 
225
241
 
226
242
  @router.post(
@@ -0,0 +1,44 @@
1
+ # Copyright 2019-2025 SURF.
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+ from http import HTTPStatus
14
+
15
+ import structlog
16
+ from fastapi.routing import APIRouter
17
+
18
+ from orchestrator.schedules.service import add_scheduled_task_to_queue
19
+ from orchestrator.schemas.schedules import APSchedulerJobCreate, APSchedulerJobDelete, APSchedulerJobUpdate
20
+
21
+ logger = structlog.get_logger(__name__)
22
+
23
+ router: APIRouter = APIRouter()
24
+
25
+
26
+ @router.post("/", status_code=HTTPStatus.CREATED)
27
+ def create_scheduled_task(payload: APSchedulerJobCreate) -> dict[str, str]:
28
+ """Create a scheduled task."""
29
+ add_scheduled_task_to_queue(payload)
30
+ return {"message": "Added to Create Queue", "status": "CREATED"}
31
+
32
+
33
+ @router.put("/", status_code=HTTPStatus.OK)
34
+ async def update_scheduled_task(payload: APSchedulerJobUpdate) -> dict[str, str]:
35
+ """Update a scheduled task."""
36
+ add_scheduled_task_to_queue(payload)
37
+ return {"message": "Added to Update Queue", "status": "UPDATED"}
38
+
39
+
40
+ @router.delete("/", status_code=HTTPStatus.OK)
41
+ async def delete_scheduled_task(payload: APSchedulerJobDelete) -> dict[str, str]:
42
+ """Delete a scheduled task."""
43
+ add_scheduled_task_to_queue(payload)
44
+ return {"message": "Added to Delete Queue", "status": "DELETED"}
@@ -57,7 +57,8 @@ from orchestrator.graphql.types import ScalarOverrideType, StrawberryModelType
57
57
  from orchestrator.log_config import LOGGER_OVERRIDES
58
58
  from orchestrator.metrics import ORCHESTRATOR_METRICS_REGISTRY, initialize_default_metrics
59
59
  from orchestrator.services.process_broadcast_thread import ProcessDataBroadcastThread
60
- from orchestrator.settings import AppSettings, ExecutorType, app_settings
60
+ from orchestrator.settings import AppSettings, ExecutorType, app_settings, get_authorizers
61
+ from orchestrator.utils.auth import Authorizer
61
62
  from orchestrator.version import GIT_COMMIT_HASH
62
63
  from orchestrator.websocket import init_websocket_manager
63
64
  from pydantic_forms.exception_handlers.fastapi import form_error_handler
@@ -311,6 +312,38 @@ class OrchestratorCore(FastAPI):
311
312
  """
312
313
  self.auth_manager.graphql_authorization = graphql_authorization_instance
313
314
 
315
+ def register_internal_authorize_callback(self, callback: Authorizer) -> None:
316
+ """Registers the authorize_callback for WFO's internal workflows and tasks.
317
+
318
+ Since RBAC policies are applied to workflows via decorator, this enables registration of callbacks
319
+ for workflows defined in orchestrator-core itself.
320
+ However, this assignment MUST be made before any workflows are run.
321
+
322
+ Args:
323
+ callback (Authorizer): The async Authorizer to run for the `authorize_callback` argument of internal workflows.
324
+
325
+ Returns:
326
+ None
327
+ """
328
+ authorizers = get_authorizers()
329
+ authorizers.internal_authorize_callback = callback
330
+
331
+ def register_internal_retry_auth_callback(self, callback: Authorizer) -> None:
332
+ """Registers the retry_auth_callback for WFO's internal workflows and tasks.
333
+
334
+ Since RBAC policies are applied to workflows via decorator, this enables registration of callbacks
335
+ for workflows defined in orchestrator-core itself.
336
+ However, this assignment MUST be made before any workflows are run.
337
+
338
+ Args:
339
+ callback (Authorizer): The async Authorizer to run for the `retry_auth_callback` argument of internal workflows.
340
+
341
+ Returns:
342
+ None
343
+ """
344
+ authorizers = get_authorizers()
345
+ authorizers.internal_retry_auth_callback = callback
346
+
314
347
 
315
348
  main_typer_app = typer.Typer()
316
349
  main_typer_app.add_typer(cli_app, name="orchestrator", help="The orchestrator CLI commands")
@@ -0,0 +1,176 @@
1
+ # Copyright 2019-2020 SURF.
2
+ # Licensed under the Apache License, Version 2.0 (the "License");
3
+ # you may not use this file except in compliance with the License.
4
+ # You may obtain a copy of the License at
5
+ #
6
+ # http://www.apache.org/licenses/LICENSE-2.0
7
+ #
8
+ # Unless required by applicable law or agreed to in writing, software
9
+ # distributed under the License is distributed on an "AS IS" BASIS,
10
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11
+ # See the License for the specific language governing permissions and
12
+ # limitations under the License.
13
+ import time
14
+ from typing import cast
15
+
16
+ import typer
17
+ from redis import Redis
18
+
19
+ from orchestrator.schedules.scheduler import (
20
+ get_all_scheduler_tasks,
21
+ get_scheduler,
22
+ get_scheduler_task,
23
+ )
24
+ from orchestrator.schedules.service import (
25
+ SCHEDULER_QUEUE,
26
+ add_scheduled_task_to_queue,
27
+ workflow_scheduler_queue,
28
+ )
29
+ from orchestrator.schemas.schedules import APSchedulerJobCreate
30
+ from orchestrator.services.workflows import get_workflow_by_name
31
+ from orchestrator.settings import app_settings
32
+ from orchestrator.utils.redis_client import create_redis_client
33
+
34
+ app: typer.Typer = typer.Typer()
35
+
36
+
37
+ @app.command()
38
+ def run() -> None:
39
+ """Starts the scheduler in the foreground.
40
+
41
+ While running, this process will:
42
+
43
+ * Periodically wake up when the next schedule is due for execution, and run it
44
+ * Process schedule changes made through the schedule API
45
+ """
46
+
47
+ def _get_scheduled_task_item_from_queue(redis_conn: Redis) -> tuple[str, bytes] | None:
48
+ """Get an item from the Redis Queue for scheduler tasks."""
49
+ try:
50
+ return redis_conn.brpop(SCHEDULER_QUEUE, timeout=1)
51
+ except ConnectionError as e:
52
+ typer.echo(f"There was a connection error with Redis. Retrying in 3 seconds... {e}")
53
+ time.sleep(3)
54
+ except Exception as e:
55
+ typer.echo(f"There was an unexpected error with Redis. Retrying in 1 second... {e}")
56
+ time.sleep(1)
57
+
58
+ return None
59
+
60
+ with get_scheduler() as scheduler_connection:
61
+ redis_connection = create_redis_client(app_settings.CACHE_URI)
62
+ while True:
63
+ item = _get_scheduled_task_item_from_queue(redis_connection)
64
+ if not item:
65
+ continue
66
+
67
+ workflow_scheduler_queue(item, scheduler_connection)
68
+
69
+
70
+ @app.command()
71
+ def show_schedule() -> None:
72
+ """The `show-schedule` command shows an overview of the scheduled jobs."""
73
+ from rich.console import Console
74
+ from rich.table import Table
75
+
76
+ from orchestrator.schedules.service import get_linker_entries_by_schedule_ids
77
+
78
+ console = Console()
79
+
80
+ table = Table(title="Scheduled Tasks")
81
+ table.add_column("id", no_wrap=True)
82
+ table.add_column("name")
83
+ table.add_column("source")
84
+ table.add_column("next run time")
85
+ table.add_column("trigger")
86
+
87
+ scheduled_tasks = get_all_scheduler_tasks()
88
+ _schedule_ids = [task.id for task in scheduled_tasks]
89
+ api_managed = {str(i.schedule_id) for i in get_linker_entries_by_schedule_ids(_schedule_ids)}
90
+
91
+ for task in scheduled_tasks:
92
+ source = "API" if task.id in api_managed else "decorator"
93
+ run_time = str(task.next_run_time.replace(microsecond=0))
94
+ table.add_row(task.id, task.name, source, str(run_time), str(task.trigger))
95
+
96
+ console.print(table)
97
+
98
+
99
+ @app.command()
100
+ def force(task_id: str) -> None:
101
+ """Force the execution of (a) scheduler(s) based on a schedule ID.
102
+
103
+ Use the `show-schedule` command to determine the ID of the schedule to execute.
104
+
105
+ CLI Arguments:
106
+ ```sh
107
+ Arguments:
108
+ SCHEDULE_ID ID of the schedule to execute
109
+ ```
110
+ """
111
+ task = get_scheduler_task(task_id)
112
+
113
+ if not task:
114
+ typer.echo(f"Task '{task_id}' not found.")
115
+ raise typer.Exit(code=1)
116
+
117
+ typer.echo(f"Running Task [{task.id}] now...")
118
+ try:
119
+ task.func(*task.args or (), **task.kwargs or {})
120
+ typer.echo("Task executed successfully.")
121
+ except Exception as e:
122
+ typer.echo(f"Task execution failed: {e}")
123
+ raise typer.Exit(code=1)
124
+
125
+
126
+ @app.command()
127
+ def load_initial_schedule() -> None:
128
+ """The `load-initial-schedule` command loads the initial schedule using the scheduler API.
129
+
130
+ The initial schedules are:
131
+ - Task Resume Workflows
132
+ - Task Clean Up Tasks
133
+ - Task Validate Subscriptions
134
+
135
+ !!! Warning
136
+ This command is not idempotent.
137
+
138
+ Please run `show-schedule` first to determine if the schedules already exist.
139
+ """
140
+ initial_schedules = [
141
+ {
142
+ "name": "Task Resume Workflows",
143
+ "workflow_name": "task_resume_workflows",
144
+ "workflow_id": "",
145
+ "trigger": "interval",
146
+ "trigger_kwargs": {"hours": 1},
147
+ },
148
+ {
149
+ "name": "Task Clean Up Tasks",
150
+ "workflow_name": "task_clean_up_tasks",
151
+ "workflow_id": "",
152
+ "trigger": "interval",
153
+ "trigger_kwargs": {"hours": 6},
154
+ },
155
+ {
156
+ "name": "Task Validate Subscriptions",
157
+ "workflow_name": "task_validate_subscriptions",
158
+ "workflow_id": "",
159
+ "trigger": "cron",
160
+ "trigger_kwargs": {"hour": 0, "minute": 10},
161
+ },
162
+ ]
163
+
164
+ for schedule in initial_schedules:
165
+ # enrich with workflow id
166
+ workflow_name = cast(str, schedule.get("workflow_name"))
167
+ workflow = get_workflow_by_name(workflow_name)
168
+
169
+ if not workflow:
170
+ typer.echo(f"Workflow '{schedule['workflow_name']}' not found. Skipping schedule.")
171
+ continue
172
+
173
+ schedule["workflow_id"] = workflow.workflow_id
174
+
175
+ typer.echo(f"Initial Schedule: {schedule}")
176
+ add_scheduled_task_to_queue(APSchedulerJobCreate(**schedule)) # type: ignore
@@ -75,6 +75,9 @@ def alter_embedding_column_dimension(new_dimension: int) -> None:
75
75
  db.session.execute(text(f"ALTER TABLE search_queries ADD COLUMN query_embedding vector({new_dimension})"))
76
76
 
77
77
  db.session.commit()
78
+
79
+ db.session.close()
80
+
78
81
  logger.info(f"Altered embedding columns to dimension {new_dimension} in ai_search_index and search_queries")
79
82
 
80
83
  except SQLAlchemyError as e:
@@ -29,9 +29,11 @@ from sqlalchemy import (
29
29
  CheckConstraint,
30
30
  Column,
31
31
  Enum,
32
+ Float,
32
33
  ForeignKey,
33
34
  Index,
34
35
  Integer,
36
+ LargeBinary,
35
37
  PrimaryKeyConstraint,
36
38
  Select,
37
39
  String,
@@ -796,3 +798,27 @@ class AiSearchIndex(BaseModel):
796
798
  content_hash = mapped_column(String(64), nullable=False, index=True)
797
799
 
798
800
  __table_args__ = (PrimaryKeyConstraint("entity_id", "path", name="pk_ai_search_index"),)
801
+
802
+
803
+ class APSchedulerJobStoreModel(BaseModel):
804
+ __tablename__ = "apscheduler_jobs"
805
+
806
+ id = mapped_column(String(191), primary_key=True)
807
+ next_run_time = mapped_column(Float, nullable=True)
808
+ job_state = mapped_column(LargeBinary, nullable=False)
809
+
810
+
811
+ class WorkflowApschedulerJob(BaseModel):
812
+ __tablename__ = "workflows_apscheduler_jobs"
813
+
814
+ workflow_id = mapped_column(
815
+ UUIDType, ForeignKey("workflows.workflow_id", ondelete="CASCADE"), primary_key=True, nullable=False
816
+ )
817
+
818
+ # Notice the VARCHAR(512) for schedule_id to accommodate longer IDs so
819
+ # that if APScheduler changes its ID format in the future, we are covered.
820
+ schedule_id = mapped_column(
821
+ String(512), ForeignKey("apscheduler_jobs.id", ondelete="CASCADE"), primary_key=True, nullable=False
822
+ )
823
+
824
+ __table_args__ = (UniqueConstraint("workflow_id", "schedule_id", name="uq_workflow_schedule"),)
@@ -89,8 +89,8 @@ class ProcessType:
89
89
  auth_resume, auth_retry = get_auth_callbacks(get_steps_to_evaluate_for_rbac(process), workflow)
90
90
 
91
91
  return FormUserPermissionsType(
92
- retryAllowed=bool(auth_retry and auth_retry(oidc_user)),
93
- resumeAllowed=bool(auth_resume and auth_resume(oidc_user)),
92
+ retryAllowed=bool(auth_retry and await auth_retry(oidc_user)),
93
+ resumeAllowed=bool(auth_resume and await auth_resume(oidc_user)),
94
94
  )
95
95
 
96
96
  @authenticated_field(description="Returns list of subscriptions of the process") # type: ignore
@@ -38,4 +38,4 @@ class Workflow:
38
38
  workflow_table = get_original_model(self, WorkflowTable)
39
39
  workflow = get_workflow(workflow_table.name)
40
40
 
41
- return workflow.authorize_callback(oidc_user) # type: ignore
41
+ return await workflow.authorize_callback(oidc_user) # type: ignore
@@ -34,7 +34,6 @@ EMBEDDING_DIMENSION_FIELD = Annotated[
34
34
 
35
35
 
36
36
  class LLMSettings(BaseSettings):
37
-
38
37
  # Feature flags for LLM functionality
39
38
  SEARCH_ENABLED: bool = False # Enable search/indexing with embeddings
40
39
  AGENT_ENABLED: bool = False # Enable agentic functionality
@@ -17,6 +17,7 @@ down_revision = "c112305b07d3"
17
17
  branch_labels = None
18
18
  depends_on = None
19
19
 
20
+ # NOTE: this migration forgot to insert these workflows with is_task=true. Make sure to correct that if you copy this.
20
21
  workflows = [
21
22
  {"name": "modify_note", "description": "Modify Note", "workflow_id": uuid4(), "target": "MODIFY"},
22
23
  {"name": "task_clean_up_tasks", "description": "Clean up old tasks", "workflow_id": uuid4(), "target": "SYSTEM"},
@@ -17,6 +17,7 @@ down_revision = "3323bcb934e7"
17
17
  branch_labels = None
18
18
  depends_on = None
19
19
 
20
+ # NOTE: this migration forgot to insert these workflows with is_task=true. Make sure to correct that if you copy this.
20
21
  workflows = [
21
22
  {"name": "task_validate_products", "description": "Validate products", "workflow_id": uuid4(), "target": "SYSTEM"},
22
23
  ]
@@ -0,0 +1,106 @@
1
+ """Create linker table workflow_apscheduler.
2
+
3
+ Revision ID: 961eddbd4c13
4
+ Revises: 850dccac3b02
5
+ Create Date: 2025-11-18 10:38:57.211087
6
+
7
+ """
8
+
9
+ from uuid import uuid4
10
+
11
+ import sqlalchemy as sa
12
+ from alembic import op
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision = "961eddbd4c13"
16
+ down_revision = "850dccac3b02"
17
+ branch_labels = None
18
+ depends_on = None
19
+
20
+ # NOTE: this migration forgot to insert these workflows with is_task=true. Make sure to correct that if you copy this.
21
+ workflows = [
22
+ {
23
+ "name": "task_validate_subscriptions",
24
+ "description": "Validate subscriptions",
25
+ "workflow_id": uuid4(),
26
+ "target": "SYSTEM",
27
+ },
28
+ ]
29
+
30
+
31
+ def _create_workflows() -> None:
32
+ conn = op.get_bind()
33
+ for workflow in workflows:
34
+ conn.execute(
35
+ sa.text(
36
+ "INSERT INTO workflows VALUES (:workflow_id, :name, :target, :description, now()) ON CONFLICT DO NOTHING"
37
+ ),
38
+ workflow,
39
+ )
40
+
41
+
42
+ def _downgrade_create_workflows() -> None:
43
+ conn = op.get_bind()
44
+ for workflow in workflows:
45
+ conn.execute(sa.text("DELETE FROM workflows WHERE name = :name"), {"name": workflow["name"]})
46
+
47
+
48
+ def _create_apscheduler_jobs_table_if_not_exists() -> None:
49
+ # Check if the apscheduler_jobs table exists and create it if it does not exist.
50
+ conn = op.get_bind()
51
+ inspector = sa.inspect(conn)
52
+ if "apscheduler_jobs" not in inspector.get_table_names():
53
+ op.execute(
54
+ sa.text(
55
+ """
56
+ CREATE TABLE apscheduler_jobs
57
+ (
58
+ id VARCHAR(191) NOT NULL PRIMARY KEY,
59
+ next_run_time DOUBLE PRECISION,
60
+ job_state bytea NOT NULL
61
+ );
62
+ """
63
+ )
64
+ )
65
+
66
+
67
+ def _create_workflows_table_if_not_exists() -> None:
68
+ # Notice the VARCHAR(512) for schedule_id to accommodate longer IDs
69
+ # This so that if APScheduler changes its ID format in the future, we are covered.
70
+ op.execute(
71
+ sa.text(
72
+ """
73
+ CREATE TABLE workflows_apscheduler_jobs (
74
+ workflow_id UUID NOT NULL,
75
+ schedule_id VARCHAR(512) NOT NULL,
76
+ PRIMARY KEY (workflow_id, schedule_id),
77
+ CONSTRAINT fk_workflow
78
+ FOREIGN KEY (workflow_id) REFERENCES public.workflows (workflow_id)
79
+ ON DELETE CASCADE,
80
+ CONSTRAINT fk_schedule
81
+ FOREIGN KEY (schedule_id) REFERENCES public.apscheduler_jobs (id)
82
+ ON DELETE CASCADE,
83
+ CONSTRAINT uq_workflow_schedule UNIQUE (workflow_id, schedule_id)
84
+ );
85
+ """
86
+ )
87
+ )
88
+
89
+ op.create_index("ix_workflows_apscheduler_jobs_schedule_id", "workflows_apscheduler_jobs", ["schedule_id"])
90
+
91
+
92
+ def upgrade() -> None:
93
+ _create_apscheduler_jobs_table_if_not_exists()
94
+ _create_workflows_table_if_not_exists()
95
+ _create_workflows()
96
+
97
+
98
+ def downgrade() -> None:
99
+ op.execute(
100
+ sa.text(
101
+ """
102
+ DROP TABLE IF EXISTS workflows_apscheduler_jobs;
103
+ """
104
+ )
105
+ )
106
+ _downgrade_create_workflows()