orchestrator-core 4.7.0rc1__tar.gz → 4.7.0rc2__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 (389) hide show
  1. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/PKG-INFO +3 -3
  2. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/__init__.py +1 -1
  3. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/app.py +34 -1
  4. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/scheduler.py +53 -8
  5. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schemas/process.py +2 -2
  6. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/llm_settings.py +0 -1
  7. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2020-10-19_a76b9185b334_add_generic_workflows_to_core.py +1 -0
  8. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2021-04-06_3c8b9185c221_add_validate_products_task.py +1 -0
  9. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2025-11-18_961eddbd4c13_create_linker_table_workflow_apscheduler.py +1 -1
  10. orchestrator_core-4.7.0rc2/orchestrator/migrations/versions/schema/2025-12-10_9736496e3eba_set_is_task_true_on_certain_tasks.py +40 -0
  11. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schedules/__init__.py +3 -1
  12. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schedules/scheduling.py +5 -1
  13. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/agent/prompts.py +10 -6
  14. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/agent/tools.py +55 -15
  15. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/aggregations/base.py +6 -2
  16. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/query/builder.py +75 -3
  17. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/query/mixins.py +57 -2
  18. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/query/queries.py +15 -1
  19. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/query/validation.py +43 -0
  20. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/settings.py +48 -0
  21. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/workflows/modify_note.py +10 -1
  22. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/workflows/removed_workflow.py +8 -1
  23. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/workflows/tasks/cleanup_tasks_log.py +9 -2
  24. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/workflows/tasks/resume_workflows.py +4 -0
  25. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/workflows/tasks/validate_product_type.py +7 -1
  26. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/workflows/tasks/validate_products.py +9 -1
  27. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/workflows/tasks/validate_subscriptions.py +9 -2
  28. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/pyproject.toml +3 -2
  29. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/LICENSE +0 -0
  30. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/README.md +0 -0
  31. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/agentic_app.py +0 -0
  32. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/__init__.py +0 -0
  33. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/__init__.py +0 -0
  34. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/api.py +0 -0
  35. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/endpoints/__init__.py +0 -0
  36. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/endpoints/agent.py +0 -0
  37. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/endpoints/health.py +0 -0
  38. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/endpoints/processes.py +0 -0
  39. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/endpoints/product_blocks.py +0 -0
  40. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/endpoints/products.py +0 -0
  41. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/endpoints/resource_types.py +0 -0
  42. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/endpoints/schedules.py +0 -0
  43. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/endpoints/search.py +0 -0
  44. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/endpoints/settings.py +0 -0
  45. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/endpoints/subscription_customer_descriptions.py +0 -0
  46. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/endpoints/subscriptions.py +0 -0
  47. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/endpoints/translations.py +0 -0
  48. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/endpoints/user.py +0 -0
  49. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/endpoints/workflows.py +0 -0
  50. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/api_v1/endpoints/ws.py +0 -0
  51. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/error_handling.py +0 -0
  52. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/helpers.py +0 -0
  53. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/api/models.py +0 -0
  54. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/__init__.py +0 -0
  55. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/database.py +0 -0
  56. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/domain_gen_helpers/__init__.py +0 -0
  57. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/domain_gen_helpers/fixed_input_helpers.py +0 -0
  58. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/domain_gen_helpers/helpers.py +0 -0
  59. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/domain_gen_helpers/product_block_helpers.py +0 -0
  60. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/domain_gen_helpers/product_helpers.py +0 -0
  61. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/domain_gen_helpers/resource_type_helpers.py +0 -0
  62. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/domain_gen_helpers/types.py +0 -0
  63. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generate.py +0 -0
  64. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/__init__.py +0 -0
  65. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/custom_templates/README +0 -0
  66. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/custom_templates/additional_create_imports.j2 +0 -0
  67. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/custom_templates/additional_create_input_fields.j2 +0 -0
  68. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/custom_templates/additional_create_steps.j2 +0 -0
  69. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/custom_templates/additional_modify_imports.j2 +0 -0
  70. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/custom_templates/additional_modify_input_fields.j2 +0 -0
  71. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/custom_templates/additional_modify_steps.j2 +0 -0
  72. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/custom_templates/additional_terminate_imports.j2 +0 -0
  73. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/custom_templates/additional_terminate_input_fields.j2 +0 -0
  74. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/custom_templates/additional_terminate_steps.j2 +0 -0
  75. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/generator/__init__.py +0 -0
  76. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/generator/enums.py +0 -0
  77. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/generator/helpers.py +0 -0
  78. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/generator/migration.py +0 -0
  79. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/generator/product.py +0 -0
  80. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/generator/product_block.py +0 -0
  81. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/generator/settings.py +0 -0
  82. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/generator/translations.py +0 -0
  83. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/generator/unittest.py +0 -0
  84. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/generator/validations.py +0 -0
  85. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/generator/workflow.py +0 -0
  86. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/products/workshop/circuit.yaml +0 -0
  87. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/products/workshop/node.yaml +0 -0
  88. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/products/workshop/user.yaml +0 -0
  89. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/products/workshop/user_group.yaml +0 -0
  90. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/additional_create_imports.j2 +0 -0
  91. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/additional_create_steps.j2 +0 -0
  92. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/additional_modify_imports.j2 +0 -0
  93. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/additional_modify_steps.j2 +0 -0
  94. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/additional_terminate_steps.j2 +0 -0
  95. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/constrained_int_definitions.j2 +0 -0
  96. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/create_data_head.j2 +0 -0
  97. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/create_product.j2 +0 -0
  98. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/enums.j2 +0 -0
  99. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/lazy_workflow_instance.j2 +0 -0
  100. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/list_definitions.j2 +0 -0
  101. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/macros.j2 +0 -0
  102. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/modify_product.j2 +0 -0
  103. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/new_product_migration.j2 +0 -0
  104. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/product.j2 +0 -0
  105. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/product_block.j2 +0 -0
  106. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/shared_forms.j2 +0 -0
  107. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/shared_workflows.j2 +0 -0
  108. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/subscription_model_registry.j2 +0 -0
  109. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/terminate_product.j2 +0 -0
  110. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/test_create_workflow.j2 +0 -0
  111. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/test_modify_workflow.j2 +0 -0
  112. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/test_product_type.j2 +0 -0
  113. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/test_terminate_workflow.j2 +0 -0
  114. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/test_validate_workflow.j2 +0 -0
  115. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/generator/templates/validate_product.j2 +0 -0
  116. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/helpers/__init__.py +0 -0
  117. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/helpers/input_helpers.py +0 -0
  118. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/helpers/print_helpers.py +0 -0
  119. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/main.py +0 -0
  120. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/migrate_domain_models.py +0 -0
  121. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/migrate_tasks.py +0 -0
  122. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/migrate_workflows.py +0 -0
  123. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/migration_helpers.py +0 -0
  124. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/search/__init__.py +0 -0
  125. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/search/display.py +0 -0
  126. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/search/index_llm.py +0 -0
  127. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/search/resize_embedding.py +0 -0
  128. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/search/search_explore.py +0 -0
  129. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/cli/search/speedtest.py +0 -0
  130. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/config/__init__.py +0 -0
  131. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/config/assignee.py +0 -0
  132. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/__init__.py +0 -0
  133. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/database.py +0 -0
  134. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/filters/__init__.py +0 -0
  135. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/filters/filters.py +0 -0
  136. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/filters/process.py +0 -0
  137. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/filters/product.py +0 -0
  138. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/filters/product_block.py +0 -0
  139. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/filters/resource_type.py +0 -0
  140. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/filters/search_filters/__init__.py +0 -0
  141. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/filters/search_filters/inferred_filter.py +0 -0
  142. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/filters/subscription.py +0 -0
  143. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/filters/workflow.py +0 -0
  144. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/helpers.py +0 -0
  145. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/listeners.py +0 -0
  146. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/loaders.py +0 -0
  147. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/models.py +0 -0
  148. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/queries/__init__.py +0 -0
  149. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/queries/subscription.py +0 -0
  150. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/queries/subscription_instance.py +0 -0
  151. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/range/__init__.py +0 -0
  152. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/range/range.py +0 -0
  153. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/sorting/__init__.py +0 -0
  154. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/sorting/process.py +0 -0
  155. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/sorting/product.py +0 -0
  156. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/sorting/product_block.py +0 -0
  157. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/sorting/resource_type.py +0 -0
  158. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/sorting/sorting.py +0 -0
  159. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/sorting/subscription.py +0 -0
  160. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/db/sorting/workflow.py +0 -0
  161. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/devtools/__init__.py +0 -0
  162. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/devtools/populator.py +0 -0
  163. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/devtools/scripts/__init__.py +0 -0
  164. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/devtools/scripts/migrate_20.py +0 -0
  165. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/devtools/scripts/migrate_30.py +0 -0
  166. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/devtools/scripts/shared.py +0 -0
  167. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/distlock/__init__.py +0 -0
  168. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/distlock/distlock_manager.py +0 -0
  169. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/distlock/managers/__init__.py +0 -0
  170. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/distlock/managers/memory_distlock_manager.py +0 -0
  171. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/distlock/managers/redis_distlock_manager.py +0 -0
  172. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/domain/__init__.py +0 -0
  173. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/domain/base.py +0 -0
  174. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/domain/context_cache.py +0 -0
  175. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/domain/customer_description.py +0 -0
  176. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/domain/helpers.py +0 -0
  177. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/domain/lifecycle.py +0 -0
  178. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/domain/subscription_instance_transform.py +0 -0
  179. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/exception_handlers.py +0 -0
  180. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/forms/__init__.py +0 -0
  181. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/forms/validators/__init__.py +0 -0
  182. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/forms/validators/customer_contact_list.py +0 -0
  183. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/forms/validators/customer_id.py +0 -0
  184. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/forms/validators/display_subscription.py +0 -0
  185. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/forms/validators/network_type_validators.py +0 -0
  186. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/forms/validators/product_id.py +0 -0
  187. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/__init__.py +0 -0
  188. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/autoregistration.py +0 -0
  189. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/extensions/__init__.py +0 -0
  190. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/extensions/model_cache.py +0 -0
  191. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/extensions/stats.py +0 -0
  192. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/loaders/__init__.py +0 -0
  193. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/loaders/subscriptions.py +0 -0
  194. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/mutations/customer_description.py +0 -0
  195. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/mutations/start_process.py +0 -0
  196. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/pagination.py +0 -0
  197. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/resolvers/__init__.py +0 -0
  198. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/resolvers/customer.py +0 -0
  199. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/resolvers/helpers.py +0 -0
  200. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/resolvers/process.py +0 -0
  201. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/resolvers/product.py +0 -0
  202. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/resolvers/product_block.py +0 -0
  203. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/resolvers/resource_type.py +0 -0
  204. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/resolvers/scheduled_tasks.py +0 -0
  205. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/resolvers/settings.py +0 -0
  206. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/resolvers/subscription.py +0 -0
  207. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/resolvers/version.py +0 -0
  208. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/resolvers/workflow.py +0 -0
  209. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schema.py +0 -0
  210. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schemas/__init__.py +0 -0
  211. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schemas/customer.py +0 -0
  212. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schemas/customer_description.py +0 -0
  213. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schemas/errors.py +0 -0
  214. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schemas/fixed_input.py +0 -0
  215. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schemas/helpers.py +0 -0
  216. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schemas/product.py +0 -0
  217. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schemas/product_block.py +0 -0
  218. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schemas/resource_type.py +0 -0
  219. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schemas/scheduled_task.py +0 -0
  220. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schemas/settings.py +0 -0
  221. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schemas/strawberry_pydantic_patch.py +0 -0
  222. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schemas/subscription.py +0 -0
  223. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schemas/version.py +0 -0
  224. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/schemas/workflow.py +0 -0
  225. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/types.py +0 -0
  226. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/utils/__init__.py +0 -0
  227. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/utils/create_resolver_error_handler.py +0 -0
  228. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/utils/get_query_loaders.py +0 -0
  229. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/utils/get_selected_fields.py +0 -0
  230. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/utils/get_selected_paths.py +0 -0
  231. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/utils/get_subscription_product_blocks.py +0 -0
  232. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/utils/is_query_detailed.py +0 -0
  233. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/utils/override_class.py +0 -0
  234. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/graphql/utils/to_graphql_result_page.py +0 -0
  235. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/log_config.py +0 -0
  236. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/metrics/__init__.py +0 -0
  237. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/metrics/engine.py +0 -0
  238. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/metrics/init.py +0 -0
  239. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/metrics/processes.py +0 -0
  240. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/metrics/subscriptions.py +0 -0
  241. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/README +0 -0
  242. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/__init__.py +0 -0
  243. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/alembic.ini +0 -0
  244. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/env.py +0 -0
  245. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/helpers.py +0 -0
  246. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/script.py.mako +0 -0
  247. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/templates/alembic.ini.j2 +0 -0
  248. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/templates/env.py.j2 +0 -0
  249. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/templates/helpers.py.j2 +0 -0
  250. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2020-10-19_3323bcb934e7_fix_tsv_triggers.py +0 -0
  251. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2020-10-19_c112305b07d3_initial_schema_migration.py +0 -0
  252. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2021-07-01_6896a54e9483_add_product_block_relations.py +0 -0
  253. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2021-11-17_19cdd3ab86f6_fix_parse_websearch.py +0 -0
  254. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2022-02-16_bed6bc0b197a_rename_parent_and_child_block_relations.py +0 -0
  255. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2023-03-06_e05bb1967eff_add_subscriptions_search_view.py +0 -0
  256. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2023-05-25_b1970225392d_add_subscription_metadata_workflow.py +0 -0
  257. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2023-06-28_a09ac125ea73_add_throttling_to_refresh_subscriptions.py +0 -0
  258. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2023-06-28_a09ac125ea73_add_throttling_to_refresh_subscriptions.sql +0 -0
  259. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2023-07-17_165303a20fb1_customer_id_to_varchar.py +0 -0
  260. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2023-07-17_165303a20fb1_customer_id_to_varchar.sql +0 -0
  261. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2023-09-25_da5c9f4cce1c_add_subscription_metadata_to_fulltext_.py +0 -0
  262. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2023-09-25_da5c9f4cce1c_add_subscription_metadata_to_fulltext_.sql +0 -0
  263. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2023-12-06_048219045729_add_workflow_id_to_processes_table.py +0 -0
  264. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2024-09-27_460ec6748e37_add_uuid_search_workaround.py +0 -0
  265. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2024-09-27_460ec6748e37_add_uuid_search_workaround.sql +0 -0
  266. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2025-01-08_4c5859620539_add_version_column_to_subscription.py +0 -0
  267. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2025-01-19_4fjdn13f83ga_add_validate_product_type_task.py +0 -0
  268. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2025-02-12_bac6be6f2b4f_added_input_state_table.py +0 -0
  269. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2025-02-20_68d14db1b8da_make_workflow_description_mandatory.py +0 -0
  270. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_instance_as_json_function.py +0 -0
  271. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_instance_as_json_function.sql +0 -0
  272. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2025-04-09_fc5c993a4b4a_add_cascade_constraint_on_processes_.py +0 -0
  273. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2025-05-08_161918133bec_add_is_task_to_workflow.py +0 -0
  274. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2025-07-01_93fc5834c7e5_changed_timestamping_fields_in_process_steps.py +0 -0
  275. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2025-07-04_4b58e336d1bf_deprecating_workflow_target_in_.py +0 -0
  276. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/migrations/versions/schema/2025-07-28_850dccac3b02_update_description_of_resume_workflows_.py +0 -0
  277. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/py.typed +0 -0
  278. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schedules/scheduler.py +0 -0
  279. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schedules/service.py +0 -0
  280. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schedules/validate_products.py +0 -0
  281. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schemas/__init__.py +0 -0
  282. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schemas/base.py +0 -0
  283. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schemas/engine_settings.py +0 -0
  284. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schemas/fixed_input.py +0 -0
  285. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schemas/problem_detail.py +0 -0
  286. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schemas/process.py +0 -0
  287. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schemas/product.py +0 -0
  288. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schemas/product_block.py +0 -0
  289. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schemas/resource_type.py +0 -0
  290. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schemas/schedules.py +0 -0
  291. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schemas/search.py +0 -0
  292. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schemas/search_requests.py +0 -0
  293. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schemas/subscription.py +0 -0
  294. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schemas/subscription_descriptions.py +0 -0
  295. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/schemas/workflow.py +0 -0
  296. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/__init__.py +0 -0
  297. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/agent/__init__.py +0 -0
  298. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/agent/agent.py +0 -0
  299. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/agent/handlers.py +0 -0
  300. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/agent/json_patch.py +0 -0
  301. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/agent/state.py +0 -0
  302. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/agent/validation.py +0 -0
  303. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/aggregations/__init__.py +0 -0
  304. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/core/__init__.py +0 -0
  305. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/core/embedding.py +0 -0
  306. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/core/exceptions.py +0 -0
  307. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/core/types.py +0 -0
  308. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/core/validators.py +0 -0
  309. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/docs/index.md +0 -0
  310. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/docs/running_local_text_embedding_inference.md +0 -0
  311. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/filters/__init__.py +0 -0
  312. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/filters/base.py +0 -0
  313. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/filters/date_filters.py +0 -0
  314. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/filters/definitions.py +0 -0
  315. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/filters/ltree_filters.py +0 -0
  316. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/filters/numeric_filter.py +0 -0
  317. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/indexing/__init__.py +0 -0
  318. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/indexing/indexer.py +0 -0
  319. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/indexing/registry.py +0 -0
  320. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/indexing/tasks.py +0 -0
  321. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/indexing/traverse.py +0 -0
  322. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/llm_migration.py +0 -0
  323. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/query/__init__.py +0 -0
  324. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/query/engine.py +0 -0
  325. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/query/exceptions.py +0 -0
  326. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/query/export.py +0 -0
  327. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/query/results.py +0 -0
  328. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/query/state.py +0 -0
  329. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/retrieval/__init__.py +0 -0
  330. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/retrieval/pagination.py +0 -0
  331. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/retrieval/retrievers/__init__.py +0 -0
  332. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/retrieval/retrievers/base.py +0 -0
  333. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/retrieval/retrievers/fuzzy.py +0 -0
  334. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/retrieval/retrievers/hybrid.py +0 -0
  335. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/retrieval/retrievers/process.py +0 -0
  336. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/retrieval/retrievers/semantic.py +0 -0
  337. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/search/retrieval/retrievers/structured.py +0 -0
  338. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/security.py +0 -0
  339. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/__init__.py +0 -0
  340. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/executors/__init__.py +0 -0
  341. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/executors/celery.py +0 -0
  342. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/executors/threadpool.py +0 -0
  343. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/fixed_inputs.py +0 -0
  344. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/input_state.py +0 -0
  345. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/process_broadcast_thread.py +0 -0
  346. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/processes.py +0 -0
  347. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/products.py +0 -0
  348. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/resource_types.py +0 -0
  349. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/settings.py +0 -0
  350. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/settings_env_variables.py +0 -0
  351. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/subscription_relations.py +0 -0
  352. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/subscriptions.py +0 -0
  353. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/tasks.py +0 -0
  354. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/translations.py +0 -0
  355. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/services/workflows.py +0 -0
  356. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/targets.py +0 -0
  357. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/types.py +0 -0
  358. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/__init__.py +0 -0
  359. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/auth.py +0 -0
  360. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/crypt.py +0 -0
  361. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/datetime.py +0 -0
  362. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/deprecation_logger.py +0 -0
  363. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/docs.py +0 -0
  364. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/enrich_process.py +0 -0
  365. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/errors.py +0 -0
  366. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/expose_settings.py +0 -0
  367. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/fixed_inputs.py +0 -0
  368. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/functional.py +0 -0
  369. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/get_subscription_dict.py +0 -0
  370. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/get_updated_properties.py +0 -0
  371. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/helpers.py +0 -0
  372. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/json.py +0 -0
  373. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/redis.py +0 -0
  374. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/redis_client.py +0 -0
  375. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/search_query.py +0 -0
  376. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/state.py +0 -0
  377. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/strings.py +0 -0
  378. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/utils/validate_data_version.py +0 -0
  379. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/version.py +0 -0
  380. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/websocket/__init__.py +0 -0
  381. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/websocket/managers/broadcast_websocket_manager.py +0 -0
  382. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/websocket/managers/memory_websocket_manager.py +0 -0
  383. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/websocket/websocket_manager.py +0 -0
  384. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/workflow.py +0 -0
  385. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/workflows/__init__.py +0 -0
  386. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/workflows/steps.py +0 -0
  387. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/workflows/tasks/__init__.py +0 -0
  388. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/workflows/translations/en-GB.json +0 -0
  389. {orchestrator_core-4.7.0rc1 → orchestrator_core-4.7.0rc2}/orchestrator/workflows/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orchestrator-core
3
- Version: 4.7.0rc1
3
+ Version: 4.7.0rc2
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
@@ -57,8 +57,8 @@ Requires-Dist: pytz==2025.2
57
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
@@ -13,7 +13,7 @@
13
13
 
14
14
  """This is the orchestrator workflow engine."""
15
15
 
16
- __version__ = "4.7.0rc1"
16
+ __version__ = "4.7.0rc2"
17
17
 
18
18
 
19
19
  from structlog import get_logger
@@ -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")
@@ -36,7 +36,13 @@ app: typer.Typer = typer.Typer()
36
36
 
37
37
  @app.command()
38
38
  def run() -> None:
39
- """Start scheduler and loop eternally to keep thread alive."""
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
+ """
40
46
 
41
47
  def _get_scheduled_task_item_from_queue(redis_conn: Redis) -> tuple[str, bytes] | None:
42
48
  """Get an item from the Redis Queue for scheduler tasks."""
@@ -63,17 +69,45 @@ def run() -> None:
63
69
 
64
70
  @app.command()
65
71
  def show_schedule() -> None:
66
- """Show the currently configured schedule.
72
+ """The `show-schedule` command shows an overview of the scheduled jobs."""
73
+ from rich.console import Console
74
+ from rich.table import Table
67
75
 
68
- in cli underscore is replaced by a dash `show-schedule`
69
- """
70
- for task in get_all_scheduler_tasks():
71
- typer.echo(f"[{task.id}] Next run: {task.next_run_time} | Trigger: {task.trigger}")
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)
72
97
 
73
98
 
74
99
  @app.command()
75
100
  def force(task_id: str) -> None:
76
- """Force the execution of (a) scheduler(s) based on a task_id."""
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
+ """
77
111
  task = get_scheduler_task(task_id)
78
112
 
79
113
  if not task:
@@ -91,7 +125,18 @@ def force(task_id: str) -> None:
91
125
 
92
126
  @app.command()
93
127
  def load_initial_schedule() -> None:
94
- """Load the initial schedule into the scheduler."""
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
+ """
95
140
  initial_schedules = [
96
141
  {
97
142
  "name": "Task Resume Workflows",
@@ -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
@@ -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
  ]
@@ -17,7 +17,7 @@ down_revision = "850dccac3b02"
17
17
  branch_labels = None
18
18
  depends_on = None
19
19
 
20
-
20
+ # NOTE: this migration forgot to insert these workflows with is_task=true. Make sure to correct that if you copy this.
21
21
  workflows = [
22
22
  {
23
23
  "name": "task_validate_subscriptions",
@@ -0,0 +1,40 @@
1
+ """Set is_task=true on certain tasks.
2
+
3
+ This is required to make them appear in the completed tasks in the UI, and for the cleanup task to be able to
4
+ remove them.
5
+
6
+ Revision ID: 9736496e3eba
7
+ Revises: 961eddbd4c13
8
+ Create Date: 2025-12-10 16:42:29.060382
9
+
10
+ """
11
+
12
+ import sqlalchemy as sa
13
+ from alembic import op
14
+
15
+ # revision identifiers, used by Alembic.
16
+ revision = "9736496e3eba"
17
+ down_revision = "961eddbd4c13"
18
+ branch_labels = None
19
+ depends_on = None
20
+
21
+ task_names = [
22
+ # Added in a76b9185b334
23
+ "task_clean_up_tasks",
24
+ "task_resume_workflows",
25
+ # Added in 3c8b9185c221
26
+ "task_validate_products",
27
+ # Added in 961eddbd4c13
28
+ "task_validate_subscriptions",
29
+ ]
30
+
31
+
32
+ def upgrade() -> None:
33
+ conn = op.get_bind()
34
+ query = sa.text("UPDATE workflows SET is_task=true WHERE name = :task_name and is_task=false")
35
+ for task_name in task_names:
36
+ conn.execute(query, parameters={"task_name": task_name})
37
+
38
+
39
+ def downgrade() -> None:
40
+ pass # Does not make sense to downgrade back to a 'bad' state.
@@ -15,7 +15,9 @@ import warnings
15
15
  from orchestrator.schedules.validate_products import validate_products
16
16
 
17
17
  warnings.warn(
18
- "ALL_SCHEDULERS is deprecated; scheduling is now handled entirely through the scheduler API.",
18
+ "ALL_SCHEDULERS is deprecated and will be removed in 5.0.0. "
19
+ "Scheduling tasks can now be handled entirely through the API. "
20
+ "For more details, please consult https://workfloworchestrator.org/orchestrator-core/guides/upgrading/4.7/",
19
21
  DeprecationWarning,
20
22
  stacklevel=2,
21
23
  )
@@ -23,7 +23,11 @@ F = TypeVar("F", bound=Callable[..., object])
23
23
 
24
24
 
25
25
  @deprecated(
26
- reason="We changed from scheduler to apscheduler which has its own decoractor, use `@scheduler.scheduled_job()` from `from orchestrator.scheduling.scheduler import scheduler`"
26
+ reason=(
27
+ "Scheduling tasks with a decorator is deprecated in favor of using the API. "
28
+ "This decorator will be removed in 5.0.0. "
29
+ "For more details, please consult https://workfloworchestrator.org/orchestrator-core/guides/upgrading/4.7/"
30
+ )
27
31
  )
28
32
  def scheduler(
29
33
  name: str,
@@ -26,7 +26,7 @@ logger = structlog.get_logger(__name__)
26
26
 
27
27
  async def get_base_instructions() -> str:
28
28
  return dedent(
29
- """
29
+ f"""
30
30
  You are an expert assistant designed to find relevant information by building and running database queries.
31
31
 
32
32
  ---
@@ -50,17 +50,21 @@ async def get_base_instructions() -> str:
50
50
 
51
51
  Follow these steps:
52
52
 
53
- 1. **Set Context**: Call `start_new_search` with appropriate entity_type and action
53
+ 1. **Set Context**: Call `start_new_search` with appropriate entity_type and action:
54
+ - `action={ActionType.SELECT.value}` for finding/searching entities
55
+ - `action={ActionType.COUNT.value}` for counting (e.g., "how many", "count by status", "monthly growth")
56
+ - `action={ActionType.AGGREGATE.value}` for numeric operations (SUM, AVG, MIN, MAX of specific fields)
54
57
  2. **Set Filters** (if needed): Discover paths, build FilterTree, call `set_filter_tree`
55
58
  - IMPORTANT: Temporal constraints like "in 2025", "in January", "between X and Y" require filters on datetime fields
56
59
  - Filters restrict WHICH records to include; grouping controls HOW to aggregate them
57
- 3. **Set Grouping/Aggregations** (for COUNT/AGGREGATE):
60
+ 3. **Set Grouping/Aggregations** (for {ActionType.COUNT.value}/{ActionType.AGGREGATE.value}):
58
61
  - For temporal grouping (per month, per year, per day, etc.): Use `set_temporal_grouping`
59
62
  - For regular grouping (by status, by name, etc.): Use `set_grouping`
60
- - For aggregations: Use `set_aggregations`
63
+ - For {ActionType.AGGREGATE.value} action ONLY: Use `set_aggregations` to specify what to compute (SUM, AVG, etc.)
64
+ - For {ActionType.COUNT.value} action: Do NOT call `set_aggregations` (counting is automatic)
61
65
  4. **Execute**:
62
- - For SELECT action: Call `run_search()`
63
- - For COUNT/AGGREGATE actions: Call `run_aggregation()`
66
+ - For {ActionType.SELECT.value} action: Call `run_search()`
67
+ - For {ActionType.COUNT.value}/{ActionType.AGGREGATE.value} actions: Call `run_aggregation()`
64
68
 
65
69
  After search execution, follow the dynamic instructions based on the current state.
66
70
 
@@ -16,6 +16,7 @@ from typing import Any, cast
16
16
 
17
17
  import structlog
18
18
  from ag_ui.core import EventType, StateSnapshotEvent
19
+ from pydantic import ValidationError
19
20
  from pydantic_ai import RunContext
20
21
  from pydantic_ai.ag_ui import StateDeps
21
22
  from pydantic_ai.exceptions import ModelRetry
@@ -39,13 +40,15 @@ from orchestrator.search.filters import FilterTree
39
40
  from orchestrator.search.query import engine
40
41
  from orchestrator.search.query.exceptions import PathNotFoundError, QueryValidationError
41
42
  from orchestrator.search.query.export import fetch_export_data
43
+ from orchestrator.search.query.mixins import OrderBy
42
44
  from orchestrator.search.query.queries import AggregateQuery, CountQuery, Query, SelectQuery
43
45
  from orchestrator.search.query.results import AggregationResponse, AggregationResult, ExportData, VisualizationType
44
46
  from orchestrator.search.query.state import QueryState
45
47
  from orchestrator.search.query.validation import (
46
48
  validate_aggregation_field,
47
- validate_filter_path,
48
49
  validate_filter_tree,
50
+ validate_grouping_fields,
51
+ validate_order_by_fields,
49
52
  validate_temporal_grouping_field,
50
53
  )
51
54
  from orchestrator.settings import app_settings
@@ -404,20 +407,30 @@ async def prepare_export(
404
407
  async def set_grouping(
405
408
  ctx: RunContext[StateDeps[SearchState]],
406
409
  group_by_paths: list[str],
410
+ order_by: list[OrderBy] | None = None,
407
411
  ) -> StateSnapshotEvent:
408
412
  """Set which field paths to group results by for aggregation.
409
413
 
410
414
  Only used with COUNT or AGGREGATE actions. Paths must exist in the schema; use discover_filter_paths to verify.
415
+ Optionally specify ordering for the grouped results.
416
+
417
+ For order_by: You can order by grouping field paths OR aggregation aliases (e.g., 'count').
418
+ Grouping field paths will be validated; aggregation aliases cannot be validated until execution.
411
419
  """
412
- for path in group_by_paths:
413
- field_type = validate_filter_path(path)
414
- if field_type is None:
415
- raise ModelRetry(
416
- f"Path '{path}' not found in database schema. "
417
- f"Use discover_filter_paths(['{path.split('.')[-1]}']) to find valid paths."
418
- )
420
+ try:
421
+ validate_grouping_fields(group_by_paths)
422
+ validate_order_by_fields(order_by)
423
+ except PathNotFoundError as e:
424
+ raise ModelRetry(f"{str(e)} Use discover_filter_paths to find valid paths.")
419
425
 
420
- ctx.deps.state.query = cast(Query, ctx.deps.state.query).model_copy(update={"group_by": group_by_paths})
426
+ update_dict: dict[str, Any] = {"group_by": group_by_paths}
427
+ if order_by is not None:
428
+ update_dict["order_by"] = order_by
429
+
430
+ try:
431
+ ctx.deps.state.query = cast(Query, ctx.deps.state.query).model_copy(update=update_dict)
432
+ except ValidationError as e:
433
+ raise ModelRetry(str(e))
421
434
 
422
435
  return StateSnapshotEvent(
423
436
  type=EventType.STATE_SNAPSHOT,
@@ -434,16 +447,26 @@ async def set_aggregations(
434
447
  """Define what aggregations to compute over the matching records.
435
448
 
436
449
  Only used with AGGREGATE action. See Aggregation model (CountAggregation, FieldAggregation) for structure and field requirements.
450
+
437
451
  """
438
452
  # Validate field paths for FieldAggregations
439
453
  try:
440
454
  for agg in aggregations:
441
455
  if isinstance(agg, FieldAggregation):
442
456
  validate_aggregation_field(agg.type, agg.field)
443
- except ValueError as e:
444
- raise ModelRetry(f"{str(e)} Use discover_filter_paths to find valid paths.")
457
+ except PathNotFoundError as e:
458
+ raise ModelRetry(
459
+ f"{str(e)} "
460
+ f"You MUST call discover_filter_paths first to find valid fields. "
461
+ f"If the field truly doesn't exist, inform the user that this data is not available."
462
+ )
463
+ except QueryValidationError as e:
464
+ raise ModelRetry(f"{str(e)}")
445
465
 
446
- ctx.deps.state.query = cast(Query, ctx.deps.state.query).model_copy(update={"aggregations": aggregations})
466
+ try:
467
+ ctx.deps.state.query = cast(Query, ctx.deps.state.query).model_copy(update={"aggregations": aggregations})
468
+ except ValidationError as e:
469
+ raise ModelRetry(str(e))
447
470
 
448
471
  return StateSnapshotEvent(
449
472
  type=EventType.STATE_SNAPSHOT,
@@ -456,19 +479,36 @@ async def set_aggregations(
456
479
  async def set_temporal_grouping(
457
480
  ctx: RunContext[StateDeps[SearchState]],
458
481
  temporal_groups: list[TemporalGrouping],
482
+ cumulative: bool = False,
483
+ order_by: list[OrderBy] | None = None,
459
484
  ) -> StateSnapshotEvent:
460
485
  """Set temporal grouping to group datetime fields by time periods.
461
486
 
462
487
  Only used with COUNT or AGGREGATE actions. See TemporalGrouping model for structure, periods, and examples.
488
+ Optionally enable cumulative aggregations (running totals) and specify ordering.
489
+
490
+ For order_by: You can order by temporal field paths OR aggregation aliases (e.g., 'count').
491
+ Temporal field paths will be validated; aggregation aliases cannot be validated until execution.
463
492
  """
464
- # Validate that fields exist and are datetime types
465
493
  try:
466
494
  for tg in temporal_groups:
467
495
  validate_temporal_grouping_field(tg.field)
468
- except ValueError as e:
496
+ validate_order_by_fields(order_by)
497
+ except PathNotFoundError as e:
498
+ raise ModelRetry(f"{str(e)} Use discover_filter_paths to find valid paths.")
499
+ except QueryValidationError as e:
469
500
  raise ModelRetry(f"{str(e)} Use discover_filter_paths to find datetime fields.")
470
501
 
471
- ctx.deps.state.query = cast(Query, ctx.deps.state.query).model_copy(update={"temporal_group_by": temporal_groups})
502
+ update_dict: dict[str, Any] = {"temporal_group_by": temporal_groups}
503
+ if cumulative:
504
+ update_dict["cumulative"] = cumulative
505
+ if order_by is not None:
506
+ update_dict["order_by"] = order_by
507
+
508
+ try:
509
+ ctx.deps.state.query = cast(Query, ctx.deps.state.query).model_copy(update=update_dict)
510
+ except ValidationError as e:
511
+ raise ModelRetry(str(e))
472
512
 
473
513
  return StateSnapshotEvent(
474
514
  type=EventType.STATE_SNAPSHOT,
@@ -61,6 +61,11 @@ class TemporalGrouping(BaseModel):
61
61
  },
62
62
  )
63
63
 
64
+ @property
65
+ def alias(self) -> str:
66
+ """Return the SQL-friendly alias for this temporal grouping."""
67
+ return f"{BaseAggregation.field_to_alias(self.field)}_{self.period.value}"
68
+
64
69
  def get_pivot_fields(self) -> list[str]:
65
70
  """Return fields that need to be pivoted for this temporal grouping."""
66
71
  return [self.field]
@@ -83,8 +88,7 @@ class TemporalGrouping(BaseModel):
83
88
  col = getattr(pivot_cte_columns, field_alias)
84
89
  truncated_col = func.date_trunc(self.period.value, cast(col, TIMESTAMP(timezone=True)))
85
90
 
86
- # Column name without prefix
87
- col_name = f"{field_alias}_{self.period.value}"
91
+ col_name = self.alias
88
92
  select_col = truncated_col.label(col_name)
89
93
  return select_col, truncated_col, col_name
90
94
 
@@ -25,6 +25,7 @@ from orchestrator.db.models import AiSearchIndex
25
25
  from orchestrator.search.aggregations import AggregationType, BaseAggregation, CountAggregation
26
26
  from orchestrator.search.core.types import EntityType, FieldType, FilterOp, UIType
27
27
  from orchestrator.search.filters import LtreeFilter
28
+ from orchestrator.search.query.mixins import OrderDirection
28
29
  from orchestrator.search.query.queries import AggregateQuery, CountQuery, Query
29
30
 
30
31
 
@@ -181,7 +182,8 @@ def _build_pivot_cte(base_query: Select, pivot_fields: list[str]) -> CTE:
181
182
 
182
183
 
183
184
  def _build_grouping_columns(
184
- query: CountQuery | AggregateQuery, pivot_cte: CTE
185
+ query: CountQuery | AggregateQuery,
186
+ pivot_cte: CTE,
185
187
  ) -> tuple[list[Any], list[Any], list[str]]:
186
188
  """Build GROUP BY columns and their SELECT columns.
187
189
 
@@ -244,6 +246,76 @@ def _build_aggregation_columns(query: CountQuery | AggregateQuery, pivot_cte: CT
244
246
  return [count_agg.to_expression(pivot_cte.c.entity_id)]
245
247
 
246
248
 
249
+ def _apply_cumulative_aggregations(
250
+ stmt: Select,
251
+ query: CountQuery | AggregateQuery,
252
+ group_column_names: list[str],
253
+ aggregation_columns: list[Label],
254
+ ) -> Select:
255
+ """Add cumulative aggregation columns."""
256
+
257
+ # At this point, cumulative validation has already happened at query build time
258
+ # in GroupingMixin.validate_grouping_constraints, so we know:
259
+ # temporal_group_by exists and has exactly 1 element when cumulative=True
260
+ if not query.cumulative or not aggregation_columns or not query.temporal_group_by:
261
+ return stmt
262
+
263
+ temporal_alias = query.temporal_group_by[0].alias
264
+
265
+ base_subquery = stmt.subquery()
266
+ partition_cols = [base_subquery.c[name] for name in group_column_names if name != temporal_alias]
267
+ order_col = base_subquery.c[temporal_alias]
268
+
269
+ base_columns = [base_subquery.c[col] for col in base_subquery.c.keys()]
270
+
271
+ cumulative_columns = []
272
+ for agg_col in aggregation_columns:
273
+ cumulative_alias = f"{agg_col.key}_cumulative"
274
+ over_kwargs: dict[str, Any] = {"order_by": order_col}
275
+ if partition_cols:
276
+ over_kwargs["partition_by"] = partition_cols
277
+ cumulative_expr = func.sum(base_subquery.c[agg_col.key]).over(**over_kwargs).label(cumulative_alias)
278
+ cumulative_columns.append(cumulative_expr)
279
+
280
+ return select(*(base_columns + cumulative_columns)).select_from(base_subquery)
281
+
282
+
283
+ def _apply_ordering(
284
+ stmt: Select,
285
+ query: CountQuery | AggregateQuery,
286
+ group_column_names: list[str],
287
+ ) -> Select:
288
+ """Apply ordering instructions to the SELECT statement."""
289
+ columns_by_key = {col.key: col for col in stmt.selected_columns}
290
+
291
+ if query.order_by:
292
+ order_expressions = []
293
+ for instruction in query.order_by:
294
+ # 1) exact match
295
+ col = columns_by_key.get(instruction.field)
296
+ if col is None:
297
+ # 2) temporal alias,
298
+ for tg in query.temporal_group_by or []:
299
+ if instruction.field == tg.field or instruction.field == tg.alias:
300
+ col = columns_by_key.get(tg.alias)
301
+ if col is not None:
302
+ break
303
+ if col is None:
304
+ # 3) normalized field path
305
+ col = columns_by_key.get(BaseAggregation.field_to_alias(instruction.field))
306
+ if col is None:
307
+ raise ValueError(f"Cannot order by '{instruction.field}'; column not found.")
308
+ order_expressions.append(col.desc() if instruction.direction == OrderDirection.DESC else col.asc())
309
+ return stmt.order_by(*order_expressions)
310
+
311
+ if query.temporal_group_by:
312
+ # Default ordering by all grouping columns (ascending)
313
+ order_expressions = [columns_by_key[col_name].asc() for col_name in group_column_names]
314
+ return stmt.order_by(*order_expressions)
315
+
316
+ return stmt
317
+
318
+
247
319
  def build_simple_count_query(base_query: Select) -> Select:
248
320
  """Build a simple count query without grouping.
249
321
 
@@ -282,7 +354,7 @@ def build_aggregation_query(query: CountQuery | AggregateQuery, base_query: Sele
282
354
  if group_cols:
283
355
  stmt = stmt.group_by(*group_cols)
284
356
 
285
- if query.temporal_group_by:
286
- stmt = stmt.order_by(*group_cols)
357
+ stmt = _apply_cumulative_aggregations(stmt, query, group_col_names, agg_cols)
358
+ stmt = _apply_ordering(stmt, query, group_col_names)
287
359
 
288
360
  return stmt, group_col_names
@@ -1,6 +1,8 @@
1
1
  import uuid
2
+ from enum import Enum
3
+ from typing import Self
2
4
 
3
- from pydantic import BaseModel, Field
5
+ from pydantic import BaseModel, Field, model_validator
4
6
 
5
7
  from orchestrator.search.aggregations import Aggregation, TemporalGrouping
6
8
 
@@ -8,9 +10,28 @@ __all__ = [
8
10
  "SearchMixin",
9
11
  "GroupingMixin",
10
12
  "AggregationMixin",
13
+ "OrderBy",
14
+ "OrderDirection",
11
15
  ]
12
16
 
13
17
 
18
+ class OrderDirection(str, Enum):
19
+ """Sorting direction for aggregation results."""
20
+
21
+ ASC = "asc"
22
+ DESC = "desc"
23
+
24
+
25
+ class OrderBy(BaseModel):
26
+ """Ordering descriptor for aggregation responses."""
27
+
28
+ field: str = Field(description="Grouping or aggregation field/alias to order by.")
29
+ direction: OrderDirection = Field(
30
+ default=OrderDirection.ASC,
31
+ description="Sorting direction (asc or desc).",
32
+ )
33
+
34
+
14
35
  class SearchMixin(BaseModel):
15
36
  """Mixin providing text search capability.
16
37
 
@@ -59,6 +80,37 @@ class GroupingMixin(BaseModel):
59
80
  default=None,
60
81
  description="Temporal grouping specifications (group by month, year, etc.)",
61
82
  )
83
+ cumulative: bool = Field(
84
+ default=False,
85
+ description="Enable cumulative aggregations when temporal grouping is present.",
86
+ )
87
+ order_by: list[OrderBy] | None = Field(
88
+ default=None,
89
+ description="Ordering instructions for grouped aggregation results.",
90
+ )
91
+
92
+ @model_validator(mode="after")
93
+ def validate_grouping_constraints(self) -> Self:
94
+ """Validate cross-field constraints for grouping features."""
95
+ if self.order_by and not self.group_by and not self.temporal_group_by:
96
+ raise ValueError(
97
+ "order_by requires at least one grouping field (group_by or temporal_group_by). "
98
+ "Ordering only applies to grouped aggregation results."
99
+ )
100
+
101
+ if self.cumulative:
102
+ if not self.temporal_group_by:
103
+ raise ValueError(
104
+ "cumulative requires at least one temporal grouping (temporal_group_by). "
105
+ "Cumulative aggregations compute running totals over time."
106
+ )
107
+ if len(self.temporal_group_by) > 1:
108
+ raise ValueError(
109
+ "cumulative currently supports only a single temporal grouping. "
110
+ "Multiple temporal dimensions with running totals are not yet supported."
111
+ )
112
+
113
+ return self
62
114
 
63
115
  def get_pivot_fields(self) -> list[str]:
64
116
  """Get all fields needed for EAV pivot from grouping.
@@ -82,7 +134,10 @@ class AggregationMixin(BaseModel):
82
134
  Used by AGGREGATE queries to define what statistics to compute.
83
135
  """
84
136
 
85
- aggregations: list[Aggregation] = Field(description="Aggregations to compute (SUM, AVG, MIN, MAX, COUNT)")
137
+ aggregations: list[Aggregation] = Field(
138
+ description="Aggregations to compute (SUM, AVG, MIN, MAX, COUNT)",
139
+ min_length=1,
140
+ )
86
141
 
87
142
  def get_aggregation_pivot_fields(self) -> list[str]:
88
143
  """Get fields needed for EAV pivot from aggregations.