orchestrator-core 4.5.0a3__py3-none-any.whl → 4.5.0a5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
orchestrator/__init__.py CHANGED
@@ -13,7 +13,7 @@
13
13
 
14
14
  """This is the orchestrator workflow engine."""
15
15
 
16
- __version__ = "4.5.0a3"
16
+ __version__ = "4.5.0a5"
17
17
 
18
18
 
19
19
  from structlog import get_logger
@@ -76,20 +76,22 @@ api_router.include_router(user.router, prefix="/user", tags=["Core", "User"], de
76
76
  api_router.include_router(
77
77
  settings.router, prefix="/settings", tags=["Core", "Settings"], dependencies=[Depends(authorize)]
78
78
  )
79
- api_router.include_router(settings.ws_router, prefix="/settings", tags=["Core", "Settings"])
79
+ api_router.include_router(
80
+ settings.ws_router, prefix="/settings", tags=["Core", "Settings"]
81
+ ) # Auth on the websocket is handled in the Websocket Manager
80
82
  api_router.include_router(health.router, prefix="/health", tags=["Core"])
81
83
  api_router.include_router(
82
84
  translations.router,
83
85
  prefix="/translations",
84
86
  tags=["Core", "Translations"],
85
87
  )
86
- api_router.include_router(ws.router, prefix="/ws", tags=["Core", "Events"])
88
+ api_router.include_router(
89
+ ws.router, prefix="/ws", tags=["Core", "Events"]
90
+ ) # Auth on the websocket is handled in the Websocket Manager
87
91
 
88
92
  if llm_settings.LLM_ENABLED:
89
93
  from orchestrator.api.api_v1.endpoints import search
90
94
 
91
95
  api_router.include_router(
92
- search.router,
93
- prefix="/search",
94
- tags=["Core", "Search"],
96
+ search.router, prefix="/search", tags=["Core", "Search"], dependencies=[Depends(authorize)]
95
97
  )
@@ -244,6 +244,8 @@ def continue_awaiting_process_endpoint(
244
244
  continue_awaiting_process(process, token=token, input_data=json_data, broadcast_func=broadcast_func)
245
245
  except AssertionError as e:
246
246
  raise_status(HTTPStatus.NOT_FOUND, str(e))
247
+ except ValueError as e:
248
+ raise_status(HTTPStatus.BAD_REQUEST, str(e))
247
249
 
248
250
 
249
251
  @router.post(
@@ -614,9 +614,7 @@ class ProductBlockModel(DomainModel):
614
614
  product_blocks_in_model = cls._get_depends_on_product_block_types()
615
615
  product_blocks_types_in_model = get_depends_on_product_block_type_list(product_blocks_in_model)
616
616
 
617
- product_blocks_in_model = set(
618
- flatten(map(attrgetter("__names__"), product_blocks_types_in_model))
619
- ) # type: ignore
617
+ product_blocks_in_model = set(flatten(map(attrgetter("__names__"), product_blocks_types_in_model))) # type: ignore
620
618
 
621
619
  missing_product_blocks_in_db = product_blocks_in_model - product_blocks_in_db # type: ignore
622
620
  missing_product_blocks_in_model = product_blocks_in_db - product_blocks_in_model # type: ignore
@@ -1084,9 +1082,7 @@ class SubscriptionModel(DomainModel):
1084
1082
  product_blocks_in_model = cls._get_depends_on_product_block_types()
1085
1083
  product_blocks_types_in_model = get_depends_on_product_block_type_list(product_blocks_in_model)
1086
1084
 
1087
- product_blocks_in_model = set(
1088
- flatten(map(attrgetter("__names__"), product_blocks_types_in_model))
1089
- ) # type: ignore
1085
+ product_blocks_in_model = set(flatten(map(attrgetter("__names__"), product_blocks_types_in_model))) # type: ignore
1090
1086
 
1091
1087
  missing_product_blocks_in_db = product_blocks_in_model - product_blocks_in_db # type: ignore
1092
1088
  missing_product_blocks_in_model = product_blocks_in_db - product_blocks_in_model # type: ignore
@@ -1294,7 +1290,6 @@ class SubscriptionModel(DomainModel):
1294
1290
  # Some common functions shared by from_other_product and from_subscription
1295
1291
  @classmethod
1296
1292
  def _get_subscription(cls: type[S], subscription_id: UUID | UUIDstr) -> SubscriptionTable | None:
1297
-
1298
1293
  if not isinstance(subscription_id, UUID | UUIDstr):
1299
1294
  raise TypeError(f"subscription_id is of type {type(subscription_id)} instead of UUID | UUIDstr")
1300
1295
 
@@ -16,11 +16,16 @@ from typing import TYPE_CHECKING, TypeVar
16
16
  import strawberry
17
17
  import structlog
18
18
 
19
+ from orchestrator.settings import LifecycleValidationMode, app_settings
19
20
  from orchestrator.types import SubscriptionLifecycle
20
21
  from pydantic_forms.types import strEnum
21
22
 
22
23
  if TYPE_CHECKING:
23
- from orchestrator.domain.base import DomainModel
24
+ from orchestrator.domain.base import DomainModel, SubscriptionModel
25
+ else:
26
+ SubscriptionModel = None
27
+ DomainModel = None
28
+ T = TypeVar("T", bound=SubscriptionModel)
24
29
 
25
30
  logger = structlog.get_logger(__name__)
26
31
 
@@ -71,9 +76,21 @@ def validate_lifecycle_status(
71
76
  )
72
77
 
73
78
 
74
- if TYPE_CHECKING:
75
- from orchestrator.domain.base import DomainModel, SubscriptionModel
76
- else:
77
- SubscriptionModel = None
78
- DomainModel = None
79
- T = TypeVar("T", bound=SubscriptionModel)
79
+ def validate_subscription_model_product_type(
80
+ subscription: SubscriptionModel,
81
+ validation_mode: LifecycleValidationMode = app_settings.LIFECYCLE_VALIDATION_MODE,
82
+ ) -> None:
83
+ """Validate that a subscription model has been instantiated with the correct product type class for its lifecycle status."""
84
+
85
+ actual_class = subscription.__class__
86
+ expected_class = lookup_specialized_type(actual_class, subscription.status)
87
+
88
+ if actual_class != expected_class:
89
+ msg = f"Subscription of type {actual_class} should use {expected_class} for lifecycle status '{subscription.status}'"
90
+ if validation_mode == LifecycleValidationMode.STRICT:
91
+ logger.error(msg)
92
+ raise ValueError(msg)
93
+ if validation_mode == LifecycleValidationMode.LOOSE:
94
+ logger.warning(msg)
95
+ elif validation_mode == LifecycleValidationMode.IGNORED:
96
+ pass
@@ -524,6 +524,7 @@ def restart_process(
524
524
  RESUMABLE_STATUSES = (
525
525
  ProcessStatus.SUSPENDED, # Can be resumed
526
526
  ProcessStatus.WAITING, # Can be retried
527
+ ProcessStatus.AWAITING_CALLBACK, # Can be resumed
527
528
  ProcessStatus.FAILED, # Can be retried
528
529
  ProcessStatus.API_UNAVAILABLE, # subtype of FAILED
529
530
  ProcessStatus.INCONSISTENT_DATA, # subtype of FAILED
orchestrator/settings.py CHANGED
@@ -30,6 +30,12 @@ class ExecutorType(strEnum):
30
30
  THREADPOOL = "threadpool"
31
31
 
32
32
 
33
+ class LifecycleValidationMode(strEnum):
34
+ STRICT = "strict"
35
+ LOOSE = "loose"
36
+ IGNORED = "ignored"
37
+
38
+
33
39
  class AppSettings(BaseSettings):
34
40
  TESTING: bool = True
35
41
  SESSION_SECRET: OrchSecretStr = "".join(secrets.choice(string.ascii_letters) for i in range(16)) # type: ignore
@@ -91,6 +97,7 @@ class AppSettings(BaseSettings):
91
97
  FILTER_BY_MODE: Literal["partial", "exact"] = "exact"
92
98
  EXPOSE_SETTINGS: bool = False
93
99
  EXPOSE_OAUTH_SETTINGS: bool = False
100
+ LIFECYCLE_VALIDATION_MODE: LifecycleValidationMode = LifecycleValidationMode.LOOSE
94
101
 
95
102
 
96
103
  app_settings = AppSettings()
@@ -19,6 +19,7 @@ from typing import Any, cast, get_args
19
19
  from uuid import UUID
20
20
 
21
21
  from orchestrator.domain.base import SubscriptionModel
22
+ from orchestrator.domain.lifecycle import validate_subscription_model_product_type
22
23
  from orchestrator.types import StepFunc, is_list_type, is_optional_type
23
24
  from orchestrator.utils.functional import logger
24
25
  from pydantic_forms.types import (
@@ -135,7 +136,7 @@ def _save_models(state: State) -> None:
135
136
  def _build_arguments(func: StepFunc | InputStepFunc, state: State) -> list: # noqa: C901
136
137
  """Build actual arguments based on step function signature and state.
137
138
 
138
- What the step function requests in its function signature it what this function retrieves from the state or DB.
139
+ What the step function requests in its function signature is what this function retrieves from the state or DB.
139
140
  Domain models are retrieved from the DB (after `subscription_id` lookup in the state). Everything else is
140
141
  retrieved from the state.
141
142
 
@@ -186,6 +187,7 @@ def _build_arguments(func: StepFunc | InputStepFunc, state: State) -> list: # n
186
187
  subscription_id = _get_sub_id(state.get(name))
187
188
  if subscription_id:
188
189
  sub_mod = param.annotation.from_subscription(subscription_id)
190
+ validate_subscription_model_product_type(sub_mod)
189
191
  arguments.append(sub_mod)
190
192
  else:
191
193
  logger.error("Could not find key in state.", key=name, state=state)
@@ -198,12 +200,15 @@ def _build_arguments(func: StepFunc | InputStepFunc, state: State) -> list: # n
198
200
  f"Step function argument '{param.name}' cannot be serialized from database with type 'Any'"
199
201
  )
200
202
  subscriptions = [actual_type.from_subscription(subscription_id) for subscription_id in subscription_ids]
203
+ for sub_mod in subscriptions:
204
+ validate_subscription_model_product_type(sub_mod)
201
205
  arguments.append(subscriptions)
202
206
  elif is_optional_type(param.annotation, SubscriptionModel):
203
207
  subscription_id = _get_sub_id(state.get(name))
204
208
  if subscription_id:
205
209
  # Actual type is first argument from optional type
206
210
  sub_mod = get_args(param.annotation)[0].from_subscription(subscription_id)
211
+ validate_subscription_model_product_type(sub_mod)
207
212
  arguments.append(sub_mod)
208
213
  else:
209
214
  arguments.append(None)
@@ -15,9 +15,12 @@ from copy import deepcopy
15
15
  import structlog
16
16
  from pydantic import ValidationError
17
17
 
18
+ from orchestrator import llm_settings
18
19
  from orchestrator.db import db
19
20
  from orchestrator.db.models import ProcessSubscriptionTable
20
21
  from orchestrator.domain.base import SubscriptionModel
22
+ from orchestrator.search.core.types import EntityType
23
+ from orchestrator.search.indexing import run_indexing_for_entity
21
24
  from orchestrator.services.settings import reset_search_index
22
25
  from orchestrator.services.subscriptions import get_subscription
23
26
  from orchestrator.targets import Target
@@ -141,9 +144,20 @@ def set_status(status: SubscriptionLifecycle) -> Step:
141
144
 
142
145
 
143
146
  @step("Refresh subscription search index")
144
- def refresh_subscription_search_index() -> State:
147
+ def refresh_subscription_search_index(subscription: SubscriptionModel | None) -> State:
148
+ """Refresh subscription search index.
149
+
150
+ Args:
151
+ subscription: Subscription to refresh search index.
152
+
153
+ Returns:
154
+ State of the workflow.
155
+
156
+ """
145
157
  try:
146
158
  reset_search_index()
159
+ if llm_settings.LLM_ENABLED and subscription:
160
+ run_indexing_for_entity(EntityType.SUBSCRIPTION, str(subscription.subscription_id))
147
161
  except Exception:
148
162
  # Don't fail workflow in case of unexpected error
149
163
  logger.warning("Error updated the subscriptions search index")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orchestrator-core
3
- Version: 4.5.0a3
3
+ Version: 4.5.0a5
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.14
@@ -36,12 +36,12 @@ Requires-Dist: apscheduler>=3.11.0
36
36
  Requires-Dist: click==8.*
37
37
  Requires-Dist: deepmerge==2.0
38
38
  Requires-Dist: deprecated>=1.2.18
39
- Requires-Dist: fastapi~=0.115.2
39
+ Requires-Dist: fastapi~=0.115.14
40
40
  Requires-Dist: fastapi-etag==0.4.0
41
41
  Requires-Dist: itsdangerous>=2.2.0
42
42
  Requires-Dist: jinja2==3.1.6
43
43
  Requires-Dist: more-itertools~=10.7.0
44
- Requires-Dist: nwa-stdlib~=1.9.0
44
+ Requires-Dist: nwa-stdlib~=1.9.2
45
45
  Requires-Dist: oauth2-lib>=2.4.1
46
46
  Requires-Dist: orjson==3.10.18
47
47
  Requires-Dist: pgvector>=0.4.1
@@ -49,7 +49,7 @@ Requires-Dist: prometheus-client==0.22.1
49
49
  Requires-Dist: psycopg2-binary==2.9.10
50
50
  Requires-Dist: pydantic-forms>=1.4.0
51
51
  Requires-Dist: pydantic-settings~=2.9.1
52
- Requires-Dist: pydantic[email]~=2.11.0
52
+ Requires-Dist: pydantic[email]~=2.11.7
53
53
  Requires-Dist: python-dateutil==2.8.2
54
54
  Requires-Dist: python-rapidjson>=1.18,<1.21
55
55
  Requires-Dist: pytz==2025.2
@@ -58,7 +58,7 @@ Requires-Dist: semver==3.0.4
58
58
  Requires-Dist: sentry-sdk[fastapi]~=2.29.1
59
59
  Requires-Dist: sqlalchemy==2.0.41
60
60
  Requires-Dist: sqlalchemy-utils==0.41.2
61
- Requires-Dist: strawberry-graphql>=0.246.2
61
+ Requires-Dist: strawberry-graphql>=0.281.0
62
62
  Requires-Dist: structlog>=25.4.0
63
63
  Requires-Dist: tabulate==0.9.0
64
64
  Requires-Dist: typer==0.15.4
@@ -79,7 +79,7 @@ Provides-Extra: llm
79
79
  [![codecov](https://codecov.io/gh/workfloworchestrator/orchestrator-core/branch/main/graph/badge.svg?token=5ANQFI2DHS)](https://codecov.io/gh/workfloworchestrator/orchestrator-core)
80
80
  [![pypi_version](https://img.shields.io/pypi/v/orchestrator-core?color=%2334D058&label=pypi%20package)](https://pypi.org/project/orchestrator-core)
81
81
  [![Supported python versions](https://img.shields.io/pypi/pyversions/orchestrator-core.svg?color=%2334D058)](https://pypi.org/project/orchestrator-core)
82
- ![Discord](https://img.shields.io/discord/1295834294270558280?style=flat&logo=discord&label=discord&link=https%3A%2F%2Fdiscord.gg%2FKNgF6gE8)
82
+ ![Discord](https://img.shields.io/discord/1295834294270558280?style=flat&logo=discord&label=discord&link=https%3A%2F%2Fdiscord.gg%fQkQn5ajFR)
83
83
 
84
84
  <p style="text-align: center"><em>Production ready Orchestration Framework to manage product lifecycle and workflows. Easy to use, built on top of FastAPI and Pydantic</em></p>
85
85
 
@@ -1,4 +1,4 @@
1
- orchestrator/__init__.py,sha256=2qjP04OyiwpdXVkj5X7tBnpTrC4iWMELv2zmJe2WZBs,1732
1
+ orchestrator/__init__.py,sha256=b10pIUZhMABs_krY5yARsqJHtuA72D1ceFcUATOAyZ8,1732
2
2
  orchestrator/agentic_app.py,sha256=bBMuH9Ub42nb8oFG0U00SzW_uQqnAayUX2tNs6yz1BM,2810
3
3
  orchestrator/app.py,sha256=UPKQuDpg8MWNC6r3SRRbp6l9RBzwb00IMIaGRk-jbCU,13203
4
4
  orchestrator/exception_handlers.py,sha256=UsW3dw8q0QQlNLcV359bIotah8DYjMsj2Ts1LfX4ClY,1268
@@ -6,7 +6,7 @@ orchestrator/llm_settings.py,sha256=PJ3vf5aEugVigHFU7iw9haQon_bC7Y268GTFhfFaQHs,
6
6
  orchestrator/log_config.py,sha256=1cPl_OXT4tEUyNxG8cwIWXrmadUm1E81vq0mdtrV-v4,1912
7
7
  orchestrator/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  orchestrator/security.py,sha256=iXFxGxab54aav7oHEKLAVkTgrQMJGHy6IYLojEnD7gI,2422
9
- orchestrator/settings.py,sha256=30iYKd_wNtjIO12DZ4LrH9w9OJgtmQ2AFEOSnrVTsRg,4365
9
+ orchestrator/settings.py,sha256=Xl6bXd2VtosBTOuv4PClgVv9KoVDItThYkhDzf4IYxc,4560
10
10
  orchestrator/targets.py,sha256=d7Fyh_mWIWPivA_E7DTNFpZID3xFW_K0JlZ5nksVX7k,830
11
11
  orchestrator/types.py,sha256=qzs7xx5AYRmKbpYRyJJP3wuDb0W0bcAzefCN0RWLAco,15459
12
12
  orchestrator/version.py,sha256=b58e08lxs47wUNXv0jXFO_ykpksmytuzEXD4La4W-NQ,1366
@@ -16,10 +16,10 @@ orchestrator/api/error_handling.py,sha256=YrPCxSa-DSa9KwqIMlXI-KGBGnbGIW5ukOPiik
16
16
  orchestrator/api/helpers.py,sha256=s0QRHYw8AvEmlkmRhuEzz9xixaZKUF3YuPzUVHkcoXk,6933
17
17
  orchestrator/api/models.py,sha256=z9BDBx7uI4KBHWbD_LVrLsqNQ0_w-Mg9Qiy7PR_rZhk,5996
18
18
  orchestrator/api/api_v1/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
19
- orchestrator/api/api_v1/api.py,sha256=FHOEwVfyQsStZmWUlxto26vI5OvqsJF2DgtSxyuiQJo,3124
19
+ orchestrator/api/api_v1/api.py,sha256=7_alDkK-UfqCauCSCFfQzDIwZHVI_CrRvLCMuCR0408,3276
20
20
  orchestrator/api/api_v1/endpoints/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
21
21
  orchestrator/api/api_v1/endpoints/health.py,sha256=iaxs1XX1_250_gKNsspuULCV2GEMBjbtjsmfQTOvMAI,1284
22
- orchestrator/api/api_v1/endpoints/processes.py,sha256=238Bydgj4ILNyMU_7j_Q7a0WGlfIvKv5ypP7lESU32w,16188
22
+ orchestrator/api/api_v1/endpoints/processes.py,sha256=OVbt6FgFnJ4aHaYGIg0cPoim8mxDpdzJ4TGAyfB_kPw,16269
23
23
  orchestrator/api/api_v1/endpoints/product_blocks.py,sha256=kZ6ywIOsS_S2qGq7RvZ4KzjvaS1LmwbGWR37AKRvWOw,2146
24
24
  orchestrator/api/api_v1/endpoints/products.py,sha256=BfFtwu9dZXEQbtKxYj9icc73GKGvAGMR5ytyf41nQlQ,3081
25
25
  orchestrator/api/api_v1/endpoints/resource_types.py,sha256=gGyuaDyOD0TAVoeFGaGmjDGnQ8eQQArOxKrrk4MaDzA,2145
@@ -149,11 +149,11 @@ orchestrator/distlock/managers/__init__.py,sha256=ImIkNsrXcyE7-NgRWqEhUXUuUzda9K
149
149
  orchestrator/distlock/managers/memory_distlock_manager.py,sha256=HWQafcVKBF-Cka_wukZZ1GM69AWPVOpJPje3quIebQ8,3114
150
150
  orchestrator/distlock/managers/redis_distlock_manager.py,sha256=DXtMhC8qtxiFO6xU9qYXHZQnCLjlmGBpeyfLA0vbRP0,3369
151
151
  orchestrator/domain/__init__.py,sha256=20DhXQPKY0g3rTgCkRlNDY58sLviToOVF8NPoex9WJc,936
152
- orchestrator/domain/base.py,sha256=jjMxJvt0GyaTff_z490lmkqDCtitkh0oA4GygB60n4s,69939
152
+ orchestrator/domain/base.py,sha256=8_f4zmaKHIy4JtyY_QgLoF8_-llgW9-7QOfqAJgacEw,69894
153
153
  orchestrator/domain/context_cache.py,sha256=vT1a01MBSBIaokoShK9KwjItd7abNmz7cXaF67VRZK8,2508
154
154
  orchestrator/domain/customer_description.py,sha256=RU_pcgCIZjjFfDsY45lfV0z6ATlS1NXtB0E7eH3UcYQ,3190
155
155
  orchestrator/domain/helpers.py,sha256=D9O2duhCAZGmm39u-9ggvU-X2JsCbIS607kF77-r8QM,2549
156
- orchestrator/domain/lifecycle.py,sha256=kGR0AFVOSUBlzdhgRr11CUnF26wbBYIjz8uKb_qPCg0,2922
156
+ orchestrator/domain/lifecycle.py,sha256=FO31mhgtHbq5H3Qr9vzA36PxSLu_icJqcuqFex0PQnk,3823
157
157
  orchestrator/domain/subscription_instance_transform.py,sha256=j_d49dFcSss0dl-BHS-ev2faLbE0y8hLvCfrzui6C74,4360
158
158
  orchestrator/forms/__init__.py,sha256=bw_1238HKy_T0gvfA5oEjJFwkALzvWU4O_VJ0xE8UyU,1168
159
159
  orchestrator/forms/validators/__init__.py,sha256=2T7w429dQhChsAbnQDeyp2BrM_iKj6-nkNrz27RZatY,1906
@@ -319,7 +319,7 @@ orchestrator/services/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8X
319
319
  orchestrator/services/fixed_inputs.py,sha256=kyz7s2HLzyDulvcq-ZqefTw1om86COvyvTjz0_5CmgI,876
320
320
  orchestrator/services/input_state.py,sha256=6BZOpb3cHpO18K-XG-3QUIV9pIM25_ufdODrp5CmXG4,2390
321
321
  orchestrator/services/process_broadcast_thread.py,sha256=D44YbjF8mRqGuznkRUV4SoRn1J0lfy_x1H508GnSVlU,4649
322
- orchestrator/services/processes.py,sha256=NfzdtH4eZK_wYuSmFtUX69qDvoeI8J7sJ2fFyY_VYaM,30544
322
+ orchestrator/services/processes.py,sha256=V-BHR8-9qw5cFHRuBJK8UkRQgCwQxFQbOnnwpKzJm0o,30599
323
323
  orchestrator/services/products.py,sha256=BP4KyE8zO-8z7Trrs5T6zKBOw53S9BfBJnHWI3p6u5Y,1943
324
324
  orchestrator/services/resource_types.py,sha256=_QBy_JOW_X3aSTqH0CuLrq4zBJL0p7Q-UDJUcuK2_qc,884
325
325
  orchestrator/services/settings.py,sha256=HEWfFulgoEDwgfxGEO__QTr5fDiwNBEj1UhAeTAdbLQ,3159
@@ -350,7 +350,7 @@ orchestrator/utils/json.py,sha256=7386sdqkrKYyy4sbn5NscwctH_v1hLyw5172P__rU3g,83
350
350
  orchestrator/utils/redis.py,sha256=BjUNmrKx8YVyJIucl2mhXubK6WV-49OnAU6rPMOZpM0,4469
351
351
  orchestrator/utils/redis_client.py,sha256=9rhsvedjK_CyClAjUicQyge0mVIViATqKFGZyjBY3XA,1384
352
352
  orchestrator/utils/search_query.py,sha256=ji5LHtrzohGz6b1IG41cnPdpWXzLEzz4SGWgHly_yfU,16205
353
- orchestrator/utils/state.py,sha256=RYKVlvKDBfsBdDk9wHjZKBTlQJbV4SqtCotAlTA2-bI,14021
353
+ orchestrator/utils/state.py,sha256=ELH08cxvpmpnJg_ae0sMi9m_QX6SqHxNzOFaJgyW9gM,14344
354
354
  orchestrator/utils/strings.py,sha256=N0gWjmQaMjE9_99VtRvRaU8IBLTKMgBKSXcTZ9TpWAg,1077
355
355
  orchestrator/utils/validate_data_version.py,sha256=3Eioy2wE2EWKSgkyMKcEKrkCAfUIAq-eb73iRcpgppw,184
356
356
  orchestrator/websocket/__init__.py,sha256=V79jskk1z3uPIYgu0Gt6JLzuqr7NGfNeAZ-hbBqoUv4,5745
@@ -360,7 +360,7 @@ orchestrator/websocket/managers/memory_websocket_manager.py,sha256=lF5EEx1iFMCGE
360
360
  orchestrator/workflows/__init__.py,sha256=NzIGGI-8SNAwCk2YqH6sHhEWbgAY457ntDwjO15N8v4,4131
361
361
  orchestrator/workflows/modify_note.py,sha256=eXt5KQvrkOXf-3YEXCn2XbBLP9N-n1pUYRW2t8Odupo,2150
362
362
  orchestrator/workflows/removed_workflow.py,sha256=V0Da5TEdfLdZZKD38ig-MTp3_IuE7VGqzHHzvPYQmLI,909
363
- orchestrator/workflows/steps.py,sha256=CZxfzkG5ANJYwuYTkQ4da2RpQqIjXCtey_Uy1ezRAZ4,6479
363
+ orchestrator/workflows/steps.py,sha256=RX1ioybVUGy0m5oRubP0QshupXZk3e2fDKeq-Pjs6mY,6991
364
364
  orchestrator/workflows/utils.py,sha256=VUCDoIl5XAKtIeAJpVpyW2pCIg3PoVWfwGn28BYlYhA,15424
365
365
  orchestrator/workflows/tasks/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
366
366
  orchestrator/workflows/tasks/cleanup_tasks_log.py,sha256=BfWYbPXhnLAHUJ0mlODDnjZnQQAvKCZJDVTwbwOWI04,1624
@@ -368,7 +368,7 @@ orchestrator/workflows/tasks/resume_workflows.py,sha256=T3iobSJjVgiupe0rClD34kUZ
368
368
  orchestrator/workflows/tasks/validate_product_type.py,sha256=paG-NAY1bdde3Adt8zItkcBKf5Pxw6f5ngGW6an6dYU,3192
369
369
  orchestrator/workflows/tasks/validate_products.py,sha256=kXBGZTkobfYH8e_crhdErT-ypdouH0a3_WLImmbKXcE,8523
370
370
  orchestrator/workflows/translations/en-GB.json,sha256=ST53HxkphFLTMjFHonykDBOZ7-P_KxksktZU3GbxLt0,846
371
- orchestrator_core-4.5.0a3.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
372
- orchestrator_core-4.5.0a3.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
373
- orchestrator_core-4.5.0a3.dist-info/METADATA,sha256=m1FaoxcMxdfPSE_HwuQ0QSJc432amisFx_jE82A6lPI,6169
374
- orchestrator_core-4.5.0a3.dist-info/RECORD,,
371
+ orchestrator_core-4.5.0a5.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
372
+ orchestrator_core-4.5.0a5.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
373
+ orchestrator_core-4.5.0a5.dist-info/METADATA,sha256=yV6h6TReX2PlujuKdKBTjdG7uCF-TezTQlpgUlPYkK8,6170
374
+ orchestrator_core-4.5.0a5.dist-info/RECORD,,