orchestrator-core 4.1.0rc1__py3-none-any.whl → 4.2.0rc1__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/workflow.py CHANGED
@@ -45,6 +45,8 @@ from orchestrator.db import db, transactional
45
45
  from orchestrator.services.settings import get_engine_settings
46
46
  from orchestrator.targets import Target
47
47
  from orchestrator.types import ErrorDict, StepFunc
48
+ from orchestrator.utils.auth import Authorizer
49
+ from orchestrator.utils.datetime import nowtz
48
50
  from orchestrator.utils.docs import make_workflow_doc
49
51
  from orchestrator.utils.errors import error_state_to_dict
50
52
  from orchestrator.utils.state import form_inject_args, inject_args
@@ -80,6 +82,8 @@ class Step(Protocol):
80
82
  name: str
81
83
  form: InputFormGenerator | None
82
84
  assignee: Assignee | None
85
+ resume_auth_callback: Authorizer | None = None
86
+ retry_auth_callback: Authorizer | None = None
83
87
 
84
88
  def __call__(self, state: State) -> Process: ...
85
89
 
@@ -90,7 +94,8 @@ class Workflow(Protocol):
90
94
  __qualname__: str
91
95
  name: str
92
96
  description: str
93
- authorize_callback: Callable[[OIDCUserModel | None], bool]
97
+ authorize_callback: Authorizer
98
+ retry_auth_callback: Authorizer
94
99
  initial_input_form: InputFormGenerator | None = None
95
100
  target: Target
96
101
  steps: StepList
@@ -99,13 +104,20 @@ class Workflow(Protocol):
99
104
 
100
105
 
101
106
  def make_step_function(
102
- f: Callable, name: str, form: InputFormGenerator | None = None, assignee: Assignee | None = Assignee.SYSTEM
107
+ f: Callable,
108
+ name: str,
109
+ form: InputFormGenerator | None = None,
110
+ assignee: Assignee | None = Assignee.SYSTEM,
111
+ resume_auth_callback: Authorizer | None = None,
112
+ retry_auth_callback: Authorizer | None = None,
103
113
  ) -> Step:
104
114
  step_func = cast(Step, f)
105
115
 
106
116
  step_func.name = name
107
117
  step_func.form = form
108
118
  step_func.assignee = assignee
119
+ step_func.resume_auth_callback = resume_auth_callback
120
+ step_func.retry_auth_callback = retry_auth_callback
109
121
  return step_func
110
122
 
111
123
 
@@ -167,6 +179,7 @@ class StepList(list[Step]):
167
179
 
168
180
 
169
181
  def _handle_simple_input_form_generator(f: StateInputStepFunc) -> StateInputFormGenerator:
182
+ """Processes f into a form generator and injects a pre-hook for user authorization."""
170
183
  if inspect.isgeneratorfunction(f):
171
184
  return cast(StateInputFormGenerator, f)
172
185
  if inspect.isgenerator(f):
@@ -191,7 +204,8 @@ def make_workflow(
191
204
  initial_input_form: InputStepFunc | None,
192
205
  target: Target,
193
206
  steps: StepList,
194
- authorize_callback: Callable[[OIDCUserModel | None], bool] | None = None,
207
+ authorize_callback: Authorizer | None = None,
208
+ retry_auth_callback: Authorizer | None = None,
195
209
  ) -> Workflow:
196
210
  @functools.wraps(f)
197
211
  def wrapping_function() -> NoReturn:
@@ -202,6 +216,10 @@ def make_workflow(
202
216
  wrapping_function.name = f.__name__ # default, will be changed by LazyWorkflowInstance
203
217
  wrapping_function.description = description
204
218
  wrapping_function.authorize_callback = allow if authorize_callback is None else authorize_callback
219
+ # If no retry auth policy is given, defer to policy for process creation.
220
+ wrapping_function.retry_auth_callback = (
221
+ wrapping_function.authorize_callback if retry_auth_callback is None else retry_auth_callback
222
+ )
205
223
 
206
224
  if initial_input_form is None:
207
225
  # We always need a form to prevent starting a workflow when no input is needed.
@@ -270,9 +288,16 @@ def retrystep(name: str) -> Callable[[StepFunc], Step]:
270
288
  return decorator
271
289
 
272
290
 
273
- def inputstep(name: str, assignee: Assignee) -> Callable[[InputStepFunc], Step]:
291
+ def inputstep(
292
+ name: str,
293
+ assignee: Assignee,
294
+ resume_auth_callback: Authorizer | None = None,
295
+ retry_auth_callback: Authorizer | None = None,
296
+ ) -> Callable[[InputStepFunc], Step]:
274
297
  """Add user input step to workflow.
275
298
 
299
+ Any authorization callbacks will be attached to the resulting Step.
300
+
276
301
  IMPORTANT: In contrast to other workflow steps, the `@inputstep` wrapped function will not run in the
277
302
  workflow engine! This means that it must be free of side effects!
278
303
 
@@ -299,7 +324,14 @@ def inputstep(name: str, assignee: Assignee) -> Callable[[InputStepFunc], Step]:
299
324
  def suspend(state: State) -> Process:
300
325
  return Suspend(state)
301
326
 
302
- return make_step_function(suspend, name, wrapper, assignee)
327
+ return make_step_function(
328
+ suspend,
329
+ name,
330
+ wrapper,
331
+ assignee,
332
+ resume_auth_callback=resume_auth_callback,
333
+ retry_auth_callback=retry_auth_callback,
334
+ )
303
335
 
304
336
  return decorator
305
337
 
@@ -350,11 +382,13 @@ def step_group(name: str, steps: StepList, extract_form: bool = True) -> Step:
350
382
  p = p.map(lambda s: s | {"__replace_last_state": True})
351
383
  return step_log_fn(step_, p)
352
384
 
385
+ step_group_start_time = nowtz().timestamp()
353
386
  process: Process = Success(initial_state)
354
387
  process = _exec_steps(step_list, process, dblogstep)
355
-
356
388
  # Add instruction to replace state of last sub step before returning process _exec_steps higher in the call tree
357
- return process.map(lambda s: s | {"__replace_last_state": True})
389
+ return process.map(
390
+ lambda s: s | {"__replace_last_state": True, "__last_step_started_at": step_group_start_time}
391
+ )
358
392
 
359
393
  # Make sure we return a form is a sub step has a form
360
394
  form = next((sub_step.form for sub_step in steps if sub_step.form), None) if extract_form else None
@@ -479,7 +513,8 @@ def workflow(
479
513
  description: str,
480
514
  initial_input_form: InputStepFunc | None = None,
481
515
  target: Target = Target.SYSTEM,
482
- authorize_callback: Callable[[OIDCUserModel | None], bool] | None = None,
516
+ authorize_callback: Authorizer | None = None,
517
+ retry_auth_callback: Authorizer | None = None,
483
518
  ) -> Callable[[Callable[[], StepList]], Workflow]:
484
519
  """Transform an initial_input_form and a step list into a workflow.
485
520
 
@@ -500,7 +535,13 @@ def workflow(
500
535
 
501
536
  def _workflow(f: Callable[[], StepList]) -> Workflow:
502
537
  return make_workflow(
503
- f, description, initial_input_form_in_form_inject_args, target, f(), authorize_callback=authorize_callback
538
+ f,
539
+ description,
540
+ initial_input_form_in_form_inject_args,
541
+ target,
542
+ f(),
543
+ authorize_callback=authorize_callback,
544
+ retry_auth_callback=retry_auth_callback,
504
545
  )
505
546
 
506
547
  return _workflow
@@ -1416,6 +1457,8 @@ def _exec_steps(steps: StepList, starting_process: Process, dblogstep: StepLogFu
1416
1457
  "Not executing Step as the workflow engine is Paused. Process will remain in state 'running'"
1417
1458
  )
1418
1459
  return process
1460
+
1461
+ process = process.map(lambda s: s | {"__last_step_started_at": nowtz().timestamp()})
1419
1462
  step_result_process = process.execute_step(step)
1420
1463
  except Exception as e:
1421
1464
  consolelogger.error("An exception occurred while executing the workflow step.")
@@ -53,4 +53,4 @@ def store_subscription_note(subscription_id: UUIDstr, note: str) -> State:
53
53
 
54
54
  @workflow("Modify Note", initial_input_form=wrap_modify_initial_input_form(initial_input_form), target=Target.MODIFY)
55
55
  def modify_note() -> StepList:
56
- return init >> store_process_subscription(Target.MODIFY) >> store_subscription_note >> done
56
+ return init >> store_process_subscription() >> store_subscription_note >> done
@@ -23,6 +23,7 @@ from orchestrator.services.subscriptions import get_subscription
23
23
  from orchestrator.targets import Target
24
24
  from orchestrator.types import SubscriptionLifecycle
25
25
  from orchestrator.utils.json import to_serializable
26
+ from orchestrator.websocket import sync_invalidate_subscription_cache
26
27
  from orchestrator.workflow import Step, step
27
28
  from pydantic_forms.types import State, UUIDstr
28
29
 
@@ -33,6 +34,7 @@ logger = structlog.get_logger(__name__)
33
34
  def resync(subscription: SubscriptionModel) -> State:
34
35
  """Transition a subscription to in sync."""
35
36
  subscription.insync = True
37
+ sync_invalidate_subscription_cache(subscription.subscription_id)
36
38
  return {"subscription": subscription}
37
39
 
38
40
 
@@ -93,6 +95,7 @@ def unsync(subscription_id: UUIDstr, __old_subscriptions__: dict | None = None)
93
95
  if not subscription.insync:
94
96
  raise ValueError("Subscription is already out of sync, cannot continue!")
95
97
  subscription.insync = False
98
+ sync_invalidate_subscription_cache(subscription.subscription_id)
96
99
 
97
100
  return {"subscription": subscription, "__old_subscriptions__": subscription_backup}
98
101
 
@@ -105,20 +108,23 @@ def unsync_unchecked(subscription_id: UUIDstr) -> State:
105
108
  return {"subscription": subscription}
106
109
 
107
110
 
108
- def store_process_subscription_relationship(
109
- process_id: UUIDstr, subscription_id: UUIDstr, workflow_target: str
110
- ) -> ProcessSubscriptionTable:
111
- process_subscription = ProcessSubscriptionTable(
112
- process_id=process_id, subscription_id=subscription_id, workflow_target=workflow_target
113
- )
111
+ def store_process_subscription_relationship(process_id: UUIDstr, subscription_id: UUIDstr) -> ProcessSubscriptionTable:
112
+ process_subscription = ProcessSubscriptionTable(process_id=process_id, subscription_id=subscription_id)
114
113
  db.session.add(process_subscription)
115
114
  return process_subscription
116
115
 
117
116
 
118
- def store_process_subscription(workflow_target: Target) -> Step:
117
+ def store_process_subscription(workflow_target: Target | None = None) -> Step:
118
+ if workflow_target:
119
+ deprecation_warning = (
120
+ "Providing a workflow target to function store_process_subscription() is deprecated. "
121
+ "This information is already stored in the workflow table."
122
+ )
123
+ logger.warning(deprecation_warning)
124
+
119
125
  @step("Create Process Subscription relation")
120
126
  def _store_process_subscription(process_id: UUIDstr, subscription_id: UUIDstr) -> None:
121
- store_process_subscription_relationship(process_id, subscription_id, workflow_target)
127
+ store_process_subscription_relationship(process_id, subscription_id)
122
128
 
123
129
  return _store_process_subscription
124
130
 
@@ -20,12 +20,12 @@ from more_itertools import first_true
20
20
  from pydantic import field_validator, model_validator
21
21
  from sqlalchemy import select
22
22
 
23
- from oauth2_lib.fastapi import OIDCUserModel
24
23
  from orchestrator.db import ProductTable, SubscriptionTable, db
25
24
  from orchestrator.forms.validators import ProductId
26
25
  from orchestrator.services import subscriptions
27
26
  from orchestrator.targets import Target
28
27
  from orchestrator.types import SubscriptionLifecycle
28
+ from orchestrator.utils.auth import Authorizer
29
29
  from orchestrator.utils.errors import StaleDataError
30
30
  from orchestrator.utils.state import form_inject_args
31
31
  from orchestrator.utils.validate_data_version import validate_data_version
@@ -201,7 +201,8 @@ def create_workflow(
201
201
  initial_input_form: InputStepFunc | None = None,
202
202
  status: SubscriptionLifecycle = SubscriptionLifecycle.ACTIVE,
203
203
  additional_steps: StepList | None = None,
204
- authorize_callback: Callable[[OIDCUserModel | None], bool] | None = None,
204
+ authorize_callback: Authorizer | None = None,
205
+ retry_auth_callback: Authorizer | None = None,
205
206
  ) -> Callable[[Callable[[], StepList]], Workflow]:
206
207
  """Transform an initial_input_form and a step list into a workflow with a target=Target.CREATE.
207
208
 
@@ -234,6 +235,7 @@ def create_workflow(
234
235
  Target.CREATE,
235
236
  steplist,
236
237
  authorize_callback=authorize_callback,
238
+ retry_auth_callback=retry_auth_callback,
237
239
  )
238
240
 
239
241
  return _create_workflow
@@ -243,7 +245,8 @@ def modify_workflow(
243
245
  description: str,
244
246
  initial_input_form: InputStepFunc | None = None,
245
247
  additional_steps: StepList | None = None,
246
- authorize_callback: Callable[[OIDCUserModel | None], bool] | None = None,
248
+ authorize_callback: Authorizer | None = None,
249
+ retry_auth_callback: Authorizer | None = None,
247
250
  ) -> Callable[[Callable[[], StepList]], Workflow]:
248
251
  """Transform an initial_input_form and a step list into a workflow.
249
252
 
@@ -262,7 +265,7 @@ def modify_workflow(
262
265
  def _modify_workflow(f: Callable[[], StepList]) -> Workflow:
263
266
  steplist = (
264
267
  init
265
- >> store_process_subscription(Target.MODIFY)
268
+ >> store_process_subscription()
266
269
  >> unsync
267
270
  >> f()
268
271
  >> (additional_steps or StepList())
@@ -278,6 +281,7 @@ def modify_workflow(
278
281
  Target.MODIFY,
279
282
  steplist,
280
283
  authorize_callback=authorize_callback,
284
+ retry_auth_callback=retry_auth_callback,
281
285
  )
282
286
 
283
287
  return _modify_workflow
@@ -287,7 +291,8 @@ def terminate_workflow(
287
291
  description: str,
288
292
  initial_input_form: InputStepFunc | None = None,
289
293
  additional_steps: StepList | None = None,
290
- authorize_callback: Callable[[OIDCUserModel | None], bool] | None = None,
294
+ authorize_callback: Authorizer | None = None,
295
+ retry_auth_callback: Authorizer | None = None,
291
296
  ) -> Callable[[Callable[[], StepList]], Workflow]:
292
297
  """Transform an initial_input_form and a step list into a workflow.
293
298
 
@@ -306,7 +311,7 @@ def terminate_workflow(
306
311
  def _terminate_workflow(f: Callable[[], StepList]) -> Workflow:
307
312
  steplist = (
308
313
  init
309
- >> store_process_subscription(Target.TERMINATE)
314
+ >> store_process_subscription()
310
315
  >> unsync
311
316
  >> f()
312
317
  >> (additional_steps or StepList())
@@ -323,6 +328,7 @@ def terminate_workflow(
323
328
  Target.TERMINATE,
324
329
  steplist,
325
330
  authorize_callback=authorize_callback,
331
+ retry_auth_callback=retry_auth_callback,
326
332
  )
327
333
 
328
334
  return _terminate_workflow
@@ -342,7 +348,7 @@ def validate_workflow(description: str) -> Callable[[Callable[[], StepList]], Wo
342
348
  """
343
349
 
344
350
  def _validate_workflow(f: Callable[[], StepList]) -> Workflow:
345
- steplist = init >> store_process_subscription(Target.SYSTEM) >> unsync_unchecked >> f() >> resync >> done
351
+ steplist = init >> store_process_subscription() >> unsync_unchecked >> f() >> resync >> done
346
352
 
347
353
  return make_workflow(f, description, validate_initial_input_form_generator, Target.VALIDATE, steplist)
348
354
 
@@ -0,0 +1,167 @@
1
+ Metadata-Version: 2.4
2
+ Name: orchestrator-core
3
+ Version: 4.2.0rc1
4
+ Summary: This is the orchestrator workflow engine.
5
+ Author-email: SURF <automation-beheer@surf.nl>
6
+ Requires-Python: >=3.11,<3.14
7
+ Description-Content-Type: text/markdown
8
+ License-Expression: Apache-2.0
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: Environment :: Web Environment
11
+ Classifier: Framework :: AsyncIO
12
+ Classifier: Framework :: FastAPI
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Intended Audience :: Information Technology
15
+ Classifier: Intended Audience :: System Administrators
16
+ Classifier: Intended Audience :: Telecommunications Industry
17
+ Classifier: Operating System :: OS Independent
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Programming Language :: Python
24
+ Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
25
+ Classifier: Topic :: Internet :: WWW/HTTP
26
+ Classifier: Topic :: Internet
27
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
28
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
29
+ Classifier: Topic :: Software Development :: Libraries
30
+ Classifier: Topic :: Software Development
31
+ Classifier: Typing :: Typed
32
+ License-File: LICENSE
33
+ Requires-Dist: alembic==1.16.1
34
+ Requires-Dist: anyio>=3.7.0
35
+ Requires-Dist: click==8.*
36
+ Requires-Dist: deepmerge==2.0
37
+ Requires-Dist: deprecated>=1.2.18
38
+ Requires-Dist: fastapi~=0.115.2
39
+ Requires-Dist: fastapi-etag==0.4.0
40
+ Requires-Dist: itsdangerous>=2.2.0
41
+ Requires-Dist: jinja2==3.1.6
42
+ Requires-Dist: more-itertools~=10.7.0
43
+ Requires-Dist: nwa-stdlib~=1.9.0
44
+ Requires-Dist: oauth2-lib~=2.4.0
45
+ Requires-Dist: orjson==3.10.18
46
+ Requires-Dist: prometheus-client==0.22.1
47
+ Requires-Dist: psycopg2-binary==2.9.10
48
+ Requires-Dist: pydantic-forms>=1.4.0,<=2.1.0
49
+ Requires-Dist: pydantic-settings~=2.9.1
50
+ Requires-Dist: pydantic[email]~=2.8.2
51
+ Requires-Dist: python-dateutil==2.8.2
52
+ Requires-Dist: python-rapidjson>=1.18,<1.21
53
+ Requires-Dist: pytz==2025.2
54
+ Requires-Dist: redis==5.1.1
55
+ Requires-Dist: schedule==1.1.0
56
+ Requires-Dist: semver==3.0.4
57
+ Requires-Dist: sentry-sdk[fastapi]~=2.29.1
58
+ Requires-Dist: sqlalchemy==2.0.41
59
+ Requires-Dist: sqlalchemy-utils==0.41.2
60
+ Requires-Dist: strawberry-graphql>=0.246.2
61
+ Requires-Dist: structlog>=25.4.0
62
+ Requires-Dist: tabulate==0.9.0
63
+ Requires-Dist: typer==0.15.4
64
+ Requires-Dist: uvicorn[standard]~=0.34.0
65
+ Requires-Dist: celery~=5.5.1 ; extra == "celery"
66
+ Project-URL: Documentation, https://workfloworchestrator.org/orchestrator-core
67
+ Project-URL: Homepage, https://workfloworchestrator.org/orchestrator-core
68
+ Project-URL: Source, https://github.com/workfloworchestrator/orchestrator-core
69
+ Provides-Extra: celery
70
+
71
+ # Orchestrator-Core
72
+
73
+ [![Downloads](https://pepy.tech/badge/orchestrator-core/month)](https://pepy.tech/project/orchestrator-core)
74
+ [![codecov](https://codecov.io/gh/workfloworchestrator/orchestrator-core/branch/main/graph/badge.svg?token=5ANQFI2DHS)](https://codecov.io/gh/workfloworchestrator/orchestrator-core)
75
+ [![pypi_version](https://img.shields.io/pypi/v/orchestrator-core?color=%2334D058&label=pypi%20package)](https://pypi.org/project/orchestrator-core)
76
+ [![Supported python versions](https://img.shields.io/pypi/pyversions/orchestrator-core.svg?color=%2334D058)](https://pypi.org/project/orchestrator-core)
77
+ ![Discord](https://img.shields.io/discord/1295834294270558280?style=flat&logo=discord&label=discord&link=https%3A%2F%2Fdiscord.gg%2FKNgF6gE8)
78
+
79
+ <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>
80
+
81
+ ## Documentation
82
+
83
+ The documentation can be found at [workfloworchestrator.org](https://workfloworchestrator.org/orchestrator-core/).
84
+
85
+ ## Installation (quick start)
86
+
87
+ Simplified steps to install and use the orchestrator-core.
88
+ For more details, read the [Getting started](https://workfloworchestrator.org/orchestrator-core/getting-started/base/) documentation.
89
+
90
+ ### Step 1 - Install the package
91
+
92
+ Create a virtualenv and install the orchestrator-core.
93
+
94
+ ```shell
95
+ python -m venv .venv
96
+ source .venv/bin/activate
97
+ pip install orchestrator-core
98
+ ```
99
+
100
+ ### Step 2 - Setup the database
101
+
102
+ Create a postgres database:
103
+
104
+ ```shell
105
+ createuser -sP nwa
106
+ createdb orchestrator-core -O nwa # set password to 'nwa'
107
+ ```
108
+
109
+ Configure the database URI in your local environment:
110
+
111
+ ```
112
+ export DATABASE_URI=postgresql://nwa:nwa@localhost:5432/orchestrator-core
113
+ ```
114
+
115
+ ### Step 3 - Create main.py
116
+
117
+ Create a `main.py` file.
118
+
119
+ ```python
120
+ from orchestrator import OrchestratorCore
121
+ from orchestrator.cli.main import app as core_cli
122
+ from orchestrator.settings import AppSettings
123
+
124
+ app = OrchestratorCore(base_settings=AppSettings())
125
+
126
+ if __name__ == "__main__":
127
+ core_cli()
128
+ ```
129
+
130
+ ### Step 4 - Run the database migrations
131
+
132
+ Initialize the migration environment and database tables.
133
+
134
+ ```shell
135
+ python main.py db init
136
+ python main.py db upgrade heads
137
+ ```
138
+
139
+ ### Step 5 - Run the app
140
+
141
+ ```shell
142
+ export OAUTH2_ACTIVE=False
143
+ uvicorn --reload --host 127.0.0.1 --port 8080 main:app
144
+ ```
145
+
146
+ Visit the [ReDoc](http://127.0.0.1:8080/api/redoc) or [OpenAPI](http://127.0.0.1:8080/api/docs) page to view and interact with the API.
147
+
148
+ ## Contributing
149
+
150
+ We use [uv](https://docs.astral.sh/uv/getting-started/installation/) to manage dependencies.
151
+
152
+ To get started, follow these steps:
153
+
154
+ ```shell
155
+ # in your postgres database
156
+ createdb orchestrator-core-test -O nwa # set password to 'nwa'
157
+
158
+ # on your local machine
159
+ git clone https://github.com/workfloworchestrator/orchestrator-core
160
+ cd orchestrator-core
161
+ export DATABASE_URI=postgresql://nwa:nwa@localhost:5432/orchestrator-core-test
162
+ uv sync --all-extras --all-groups
163
+ uv run pytest
164
+ ```
165
+
166
+ For more details please read the [development docs](https://workfloworchestrator.org/orchestrator-core/contributing/development/).
167
+
@@ -1,4 +1,4 @@
1
- orchestrator/__init__.py,sha256=tOY8a4U2sGqlMaBFFS05G5fpTsG5MQWrMraMt7i-SW0,1066
1
+ orchestrator/__init__.py,sha256=KuNtfAwhqS1RMy4hovcLLlT1kTH_aNMFLNu1SnkB0Qo,1066
2
2
  orchestrator/app.py,sha256=7UrXKjBKNSEaSSXAd5ww_RdMFhFqE4yvfj8faS2MzAA,12089
3
3
  orchestrator/exception_handlers.py,sha256=UsW3dw8q0QQlNLcV359bIotah8DYjMsj2Ts1LfX4ClY,1268
4
4
  orchestrator/log_config.py,sha256=1tPRX5q65e57a6a_zEii_PFK8SzWT0mnA5w2sKg4hh8,1853
@@ -8,7 +8,7 @@ orchestrator/settings.py,sha256=TFIv09JIKY-lXqd04lH_XEcijEEyheaz3zTcgeG8DEI,4339
8
8
  orchestrator/targets.py,sha256=WizBgnp8hWX9YLFUIju7ewSubiwQqinCvyiYNcXHbHI,802
9
9
  orchestrator/types.py,sha256=qzs7xx5AYRmKbpYRyJJP3wuDb0W0bcAzefCN0RWLAco,15459
10
10
  orchestrator/version.py,sha256=b58e08lxs47wUNXv0jXFO_ykpksmytuzEXD4La4W-NQ,1366
11
- orchestrator/workflow.py,sha256=T_3Z1PrlF70C16ehAthKRF1hd3jpwV-MREDVxSLfxOw,44063
11
+ orchestrator/workflow.py,sha256=PVHe6vnnkswzqw2UoY-j6NMSEhL6rLHXRnO7yLOyDC8,45551
12
12
  orchestrator/api/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
13
13
  orchestrator/api/error_handling.py,sha256=YrPCxSa-DSa9KwqIMlXI-KGBGnbGIW5ukOPiikUH9E4,1502
14
14
  orchestrator/api/helpers.py,sha256=s0QRHYw8AvEmlkmRhuEzz9xixaZKUF3YuPzUVHkcoXk,6933
@@ -17,13 +17,13 @@ orchestrator/api/api_v1/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n
17
17
  orchestrator/api/api_v1/api.py,sha256=m4iDktsSpzxUDaudkdgXeZ83a6B4wfc3pczQsa-Pb-8,2866
18
18
  orchestrator/api/api_v1/endpoints/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
19
19
  orchestrator/api/api_v1/endpoints/health.py,sha256=iaxs1XX1_250_gKNsspuULCV2GEMBjbtjsmfQTOvMAI,1284
20
- orchestrator/api/api_v1/endpoints/processes.py,sha256=i5GRoszvdmpZqOxSqON83DNuc0UIV-ohOqbAa0OhESE,13564
20
+ orchestrator/api/api_v1/endpoints/processes.py,sha256=3ggFkLLTqX7zwJmEmr77RbN2n-iIuNNCIpsPMeMIYFA,16149
21
21
  orchestrator/api/api_v1/endpoints/product_blocks.py,sha256=kZ6ywIOsS_S2qGq7RvZ4KzjvaS1LmwbGWR37AKRvWOw,2146
22
22
  orchestrator/api/api_v1/endpoints/products.py,sha256=BfFtwu9dZXEQbtKxYj9icc73GKGvAGMR5ytyf41nQlQ,3081
23
23
  orchestrator/api/api_v1/endpoints/resource_types.py,sha256=gGyuaDyOD0TAVoeFGaGmjDGnQ8eQQArOxKrrk4MaDzA,2145
24
24
  orchestrator/api/api_v1/endpoints/settings.py,sha256=5s-k169podZjgGHUbVDmSQwpY_3Cs_Bbf2PPtZIkBcw,6184
25
25
  orchestrator/api/api_v1/endpoints/subscription_customer_descriptions.py,sha256=1_6LtgQleoq3M6z_W-Qz__Bj3OFUweoPrUqHMwSH6AM,3288
26
- orchestrator/api/api_v1/endpoints/subscriptions.py,sha256=V-ebvjtFEKlALx8SKX42SiNPM-GAgSMWbuaimyktUQQ,8758
26
+ orchestrator/api/api_v1/endpoints/subscriptions.py,sha256=zn_LeVfmp2uw7CszK4BvQ5n37hZccy3K2htkoDgF1sI,9809
27
27
  orchestrator/api/api_v1/endpoints/translations.py,sha256=dIWh_fCnZZUxJoGiNeJ49DK_xpf75IpR_0EIMSvzIvY,963
28
28
  orchestrator/api/api_v1/endpoints/user.py,sha256=RyI32EXVu6I-IxWjz0XB5zQWzzLL60zKXLgLqLH02xU,1827
29
29
  orchestrator/api/api_v1/endpoints/workflows.py,sha256=_0vhGiQeu3-z16Zi0WmuDWBs8gmed6BzRNwYH_sF6AY,1977
@@ -77,7 +77,7 @@ orchestrator/cli/generator/templates/additional_modify_steps.j2,sha256=jwle7hIvd
77
77
  orchestrator/cli/generator/templates/additional_terminate_steps.j2,sha256=jwle7hIvd-EYbnecVFmG0n-6Jpr4DearM0era8AvGYM,25
78
78
  orchestrator/cli/generator/templates/constrained_int_definitions.j2,sha256=59FKIWOeXrO0nblLmbhaFXKb4UQesQ8zFUZ1jDCp9Vk,282
79
79
  orchestrator/cli/generator/templates/create_data_head.j2,sha256=ArP9TUsbobXF4CIpckcaIYos-dgGmPeL-n7SQATvSiE,361
80
- orchestrator/cli/generator/templates/create_product.j2,sha256=ZPzY1clJ7in_UlBJf0TS94-KYuwN71kGjJn_6eM1Bo4,4838
80
+ orchestrator/cli/generator/templates/create_product.j2,sha256=P5XUD-s8ouAfoT14xv7f5VrgpWytvClrWVnBV6Bm1YI,4785
81
81
  orchestrator/cli/generator/templates/enums.j2,sha256=pmx7_DeoE4X9u83_In18C97XqZP_YwETiw54_E33p1A,298
82
82
  orchestrator/cli/generator/templates/lazy_workflow_instance.j2,sha256=BYB6LwE19OarY7_7Ovej5rqppZWtjiDkG7TDK5dYU7Y,523
83
83
  orchestrator/cli/generator/templates/list_definitions.j2,sha256=XS-F5XXy4HOdsZ-xahprwxfhU0UaiF4VeopkIxfoado,277
@@ -106,7 +106,7 @@ orchestrator/db/database.py,sha256=MU_w_e95ho2dVb2JDnt_KFYholx___XDkiQXbc8wCkI,1
106
106
  orchestrator/db/helpers.py,sha256=L8kEdnSSNGnUpZhdeGx2arCodakWN8vSpKdfjoLuHdY,831
107
107
  orchestrator/db/listeners.py,sha256=UBPYcH0FE3a7aZQu_D0O_JMXpXIRYXC0gjSAvlv5GZo,1142
108
108
  orchestrator/db/loaders.py,sha256=ez6JzQ3IKVkC_oLAkVlIIiI8Do7hXbdcPKCvUSLxRog,7962
109
- orchestrator/db/models.py,sha256=92lkqI4u3Si2tEMSTnMb5Uv08CSjqkgotgyEYqLvFeI,27302
109
+ orchestrator/db/models.py,sha256=9XOppPkXlbILM3M87wgaItsE8BKLNdnyyfeiSfYuYQ8,27502
110
110
  orchestrator/db/filters/__init__.py,sha256=RUj6P0XxEBhYj0SN5wH5-Vf_Wt_ilZR_n9DSar5m9oM,371
111
111
  orchestrator/db/filters/filters.py,sha256=55RtpQwM2rhrk4A6CCSeSXoo-BT9GnQoNTryA8CtLEg,5020
112
112
  orchestrator/db/filters/process.py,sha256=xvGhyfo_MZ1xhLvFC6yULjcT4mJk0fKc1glJIYgsWLE,4018
@@ -159,7 +159,7 @@ orchestrator/graphql/__init__.py,sha256=avq8Yg3Jr_9pJqh7ClyIAOX7YSg1eM_AWmt5C3FR
159
159
  orchestrator/graphql/autoregistration.py,sha256=pF2jbMKG26MvYoMSa6ZpqpHjVks7_NvSRFymHTgmfjs,6342
160
160
  orchestrator/graphql/pagination.py,sha256=iqVDn3GPZpiQhEydfwkBJLURY-X8wwUphS8Lkeg0BOc,2413
161
161
  orchestrator/graphql/schema.py,sha256=gwZ3nAgKL0zlpc-aK58hSUAGPVD11Tb3aRSSK9hC39I,9204
162
- orchestrator/graphql/types.py,sha256=tF3B2n_4AmNIpNuA4Xg-kB-q9Xy7HU8opfDDPSX26nw,5045
162
+ orchestrator/graphql/types.py,sha256=CpWrDqVTQwxYkJQqidPzHEAURGirJ-6i-dlBcBwBaTI,5196
163
163
  orchestrator/graphql/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
164
164
  orchestrator/graphql/extensions/model_cache.py,sha256=1uhMRjBs9eK7zJ1Y6P6BopX06822w2Yh9jliwYvG6yQ,1085
165
165
  orchestrator/graphql/extensions/stats.py,sha256=pGhEBQg45XvqZhRobcrCSGwt5AGmR3gflsm1dYiIg5g,2018
@@ -184,15 +184,15 @@ orchestrator/graphql/schemas/customer_description.py,sha256=fize71IMpkvk_rTzcqCY
184
184
  orchestrator/graphql/schemas/errors.py,sha256=VRl-Zd1FHMnscyozhfxzqeEUZ0ERAWum_Y8YwjGxwmA,203
185
185
  orchestrator/graphql/schemas/fixed_input.py,sha256=1yqYHADQRgHz8OIP7ObYsPFS-gmzfkCvEO0a-KKf7zI,513
186
186
  orchestrator/graphql/schemas/helpers.py,sha256=Kpj4kIbmoKKN35bdgUSwQvGUIbeg7VJAVMEq65YS_ik,346
187
- orchestrator/graphql/schemas/process.py,sha256=DGsOJwn2b6sz1q2CZ1aUPiazigqFsMxCkyN0Jv5LKwM,3775
188
- orchestrator/graphql/schemas/product.py,sha256=Bj9hBYLNuH3O9r3ybU0i0PFEVlMU8F_nOFyasFhaNaw,4199
187
+ orchestrator/graphql/schemas/process.py,sha256=nvD6Rvr0hnrMINdXF_rQuLF8szKJ7E-SywCFMuZsnlg,4940
188
+ orchestrator/graphql/schemas/product.py,sha256=vUCqcjrKBJj-VKSrMYPKzjmmxLMXL7alKTJ8UdUkhTg,4342
189
189
  orchestrator/graphql/schemas/product_block.py,sha256=Qk9cbA6vm7ZPrhdgPHatKRuy6TytBmxSr97McEOxAu8,2860
190
190
  orchestrator/graphql/schemas/resource_type.py,sha256=s5d_FwQXL2-Sc-IDUxTJun5qFQ4zOP4-XcHF9ql-t1g,898
191
191
  orchestrator/graphql/schemas/settings.py,sha256=drhm5VcLmUbiYAk6WUSJcyJqjNM96E6GvpxVdPAobnA,999
192
192
  orchestrator/graphql/schemas/strawberry_pydantic_patch.py,sha256=CjNUhTKdYmLiaem-WY_mzw4HASIeaZitxGF8pPocqVw,1602
193
193
  orchestrator/graphql/schemas/subscription.py,sha256=RnnxPgha_7D4Ii87cp3eyBV93_RZIryzWyVHZwyn3eA,9603
194
194
  orchestrator/graphql/schemas/version.py,sha256=HSzVg_y4Sjd5_H5rRUtu3FJKOG_8ifhvBNt_qjOtC-E,92
195
- orchestrator/graphql/schemas/workflow.py,sha256=0UWU0HGTiAC_5Wzh16clBd74JoYHrr38YIGV86q-si0,1276
195
+ orchestrator/graphql/schemas/workflow.py,sha256=WLbegRNxOfvXg4kPYrO5KPBwtHmUofAr2pvZT2JsW1c,1761
196
196
  orchestrator/graphql/utils/__init__.py,sha256=1JvenzEVW1CBa1sGVI9I8IWnnoXIkb1hneDqph9EEZY,524
197
197
  orchestrator/graphql/utils/create_resolver_error_handler.py,sha256=PpQMVwGrE9t0nZ12TwoxPxksXxEwQM7lSNPeh7qW3vk,1233
198
198
  orchestrator/graphql/utils/get_query_loaders.py,sha256=abS_HJ7K9een78gMiGq3IhwGwxQXHvZygExe0h_t9ns,815
@@ -241,6 +241,8 @@ orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_ins
241
241
  orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_instance_as_json_function.sql,sha256=hPldk0DAesUbHv3Qd_N7U-cAk-t1wIgxt4FOA120gQ8,1776
242
242
  orchestrator/migrations/versions/schema/2025-04-09_fc5c993a4b4a_add_cascade_constraint_on_processes_.py,sha256=6kHRNSZxUze2jy7b8uRvkt5mzsax10Z-Z3lsACtPLRM,1067
243
243
  orchestrator/migrations/versions/schema/2025-05-08_161918133bec_add_is_task_to_workflow.py,sha256=VLFDHFYRWn5ktUba0KuSPWyvjYJdfN1WypWmOPqIW18,721
244
+ orchestrator/migrations/versions/schema/2025-07-01_93fc5834c7e5_changed_timestamping_fields_in_process_steps.py,sha256=Oezd8b2qaI1Kyq-sZFVFmdzd4d9NjXrf6HtJGk11fy0,1914
245
+ orchestrator/migrations/versions/schema/2025-07-04_4b58e336d1bf_deprecating_workflow_target_in_.py,sha256=xnD6w-97R4ClS7rbmXQEXc36K3fdcXKhCy7ZZNy_FX4,742
244
246
  orchestrator/schedules/__init__.py,sha256=JnnaglfK1qYUBKI6Dd9taV-tCZIPlAdAkHtnkJDMXxY,1066
245
247
  orchestrator/schedules/resume_workflows.py,sha256=kSotzTAXjX7p9fpSYiGOpuxuTQfv54eRFAe0YSG0DHc,832
246
248
  orchestrator/schedules/scheduling.py,sha256=ehtwgpbvMOk1jhn-hHgVzg_9wLJkI6l3mRY3DcO9ZVY,1526
@@ -252,7 +254,7 @@ orchestrator/schemas/base.py,sha256=Vc444LetsINLRhG2SxW9Bq01hOzChPOhQWCImQTr-As,
252
254
  orchestrator/schemas/engine_settings.py,sha256=LF8al7tJssiilb5A4emPtUYo0tVDSaT1Lvo_DN_ttrY,1296
253
255
  orchestrator/schemas/fixed_input.py,sha256=Rth3hT5K7zYuQr1bUY_NJRzb03xEZuT1p6EvYXVNE54,1214
254
256
  orchestrator/schemas/problem_detail.py,sha256=DxiUhWv6EVXLZgdKFv0EYVnCgtkDj7xteDCR0q2f5yw,802
255
- orchestrator/schemas/process.py,sha256=NgS1eBRtO2GUCRNsvbvYyjNkR2aBdH-kwcsR_y8DfNU,2354
257
+ orchestrator/schemas/process.py,sha256=UACBNt-4g4v9Y528u-gZ-Wk7YxwJHhnI4cEu5CtQm2w,2541
256
258
  orchestrator/schemas/product.py,sha256=MhMCh058ZuS2RJq-wSmxIPUNlhQexxXIx3DSz2OmOh4,1570
257
259
  orchestrator/schemas/product_block.py,sha256=kCqvm6qadHpegMr9aWI_fYX-T7mS-5S-ldPxnGQZg7M,1519
258
260
  orchestrator/schemas/resource_type.py,sha256=VDju4XywcDDLxdpbWU62RTvR9QF8x_GRrpTlN_NE8uI,1064
@@ -260,11 +262,11 @@ orchestrator/schemas/subscription.py,sha256=-jXyHZIed9Xlia18ksSDyenblNN6Q2yM2FlG
260
262
  orchestrator/schemas/subscription_descriptions.py,sha256=Ft_jw1U0bf9Z0U8O4OWfLlcl0mXCVT_qYVagBP3GbIQ,1262
261
263
  orchestrator/schemas/workflow.py,sha256=VqQ9XfV4fVd6MjY0LRRQzWBJHmlPsAamWfTwDx1cZkg,2102
262
264
  orchestrator/services/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
263
- orchestrator/services/celery.py,sha256=SmAUsN755yE7cZ3og92qTvPPeRIpdEKlbaLih7o38h8,5089
265
+ orchestrator/services/celery.py,sha256=PsIgRBJsmA3vKwAUaqPq9ynLwDsXHY2ggDWc-nQAwgM,5232
264
266
  orchestrator/services/fixed_inputs.py,sha256=kyz7s2HLzyDulvcq-ZqefTw1om86COvyvTjz0_5CmgI,876
265
267
  orchestrator/services/input_state.py,sha256=HF7wl9fWdaAW8pdCCqbuYoKyNj8dY0g8Ff8vXis8z5A,2211
266
268
  orchestrator/services/process_broadcast_thread.py,sha256=D44YbjF8mRqGuznkRUV4SoRn1J0lfy_x1H508GnSVlU,4649
267
- orchestrator/services/processes.py,sha256=rTH6zLNsun3qDCPguz2LYS87MQR_LJREIPrgkGS6kwk,30494
269
+ orchestrator/services/processes.py,sha256=W-MCuGxRXLNIx3zn_jQQWXXFIBUrjJgXyBMsx2E0FbQ,30490
268
270
  orchestrator/services/products.py,sha256=BP4KyE8zO-8z7Trrs5T6zKBOw53S9BfBJnHWI3p6u5Y,1943
269
271
  orchestrator/services/resource_types.py,sha256=_QBy_JOW_X3aSTqH0CuLrq4zBJL0p7Q-UDJUcuK2_qc,884
270
272
  orchestrator/services/settings.py,sha256=HEWfFulgoEDwgfxGEO__QTr5fDiwNBEj1UhAeTAdbLQ,3159
@@ -275,11 +277,12 @@ orchestrator/services/tasks.py,sha256=NjPkuauQoh9UJDcjA7OcKFgPk0i6NoKdDO7HlpGbBJ
275
277
  orchestrator/services/translations.py,sha256=GyP8soUFGej8AS8uulBsk10CCK6Kwfjv9AHMFm3ElQY,1713
276
278
  orchestrator/services/workflows.py,sha256=iEkt2OBuTwkDru4V6ZSKatnw0b96ZdPV-VQqeZ9EOgU,4015
277
279
  orchestrator/utils/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
280
+ orchestrator/utils/auth.py,sha256=IWn0amdquLobt1mRNwhgKT0ErCBjLGDtLdsDuaY8rlE,309
278
281
  orchestrator/utils/crypt.py,sha256=18eNamYWMllPkxyRtWIde3FDr3rSF74R5SAL6WsCj9Y,5584
279
282
  orchestrator/utils/datetime.py,sha256=a1WQ_yvu7MA0TiaRpC5avwbOSFdrj4eMrV4a7I2sD5Q,1477
280
283
  orchestrator/utils/deprecation_logger.py,sha256=oqju7ecJcB_r7cMnldaOAA79QUZYS_h69IkDrFV9nAg,875
281
284
  orchestrator/utils/docs.py,sha256=GbyD61oKn1yVYaphUKHCBvrWEWJDTQfRc_VEbVb-zgU,6172
282
- orchestrator/utils/enrich_process.py,sha256=o_QSy5Q4wn1SMHhzVOw6bp7uhDXr7GhAIWRDDMWUVO4,4699
285
+ orchestrator/utils/enrich_process.py,sha256=sIb9jVM6MzttK1uJsRbUNMN8Aevo3erSAX0Agjbo5EA,4732
283
286
  orchestrator/utils/errors.py,sha256=6FxvXrITmRjP5bYnJJ3CxjAwA5meNjRAVYouz4TWKkU,4653
284
287
  orchestrator/utils/expose_settings.py,sha256=0NOjLBifQy4k2zUYJ31QjGQCaXEQ1zB4UtCle7XglAM,1640
285
288
  orchestrator/utils/fixed_inputs.py,sha256=pnL6I_19VMp_Bny8SYjSzVFNvTFDyeCxFFOWGhTnDiQ,2665
@@ -299,17 +302,17 @@ orchestrator/websocket/websocket_manager.py,sha256=hwlG9FDXcNU42jDNNsPMQLIyrvEpG
299
302
  orchestrator/websocket/managers/broadcast_websocket_manager.py,sha256=fwoSgTjkHJ2GmsLTU9dqQpAA9i8b1McPu7gLNzxtfG4,5401
300
303
  orchestrator/websocket/managers/memory_websocket_manager.py,sha256=lF5EEx1iFMCGEkTbItTDr88NENMSaSeG1QrJ7teoPkY,3324
301
304
  orchestrator/workflows/__init__.py,sha256=NzIGGI-8SNAwCk2YqH6sHhEWbgAY457ntDwjO15N8v4,4131
302
- orchestrator/workflows/modify_note.py,sha256=l6QtijRPv8gnHxzwTz_4nWIPcZ0FcKQh_yFbtjYEDMg,2163
305
+ orchestrator/workflows/modify_note.py,sha256=eXt5KQvrkOXf-3YEXCn2XbBLP9N-n1pUYRW2t8Odupo,2150
303
306
  orchestrator/workflows/removed_workflow.py,sha256=V0Da5TEdfLdZZKD38ig-MTp3_IuE7VGqzHHzvPYQmLI,909
304
- orchestrator/workflows/steps.py,sha256=ulpheoHaCOE1qh71Bja4KW4pItQh1Z6q4QU4tn5GtNk,6067
305
- orchestrator/workflows/utils.py,sha256=yBwfITlseimyLEzbwI0ehOAlr-xI1N3WGVudFz4boXk,13778
307
+ orchestrator/workflows/steps.py,sha256=CZxfzkG5ANJYwuYTkQ4da2RpQqIjXCtey_Uy1ezRAZ4,6479
308
+ orchestrator/workflows/utils.py,sha256=bhX9vm3oc9k6RSaESl34v4Nrh40G4Ys91INoTjZ0XVM,13966
306
309
  orchestrator/workflows/tasks/__init__.py,sha256=GyHNfEFCGKQwRiN6rQmvSRH2iYX7npjMZn97n8XzmLU,571
307
310
  orchestrator/workflows/tasks/cleanup_tasks_log.py,sha256=BfWYbPXhnLAHUJ0mlODDnjZnQQAvKCZJDVTwbwOWI04,1624
308
311
  orchestrator/workflows/tasks/resume_workflows.py,sha256=MzJqlSXUvKStkT7NGzxZyRlfAer_ezYm-kjUqaZi0yc,2359
309
312
  orchestrator/workflows/tasks/validate_product_type.py,sha256=paG-NAY1bdde3Adt8zItkcBKf5Pxw6f5ngGW6an6dYU,3192
310
313
  orchestrator/workflows/tasks/validate_products.py,sha256=GZJBoFF-WMphS7ghMs2-gqvV2iL1F0POhk0uSNt93n0,8510
311
314
  orchestrator/workflows/translations/en-GB.json,sha256=ST53HxkphFLTMjFHonykDBOZ7-P_KxksktZU3GbxLt0,846
312
- orchestrator_core-4.1.0rc1.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
313
- orchestrator_core-4.1.0rc1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
314
- orchestrator_core-4.1.0rc1.dist-info/METADATA,sha256=hyIGgttPRSo2gjx2V1kbbpd5MvEbnCttnUJ2LzZEyP4,5073
315
- orchestrator_core-4.1.0rc1.dist-info/RECORD,,
315
+ orchestrator_core-4.2.0rc1.dist-info/licenses/LICENSE,sha256=b-aA5OZQuuBATmLKo_mln8CQrDPPhg3ghLzjPjLn4Tg,11409
316
+ orchestrator_core-4.2.0rc1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
317
+ orchestrator_core-4.2.0rc1.dist-info/METADATA,sha256=Kkb7hvUNxHfux_npyFWEVr7FVci_N84-9PRvo-ogOqk,5963
318
+ orchestrator_core-4.2.0rc1.dist-info/RECORD,,