cognite-neat 0.87.6__py3-none-any.whl → 0.88.1__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.

Potentially problematic release.


This version of cognite-neat might be problematic. Click here for more details.

Files changed (171) hide show
  1. cognite/neat/_version.py +1 -1
  2. cognite/neat/app/api/data_classes/rest.py +0 -19
  3. cognite/neat/app/api/explorer.py +6 -4
  4. cognite/neat/app/api/routers/configuration.py +1 -1
  5. cognite/neat/app/api/routers/crud.py +11 -21
  6. cognite/neat/app/api/routers/workflows.py +24 -94
  7. cognite/neat/app/ui/neat-app/build/asset-manifest.json +7 -7
  8. cognite/neat/app/ui/neat-app/build/index.html +1 -1
  9. cognite/neat/app/ui/neat-app/build/static/css/{main.38a62222.css → main.72e3d92e.css} +2 -2
  10. cognite/neat/app/ui/neat-app/build/static/css/main.72e3d92e.css.map +1 -0
  11. cognite/neat/app/ui/neat-app/build/static/js/main.5a52cf09.js +3 -0
  12. cognite/neat/app/ui/neat-app/build/static/js/{main.ec7f72e2.js.LICENSE.txt → main.5a52cf09.js.LICENSE.txt} +0 -9
  13. cognite/neat/app/ui/neat-app/build/static/js/main.5a52cf09.js.map +1 -0
  14. cognite/neat/config.py +44 -27
  15. cognite/neat/exceptions.py +6 -0
  16. cognite/neat/graph/extractors/_classic_cdf/_assets.py +21 -73
  17. cognite/neat/graph/extractors/_classic_cdf/_base.py +102 -0
  18. cognite/neat/graph/extractors/_classic_cdf/_events.py +46 -42
  19. cognite/neat/graph/extractors/_classic_cdf/_files.py +41 -45
  20. cognite/neat/graph/extractors/_classic_cdf/_labels.py +75 -52
  21. cognite/neat/graph/extractors/_classic_cdf/_relationships.py +49 -27
  22. cognite/neat/graph/extractors/_classic_cdf/_sequences.py +47 -50
  23. cognite/neat/graph/extractors/_classic_cdf/_timeseries.py +47 -49
  24. cognite/neat/graph/queries/_base.py +22 -29
  25. cognite/neat/graph/queries/_shared.py +1 -1
  26. cognite/neat/graph/stores/_base.py +24 -11
  27. cognite/neat/graph/transformers/_rdfpath.py +3 -2
  28. cognite/neat/issues.py +8 -0
  29. cognite/neat/rules/exporters/_rules2ontology.py +28 -20
  30. cognite/neat/rules/exporters/_validation.py +15 -21
  31. cognite/neat/rules/importers/_inference2rules.py +31 -35
  32. cognite/neat/rules/importers/_owl2rules/_owl2metadata.py +3 -7
  33. cognite/neat/rules/importers/_spreadsheet2rules.py +30 -27
  34. cognite/neat/rules/issues/dms.py +20 -0
  35. cognite/neat/rules/issues/importing.py +15 -0
  36. cognite/neat/rules/issues/ontology.py +298 -0
  37. cognite/neat/rules/issues/spreadsheet.py +48 -0
  38. cognite/neat/rules/issues/tables.py +72 -0
  39. cognite/neat/rules/models/_rdfpath.py +4 -4
  40. cognite/neat/rules/models/_types/_field.py +9 -19
  41. cognite/neat/rules/models/information/_rules.py +5 -4
  42. cognite/neat/utils/rdf_.py +17 -9
  43. cognite/neat/utils/regex_patterns.py +52 -0
  44. cognite/neat/workflows/steps/data_contracts.py +17 -43
  45. cognite/neat/workflows/steps/lib/current/graph_extractor.py +28 -24
  46. cognite/neat/workflows/steps/lib/current/graph_loader.py +4 -21
  47. cognite/neat/workflows/steps/lib/current/graph_store.py +18 -134
  48. cognite/neat/workflows/steps_registry.py +5 -7
  49. {cognite_neat-0.87.6.dist-info → cognite_neat-0.88.1.dist-info}/METADATA +2 -6
  50. cognite_neat-0.88.1.dist-info/RECORD +209 -0
  51. cognite/neat/app/api/routers/core.py +0 -91
  52. cognite/neat/app/api/routers/data_exploration.py +0 -336
  53. cognite/neat/app/api/routers/rules.py +0 -203
  54. cognite/neat/app/ui/neat-app/build/static/css/main.38a62222.css.map +0 -1
  55. cognite/neat/app/ui/neat-app/build/static/js/main.ec7f72e2.js +0 -3
  56. cognite/neat/app/ui/neat-app/build/static/js/main.ec7f72e2.js.map +0 -1
  57. cognite/neat/graph/stores/_oxrdflib.py +0 -247
  58. cognite/neat/legacy/__init__.py +0 -0
  59. cognite/neat/legacy/graph/__init__.py +0 -3
  60. cognite/neat/legacy/graph/examples/Knowledge-Graph-Nordic44-dirty.xml +0 -20182
  61. cognite/neat/legacy/graph/examples/Knowledge-Graph-Nordic44.xml +0 -20163
  62. cognite/neat/legacy/graph/examples/__init__.py +0 -10
  63. cognite/neat/legacy/graph/examples/skos-capturing-sheet-wind-topics.xlsx +0 -0
  64. cognite/neat/legacy/graph/exceptions.py +0 -90
  65. cognite/neat/legacy/graph/extractors/__init__.py +0 -6
  66. cognite/neat/legacy/graph/extractors/_base.py +0 -14
  67. cognite/neat/legacy/graph/extractors/_dexpi.py +0 -44
  68. cognite/neat/legacy/graph/extractors/_graph_capturing_sheet.py +0 -403
  69. cognite/neat/legacy/graph/extractors/_mock_graph_generator.py +0 -361
  70. cognite/neat/legacy/graph/loaders/__init__.py +0 -23
  71. cognite/neat/legacy/graph/loaders/_asset_loader.py +0 -511
  72. cognite/neat/legacy/graph/loaders/_base.py +0 -67
  73. cognite/neat/legacy/graph/loaders/_exceptions.py +0 -85
  74. cognite/neat/legacy/graph/loaders/core/__init__.py +0 -0
  75. cognite/neat/legacy/graph/loaders/core/labels.py +0 -58
  76. cognite/neat/legacy/graph/loaders/core/models.py +0 -136
  77. cognite/neat/legacy/graph/loaders/core/rdf_to_assets.py +0 -1046
  78. cognite/neat/legacy/graph/loaders/core/rdf_to_relationships.py +0 -559
  79. cognite/neat/legacy/graph/loaders/rdf_to_dms.py +0 -309
  80. cognite/neat/legacy/graph/loaders/validator.py +0 -87
  81. cognite/neat/legacy/graph/models.py +0 -6
  82. cognite/neat/legacy/graph/stores/__init__.py +0 -13
  83. cognite/neat/legacy/graph/stores/_base.py +0 -400
  84. cognite/neat/legacy/graph/stores/_graphdb_store.py +0 -52
  85. cognite/neat/legacy/graph/stores/_memory_store.py +0 -43
  86. cognite/neat/legacy/graph/stores/_oxigraph_store.py +0 -151
  87. cognite/neat/legacy/graph/stores/_oxrdflib.py +0 -247
  88. cognite/neat/legacy/graph/stores/_rdf_to_graph.py +0 -42
  89. cognite/neat/legacy/graph/transformations/__init__.py +0 -0
  90. cognite/neat/legacy/graph/transformations/entity_matcher.py +0 -101
  91. cognite/neat/legacy/graph/transformations/query_generator/__init__.py +0 -3
  92. cognite/neat/legacy/graph/transformations/query_generator/sparql.py +0 -575
  93. cognite/neat/legacy/graph/transformations/transformer.py +0 -322
  94. cognite/neat/legacy/rules/__init__.py +0 -0
  95. cognite/neat/legacy/rules/analysis.py +0 -231
  96. cognite/neat/legacy/rules/examples/Rules-Nordic44-to-graphql.xlsx +0 -0
  97. cognite/neat/legacy/rules/examples/Rules-Nordic44.xlsx +0 -0
  98. cognite/neat/legacy/rules/examples/__init__.py +0 -18
  99. cognite/neat/legacy/rules/examples/power-grid-containers.yaml +0 -124
  100. cognite/neat/legacy/rules/examples/power-grid-example.xlsx +0 -0
  101. cognite/neat/legacy/rules/examples/power-grid-model.yaml +0 -224
  102. cognite/neat/legacy/rules/examples/rules-template.xlsx +0 -0
  103. cognite/neat/legacy/rules/examples/sheet2cdf-transformation-rules.xlsx +0 -0
  104. cognite/neat/legacy/rules/examples/skos-rules.xlsx +0 -0
  105. cognite/neat/legacy/rules/examples/source-to-solution-mapping-rules.xlsx +0 -0
  106. cognite/neat/legacy/rules/examples/wind-energy.owl +0 -1511
  107. cognite/neat/legacy/rules/exceptions.py +0 -2972
  108. cognite/neat/legacy/rules/exporters/__init__.py +0 -20
  109. cognite/neat/legacy/rules/exporters/_base.py +0 -45
  110. cognite/neat/legacy/rules/exporters/_core/__init__.py +0 -5
  111. cognite/neat/legacy/rules/exporters/_core/rules2labels.py +0 -24
  112. cognite/neat/legacy/rules/exporters/_rules2dms.py +0 -885
  113. cognite/neat/legacy/rules/exporters/_rules2excel.py +0 -213
  114. cognite/neat/legacy/rules/exporters/_rules2graphql.py +0 -183
  115. cognite/neat/legacy/rules/exporters/_rules2ontology.py +0 -524
  116. cognite/neat/legacy/rules/exporters/_rules2pydantic_models.py +0 -748
  117. cognite/neat/legacy/rules/exporters/_rules2rules.py +0 -105
  118. cognite/neat/legacy/rules/exporters/_rules2triples.py +0 -38
  119. cognite/neat/legacy/rules/exporters/_validation.py +0 -146
  120. cognite/neat/legacy/rules/importers/__init__.py +0 -22
  121. cognite/neat/legacy/rules/importers/_base.py +0 -66
  122. cognite/neat/legacy/rules/importers/_dict2rules.py +0 -158
  123. cognite/neat/legacy/rules/importers/_dms2rules.py +0 -194
  124. cognite/neat/legacy/rules/importers/_graph2rules.py +0 -308
  125. cognite/neat/legacy/rules/importers/_json2rules.py +0 -39
  126. cognite/neat/legacy/rules/importers/_owl2rules/__init__.py +0 -3
  127. cognite/neat/legacy/rules/importers/_owl2rules/_owl2classes.py +0 -239
  128. cognite/neat/legacy/rules/importers/_owl2rules/_owl2metadata.py +0 -260
  129. cognite/neat/legacy/rules/importers/_owl2rules/_owl2properties.py +0 -217
  130. cognite/neat/legacy/rules/importers/_owl2rules/_owl2rules.py +0 -290
  131. cognite/neat/legacy/rules/importers/_spreadsheet2rules.py +0 -45
  132. cognite/neat/legacy/rules/importers/_xsd2rules.py +0 -20
  133. cognite/neat/legacy/rules/importers/_yaml2rules.py +0 -39
  134. cognite/neat/legacy/rules/models/__init__.py +0 -5
  135. cognite/neat/legacy/rules/models/_base.py +0 -151
  136. cognite/neat/legacy/rules/models/raw_rules.py +0 -316
  137. cognite/neat/legacy/rules/models/rdfpath.py +0 -237
  138. cognite/neat/legacy/rules/models/rules.py +0 -1289
  139. cognite/neat/legacy/rules/models/tables.py +0 -9
  140. cognite/neat/legacy/rules/models/value_types.py +0 -118
  141. cognite/neat/legacy/workflows/examples/Export_DMS/workflow.yaml +0 -89
  142. cognite/neat/legacy/workflows/examples/Export_Rules_to_Ontology/workflow.yaml +0 -152
  143. cognite/neat/legacy/workflows/examples/Extract_DEXPI_Graph_and_Export_Rules/workflow.yaml +0 -139
  144. cognite/neat/legacy/workflows/examples/Extract_RDF_Graph_and_Generate_Assets/workflow.yaml +0 -270
  145. cognite/neat/legacy/workflows/examples/Import_DMS/workflow.yaml +0 -65
  146. cognite/neat/legacy/workflows/examples/Ontology_to_Data_Model/workflow.yaml +0 -116
  147. cognite/neat/legacy/workflows/examples/Validate_Rules/workflow.yaml +0 -67
  148. cognite/neat/legacy/workflows/examples/Validate_Solution_Model/workflow.yaml +0 -64
  149. cognite/neat/legacy/workflows/examples/Visualize_Data_Model_Using_Mock_Graph/workflow.yaml +0 -95
  150. cognite/neat/legacy/workflows/examples/Visualize_Semantic_Data_Model/workflow.yaml +0 -111
  151. cognite/neat/rules/exceptions.py +0 -2972
  152. cognite/neat/rules/models/_types/_base.py +0 -16
  153. cognite/neat/workflows/examples/Export_Rules_to_Ontology/workflow.yaml +0 -152
  154. cognite/neat/workflows/examples/Extract_DEXPI_Graph_and_Export_Rules/workflow.yaml +0 -139
  155. cognite/neat/workflows/examples/Extract_RDF_Graph_and_Generate_Assets/workflow.yaml +0 -270
  156. cognite/neat/workflows/examples/Ontology_to_Data_Model/workflow.yaml +0 -116
  157. cognite/neat/workflows/migration/__init__.py +0 -0
  158. cognite/neat/workflows/migration/steps.py +0 -91
  159. cognite/neat/workflows/migration/wf_manifests.py +0 -33
  160. cognite/neat/workflows/steps/lib/legacy/__init__.py +0 -7
  161. cognite/neat/workflows/steps/lib/legacy/graph_contextualization.py +0 -82
  162. cognite/neat/workflows/steps/lib/legacy/graph_extractor.py +0 -746
  163. cognite/neat/workflows/steps/lib/legacy/graph_loader.py +0 -606
  164. cognite/neat/workflows/steps/lib/legacy/graph_store.py +0 -307
  165. cognite/neat/workflows/steps/lib/legacy/graph_transformer.py +0 -58
  166. cognite/neat/workflows/steps/lib/legacy/rules_exporter.py +0 -511
  167. cognite/neat/workflows/steps/lib/legacy/rules_importer.py +0 -612
  168. cognite_neat-0.87.6.dist-info/RECORD +0 -319
  169. {cognite_neat-0.87.6.dist-info → cognite_neat-0.88.1.dist-info}/LICENSE +0 -0
  170. {cognite_neat-0.87.6.dist-info → cognite_neat-0.88.1.dist-info}/WHEEL +0 -0
  171. {cognite_neat-0.87.6.dist-info → cognite_neat-0.88.1.dist-info}/entry_points.txt +0 -0
cognite/neat/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.87.6"
1
+ __version__ = "0.88.1"
@@ -16,25 +16,6 @@ class RuleRequest(BaseModel):
16
16
  rule: str
17
17
 
18
18
 
19
- class UploadToCdfRequest(BaseModel):
20
- file_name: str = ""
21
- file_type: str = "workflow"
22
- comments: str = ""
23
- author: str = ""
24
- tag: str = ""
25
-
26
-
27
- class DownloadFromCdfRequest(BaseModel):
28
- file_name: str = ""
29
- file_type: str = "workflow"
30
- version: str = ""
31
-
32
-
33
- class LoadGraphRequest(BaseModel):
34
- graph_source_template_name: str
35
- source_location: str
36
-
37
-
38
19
  class RunWorkflowRequest(BaseModel):
39
20
  name: str
40
21
  config: dict
@@ -10,7 +10,12 @@ from cognite import neat
10
10
  from cognite.neat.app.api.asgi.metrics import prometheus_app
11
11
  from cognite.neat.app.api.configuration import NEAT_APP, UI_PATH
12
12
  from cognite.neat.app.api.context_manager import lifespan
13
- from cognite.neat.app.api.routers import configuration, core, crud, data_exploration, metrics, rules, workflows
13
+ from cognite.neat.app.api.routers import (
14
+ configuration,
15
+ crud,
16
+ metrics,
17
+ workflows,
18
+ )
14
19
  from cognite.neat.app.api.utils.logging import EndpointFilter
15
20
 
16
21
  app = FastAPI(title="Neat", lifespan=lifespan)
@@ -45,10 +50,7 @@ app.mount("/data", StaticFiles(directory=NEAT_APP.config.data_store_path), name=
45
50
  app.include_router(configuration.router)
46
51
  app.include_router(metrics.router)
47
52
  app.include_router(workflows.router)
48
- app.include_router(rules.router)
49
53
  app.include_router(crud.router)
50
- app.include_router(data_exploration.router)
51
- app.include_router(core.router)
52
54
 
53
55
 
54
56
  # General routes
@@ -12,7 +12,7 @@ router = APIRouter()
12
12
 
13
13
  @router.get("/api/configs/global")
14
14
  def get_configs():
15
- return NEAT_APP.config.dict()
15
+ return NEAT_APP.config.as_legacy_config()
16
16
 
17
17
 
18
18
  @router.post("/api/configs/global")
@@ -14,28 +14,13 @@ from cognite.neat.workflows.utils import get_file_hash
14
14
  router = APIRouter()
15
15
 
16
16
 
17
- @router.get("/api/cdf/neat-resources")
18
- def get_neat_resources(resource_type: str | None = None):
19
- if NEAT_APP.cdf_store is None:
20
- return {"error": "NeatApp is not initialized"}
21
- if resource_type is None:
22
- return {"error": "Resource type is not specified"}
23
- result = NEAT_APP.cdf_store.get_list_of_resources_from_cdf(resource_type=resource_type)
24
- logging.debug(f"Got {len(result)} resources")
25
- return {"result": result}
26
-
27
-
28
- @router.post("/api/cdf/init-neat-resources")
29
- def init_neat_cdf_resources(resource_type: str | None = None):
30
- if NEAT_APP.cdf_store is None:
31
- return {"error": "NeatApp is not initialized"}
32
- NEAT_APP.cdf_store.init_cdf_resources(resource_type=resource_type)
33
- return {"result": "ok"}
34
-
35
-
36
17
  @router.post("/api/file/upload/{workflow_name}/{file_type}/{step_id}/{action}")
37
18
  async def file_upload_handler(
38
- files: list[UploadFile], workflow_name: str, file_type: str, step_id: str, action: str
19
+ files: list[UploadFile],
20
+ workflow_name: str,
21
+ file_type: str,
22
+ step_id: str,
23
+ action: str,
39
24
  ) -> dict[str, str]:
40
25
  if NEAT_APP.cdf_store is None or NEAT_APP.workflow_manager is None:
41
26
  return {"error": "NeatApp is not initialized"}
@@ -91,7 +76,12 @@ async def file_upload_handler(
91
76
  if workflow is None:
92
77
  return {"error": f"Workflow {workflow_name} not found"}
93
78
  flow_msg = FlowMessage(
94
- payload={"file_name": file_name, "hash": file_version, "full_path": full_path, "file_type": file_type}
79
+ payload={
80
+ "file_name": file_name,
81
+ "hash": file_version,
82
+ "full_path": full_path,
83
+ "file_type": file_type,
84
+ }
95
85
  )
96
86
  start_step_id = None if step_id == "none" else step_id
97
87
 
@@ -1,20 +1,19 @@
1
1
  import logging
2
2
  import shutil
3
- from pathlib import Path
4
3
  from typing import cast
5
4
 
6
5
  from fastapi import APIRouter, Depends, HTTPException, Request, UploadFile
7
6
  from fastapi.responses import FileResponse, JSONResponse
8
7
 
9
8
  from cognite.neat.app.api.configuration import NEAT_APP
10
- from cognite.neat.app.api.data_classes.rest import DownloadFromCdfRequest, RunWorkflowRequest, UploadToCdfRequest
9
+ from cognite.neat.app.api.data_classes.rest import (
10
+ RunWorkflowRequest,
11
+ )
11
12
  from cognite.neat.workflows import WorkflowFullStateReport
12
13
  from cognite.neat.workflows.base import WorkflowDefinition
13
- from cognite.neat.workflows.migration.wf_manifests import migrate_wf_manifest
14
14
  from cognite.neat.workflows.model import FlowMessage
15
- from cognite.neat.workflows.steps.data_contracts import SolutionGraph, SourceGraph
15
+ from cognite.neat.workflows.steps.data_contracts import NeatGraph
16
16
  from cognite.neat.workflows.steps.step_model import DataContract
17
- from cognite.neat.workflows.utils import get_file_hash
18
17
 
19
18
  router = APIRouter()
20
19
 
@@ -27,7 +26,11 @@ def start_workflow(request: RunWorkflowRequest):
27
26
  start_status = NEAT_APP.workflow_manager.start_workflow_instance(
28
27
  request.name, sync=request.sync, flow_msg=FlowMessage()
29
28
  )
30
- result = {"workflow_instance": None, "is_success": start_status.is_success, "status_text": start_status.status_text}
29
+ result = {
30
+ "workflow_instance": None,
31
+ "is_success": start_status.is_success,
32
+ "status_text": start_status.status_text,
33
+ }
31
34
  return {"result": result}
32
35
 
33
36
 
@@ -58,25 +61,6 @@ def get_workflow_files(workflow_name: str):
58
61
  return {"files": workflow.get_list_of_workflow_artifacts()}
59
62
 
60
63
 
61
- @router.post("/api/workflow/package/{workflow_name}")
62
- def package_workflow(workflow_name: str):
63
- if NEAT_APP.cdf_store is None:
64
- return {"error": "NeatApp is not initialized"}
65
- package_file = NEAT_APP.cdf_store.package_workflow(workflow_name)
66
- hash_ = get_file_hash(NEAT_APP.config.workflows_store_path / package_file)
67
- return {"package": package_file, "hash": hash_}
68
-
69
-
70
- @router.post("/api/workflow/context-cleanup/{workflow_name}")
71
- def cleanup_workflow_data(workflow_name: str):
72
- if NEAT_APP.cdf_store is None:
73
- return {"error": "NeatApp is not initialized"}
74
- workflow = NEAT_APP.workflow_manager.get_workflow(workflow_name)
75
- if workflow is not None:
76
- workflow.cleanup_workflow_context()
77
- return {"result": "ok"}
78
-
79
-
80
64
  @router.post("/api/workflow/create")
81
65
  def create_new_workflow(request: WorkflowDefinition):
82
66
  if NEAT_APP.workflow_manager is None:
@@ -95,30 +79,24 @@ def delete_workflow(workflow_name: str):
95
79
  return {"result": "ok"}
96
80
 
97
81
 
98
- @router.get("/api/workflow/executions")
99
- def get_list_of_workflow_executions():
100
- return {"executions": NEAT_APP.cdf_store.get_list_of_workflow_executions_from_cdf()}
101
-
102
-
103
- @router.get("/api/workflow/detailed-execution-report/{execution_id}")
104
- def get_detailed_execution(execution_id: str):
105
- if NEAT_APP.cdf_store is None:
106
- return {"error": "NeatApp is not initialized"}
107
- return {"report": NEAT_APP.cdf_store.get_detailed_workflow_execution_report_from_cdf(execution_id)}
108
-
109
-
110
82
  @router.post("/api/workflow/reload-workflows")
111
83
  def reload_workflows():
112
84
  NEAT_APP.workflow_manager.load_workflows_from_storage()
113
85
  NEAT_APP.triggers_manager.reload_all_triggers()
114
- return {"result": "ok", "workflows": NEAT_APP.workflow_manager.get_list_of_workflows()}
86
+ return {
87
+ "result": "ok",
88
+ "workflows": NEAT_APP.workflow_manager.get_list_of_workflows(),
89
+ }
115
90
 
116
91
 
117
92
  @router.post("/api/workflow/reload-single-workflow/{workflow_name}")
118
93
  def reload_single_workflows(workflow_name: str):
119
94
  NEAT_APP.workflow_manager.load_single_workflow_from_storage(workflow_name)
120
95
  NEAT_APP.triggers_manager.reload_all_triggers()
121
- return {"result": "ok", "workflows": NEAT_APP.workflow_manager.get_list_of_workflows()}
96
+ return {
97
+ "result": "ok",
98
+ "workflows": NEAT_APP.workflow_manager.get_list_of_workflows(),
99
+ }
122
100
 
123
101
 
124
102
  @router.get("/api/workflow/workflow-definition/{workflow_name}")
@@ -152,58 +130,6 @@ def update_workflow_definition(workflow_name: str, request: WorkflowDefinition):
152
130
  return {"result": "ok"}
153
131
 
154
132
 
155
- @router.post("/api/workflow/upload-wf-to-cdf/{workflow_name}")
156
- def upload_workflow_to_cdf(workflow_name: str, request: UploadToCdfRequest):
157
- if NEAT_APP.cdf_store is None:
158
- return {"error": "NeatApp is not initialized"}
159
- NEAT_APP.cdf_store.save_workflow_to_cdf(
160
- workflow_name, changed_by=request.author, comments=request.comments, tag=request.tag
161
- )
162
- return {"result": "ok"}
163
-
164
-
165
- @router.post("/api/workflow/upload-rules-cdf/{workflow_name}")
166
- def upload_rules_to_cdf(workflow_name: str, request: UploadToCdfRequest):
167
- if NEAT_APP.cdf_store is None:
168
- return {"error": "NeatApp is not initialized"}
169
- file_path = Path(NEAT_APP.config.rules_store_path, request.file_name)
170
- NEAT_APP.cdf_store.save_resource_to_cdf(
171
- workflow_name, "neat-wf-rules", file_path, changed_by=request.author, comments=request.comments
172
- )
173
- return {"result": "ok"}
174
-
175
-
176
- @router.post("/api/workflow/download-wf-from-cdf")
177
- def download_wf_from_cdf(request: DownloadFromCdfRequest):
178
- if NEAT_APP.cdf_store is None:
179
- return {"error": "NeatApp is not initialized"}
180
- NEAT_APP.cdf_store.load_workflows_from_cdf(request.file_name, request.version)
181
- return {"result": "ok"}
182
-
183
-
184
- @router.post("/api/workflow/download-rules-from-cdf")
185
- def download_rules_to_cdf(request: DownloadFromCdfRequest):
186
- if NEAT_APP.cdf_store is None:
187
- return {"error": "NeatApp is not initialized"}
188
- NEAT_APP.cdf_store.load_rules_file_from_cdf(request.file_name, request.version)
189
- return {"file_name": request.file_name, "hash": request.version}
190
-
191
-
192
- @router.post("/api/workflow/migrate-workflow")
193
- def migrate_workflow():
194
- return migrate_wf_manifest(NEAT_APP.config.data_store_path)
195
-
196
-
197
- @router.get("/api/workflow/pre-cdf-assets/{workflow_name}")
198
- def get_pre_cdf_assets(workflow_name: str):
199
- if NEAT_APP.workflow_manager is None:
200
- return {"error": "Workflow Manager is not initialized"}
201
- workflow = NEAT_APP.workflow_manager.get_workflow(workflow_name)
202
- if workflow is None:
203
- return {"assets": []}
204
- return {"assets": workflow.data["CategorizedAssets"]}
205
-
206
-
207
133
  @router.get("/api/workflow/context/{workflow_name}")
208
134
  def get_context(workflow_name: str):
209
135
  if NEAT_APP.workflow_manager is None:
@@ -228,8 +154,8 @@ def get_context_object(workflow_name: str, object_name: str):
228
154
  if object_name not in context:
229
155
  return {"error": f"Item {object_name} is not found in workflow context"}
230
156
 
231
- if object_name == "SourceGraph" or object_name == "SolutionGraph":
232
- return {"object": cast(SourceGraph | SolutionGraph, context[object_name]).graph.diagnostic_report()}
157
+ if object_name == "NeatGraph":
158
+ return {"object": cast(NeatGraph, context[object_name]).graph.type_}
233
159
 
234
160
  cobject = context[object_name]
235
161
  if isinstance(cobject, DataContract):
@@ -285,7 +211,11 @@ def http_trigger_start_workflow(workflow_name: str, step_id: str, request: Reque
285
211
 
286
212
  @router.post("/api/workflow/{workflow_name}/resume/{step_id}/{instance_id}")
287
213
  def http_trigger_resume_workflow(
288
- workflow_name: str, step_id: str, instance_id: str, request: Request, body: bytes = fast_api_depends
214
+ workflow_name: str,
215
+ step_id: str,
216
+ instance_id: str,
217
+ request: Request,
218
+ body: bytes = fast_api_depends,
289
219
  ):
290
220
  if NEAT_APP.triggers_manager is None:
291
221
  return JSONResponse(content={"error": "Triggers Manager is not initialized"}, status_code=400)
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "files": {
3
- "main.css": "./static/css/main.38a62222.css",
4
- "main.js": "./static/js/main.ec7f72e2.js",
3
+ "main.css": "./static/css/main.72e3d92e.css",
4
+ "main.js": "./static/js/main.5a52cf09.js",
5
5
  "static/media/logo.svg": "./static/media/logo.8093b84df9ed36a174c629d6fe0b730d.svg",
6
6
  "index.html": "./index.html",
7
- "main.38a62222.css.map": "./static/css/main.38a62222.css.map",
8
- "main.ec7f72e2.js.map": "./static/js/main.ec7f72e2.js.map"
7
+ "main.72e3d92e.css.map": "./static/css/main.72e3d92e.css.map",
8
+ "main.5a52cf09.js.map": "./static/js/main.5a52cf09.js.map"
9
9
  },
10
10
  "entrypoints": [
11
- "static/css/main.38a62222.css",
12
- "static/js/main.ec7f72e2.js"
11
+ "static/css/main.72e3d92e.css",
12
+ "static/js/main.5a52cf09.js"
13
13
  ]
14
- }
14
+ }
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="./logo192.png"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="NEAT controll panel"/><link rel="apple-touch-icon" href="./logo192.png"/><link rel="manifest" href="./manifest.json"/><title>NEAT App</title><script defer="defer" src="./static/js/main.ec7f72e2.js"></script><link href="./static/css/main.38a62222.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="./logo192.png"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="NEAT controll panel"/><link rel="apple-touch-icon" href="./logo192.png"/><link rel="manifest" href="./manifest.json"/><title>NEAT App</title><script defer="defer" src="./static/js/main.5a52cf09.js"></script><link href="./static/css/main.72e3d92e.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
@@ -1,2 +1,2 @@
1
- body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.react-flow__container{height:100%;left:0;position:absolute;top:0;width:100%}.react-flow__pane{cursor:grab;z-index:1}.react-flow__pane.dragging{cursor:grabbing}.react-flow__viewport{pointer-events:none;-webkit-transform-origin:0 0;transform-origin:0 0;z-index:2}.react-flow__renderer{z-index:4}.react-flow__selectionpane{z-index:5}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow .react-flow__edges{overflow:visible;pointer-events:none}.react-flow__connection-path,.react-flow__edge-path{stroke:#b1b1b7;stroke-width:1;fill:none}.react-flow__edge{cursor:pointer;pointer-events:visibleStroke}.react-flow__edge.animated path{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;-webkit-animation:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge:focus .react-flow__edge-path,.react-flow__edge:focus-visible .react-flow__edge-path{stroke:#555}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge-textbg{fill:#fff}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;user-select:none}.react-flow__connection{pointer-events:none}.react-flow__connection.animated{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__connectionline{z-index:1001}.react-flow__nodes{pointer-events:none}.react-flow__node,.react-flow__nodes{-webkit-transform-origin:0 0;transform-origin:0 0}.react-flow__node{box-sizing:border-box;cursor:grab;pointer-events:all;position:absolute;-webkit-user-select:none;user-select:none}.react-flow__node.dragging{cursor:grabbing}.react-flow__nodesselection{pointer-events:none;-webkit-transform-origin:left top;transform-origin:left top;z-index:3}.react-flow__nodesselection-rect{cursor:grab;pointer-events:all;position:absolute}.react-flow__handle{background:#1a192b;border:1px solid #fff;border-radius:100%;height:6px;min-height:5px;min-width:5px;pointer-events:none;position:absolute;width:6px}.react-flow__handle.connectable{cursor:crosshair;pointer-events:all}.react-flow__handle-bottom{bottom:-4px;top:auto}.react-flow__handle-bottom,.react-flow__handle-top{left:50%;-webkit-transform:translate(-50%);transform:translate(-50%)}.react-flow__handle-top{top:-4px}.react-flow__handle-left{left:-4px}.react-flow__handle-left,.react-flow__handle-right{top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.react-flow__handle-right{right:-4px}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__panel{margin:15px;position:absolute;z-index:5}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.react-flow__attribution{background:hsla(0,0%,100%,.5);font-size:10px;margin:0;padding:2px 3px}.react-flow__attribution a{color:#999;text-decoration:none}@-webkit-keyframes dashdraw{0%{stroke-dashoffset:10}}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{height:100%;pointer-events:none;position:absolute;width:100%}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node-default,.react-flow__node-group,.react-flow__node-input,.react-flow__node-output{background-color:#fff;border:1px solid #1a192b;border-radius:3px;color:#222;font-size:12px;padding:10px;text-align:center;width:150px}.react-flow__node-default.selectable:hover,.react-flow__node-group.selectable:hover,.react-flow__node-input.selectable:hover,.react-flow__node-output.selectable:hover{box-shadow:0 1px 4px 1px rgba(0,0,0,.08)}.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible,.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible{box-shadow:0 0 0 .5px #1a192b;outline:none}.react-flow__node-group{background-color:hsla(0,0%,94%,.25)}.react-flow__nodesselection-rect,.react-flow__selection{background:rgba(0,89,220,.08);border:1px dotted rgba(0,89,220,.8)}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls{box-shadow:0 0 2px 1px rgba(0,0,0,.08)}.react-flow__controls-button{align-items:center;background:#fefefe;border:none;border-bottom:1px solid #eee;box-sizing:initial;cursor:pointer;display:flex;height:16px;justify-content:center;padding:5px;-webkit-user-select:none;user-select:none;width:16px}.react-flow__controls-button:hover{background:#f4f4f4}.react-flow__controls-button svg{max-height:12px;max-width:12px;width:100%}.react-flow__minimap{background-color:#fff}:root{--sigma-background-color:#fff;--sigma-controls-background-color:#fff;--sigma-controls-background-color-hover:rgba(0,0,0,.2);--sigma-controls-border-color:rgba(0,0,0,.2);--sigma-controls-color:#000;--sigma-controls-zindex:100;--sigma-controls-margin:5px;--sigma-controls-size:30px}div.react-sigma{background:#fff;background:var(--sigma-background-color);position:relative}div.react-sigma,div.sigma-container{height:100%;width:100%}.react-sigma-controls{background-color:#fff;background-color:var(--sigma-controls-background-color);border:2px solid rgba(0,0,0,.2);border:2px solid var(--sigma-controls-border-color);border-radius:4px;color:#000;color:var(--sigma-controls-color);position:absolute;z-index:100;z-index:var(--sigma-controls-zindex)}.react-sigma-controls.bottom-right{bottom:5px;bottom:var(--sigma-controls-margin);right:5px;right:var(--sigma-controls-margin)}.react-sigma-controls.bottom-left{bottom:5px;bottom:var(--sigma-controls-margin);left:5px;left:var(--sigma-controls-margin)}.react-sigma-controls.top-right{right:5px;right:var(--sigma-controls-margin);top:5px;top:var(--sigma-controls-margin)}.react-sigma-controls.top-left{left:5px;left:var(--sigma-controls-margin);top:5px;top:var(--sigma-controls-margin)}.react-sigma-controls:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.react-sigma-controls:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.react-sigma-control{background-color:#fff;background-color:var(--sigma-controls-background-color);border-bottom:1px solid rgba(0,0,0,.2);border-bottom:1px solid var(--sigma-controls-border-color);height:30px;height:var(--sigma-controls-size);line-height:30px;line-height:var(--sigma-controls-size);width:30px;width:var(--sigma-controls-size)}.react-sigma-control:last-child{border-bottom:none}.react-sigma-control>*{box-sizing:border-box}.react-sigma-control>button{clip:rect(0,0,0,0);background-color:#fff;background-color:var(--sigma-controls-background-color);background-position:50%;background-repeat:no-repeat;background-size:50%;border:none;display:block;height:30px;height:var(--sigma-controls-size);line-height:30px;line-height:var(--sigma-controls-size);margin:0;padding:0;width:30px;width:var(--sigma-controls-size)}.react-sigma-control>button:hover{background-color:rgba(0,0,0,.2);background-color:var(--sigma-controls-background-color-hover)}.react-sigma-search{background-color:#fff;background-color:var(--sigma-controls-background-color)}.react-sigma-search label{visibility:hidden}.react-sigma-search input{background-color:#fff;background-color:var(--sigma-controls-background-color);border:none;box-sizing:border-box;color:#000;color:var(--sigma-controls-color);font-size:1em;margin:0;padding:5px;padding:var(--sigma-controls-margin);width:100%}
2
- /*# sourceMappingURL=main.38a62222.css.map*/
1
+ body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;margin:0}code{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}.react-flow__container{height:100%;left:0;position:absolute;top:0;width:100%}.react-flow__pane{cursor:grab;z-index:1}.react-flow__pane.dragging{cursor:grabbing}.react-flow__viewport{pointer-events:none;-webkit-transform-origin:0 0;transform-origin:0 0;z-index:2}.react-flow__renderer{z-index:4}.react-flow__selectionpane{z-index:5}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow .react-flow__edges{overflow:visible;pointer-events:none}.react-flow__connection-path,.react-flow__edge-path{stroke:#b1b1b7;stroke-width:1;fill:none}.react-flow__edge{cursor:pointer;pointer-events:visibleStroke}.react-flow__edge.animated path{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;-webkit-animation:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge:focus .react-flow__edge-path,.react-flow__edge:focus-visible .react-flow__edge-path{stroke:#555}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge-textbg{fill:#fff}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;user-select:none}.react-flow__connection{pointer-events:none}.react-flow__connection.animated{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__connectionline{z-index:1001}.react-flow__nodes{pointer-events:none}.react-flow__node,.react-flow__nodes{-webkit-transform-origin:0 0;transform-origin:0 0}.react-flow__node{box-sizing:border-box;cursor:grab;pointer-events:all;position:absolute;-webkit-user-select:none;user-select:none}.react-flow__node.dragging{cursor:grabbing}.react-flow__nodesselection{pointer-events:none;-webkit-transform-origin:left top;transform-origin:left top;z-index:3}.react-flow__nodesselection-rect{cursor:grab;pointer-events:all;position:absolute}.react-flow__handle{background:#1a192b;border:1px solid #fff;border-radius:100%;height:6px;min-height:5px;min-width:5px;pointer-events:none;position:absolute;width:6px}.react-flow__handle.connectable{cursor:crosshair;pointer-events:all}.react-flow__handle-bottom{bottom:-4px;top:auto}.react-flow__handle-bottom,.react-flow__handle-top{left:50%;-webkit-transform:translate(-50%);transform:translate(-50%)}.react-flow__handle-top{top:-4px}.react-flow__handle-left{left:-4px}.react-flow__handle-left,.react-flow__handle-right{top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.react-flow__handle-right{right:-4px}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__panel{margin:15px;position:absolute;z-index:5}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.react-flow__attribution{background:hsla(0,0%,100%,.5);font-size:10px;margin:0;padding:2px 3px}.react-flow__attribution a{color:#999;text-decoration:none}@-webkit-keyframes dashdraw{0%{stroke-dashoffset:10}}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{height:100%;pointer-events:none;position:absolute;width:100%}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node-default,.react-flow__node-group,.react-flow__node-input,.react-flow__node-output{background-color:#fff;border:1px solid #1a192b;border-radius:3px;color:#222;font-size:12px;padding:10px;text-align:center;width:150px}.react-flow__node-default.selectable:hover,.react-flow__node-group.selectable:hover,.react-flow__node-input.selectable:hover,.react-flow__node-output.selectable:hover{box-shadow:0 1px 4px 1px rgba(0,0,0,.08)}.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible,.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible{box-shadow:0 0 0 .5px #1a192b;outline:none}.react-flow__node-group{background-color:hsla(0,0%,94%,.25)}.react-flow__nodesselection-rect,.react-flow__selection{background:rgba(0,89,220,.08);border:1px dotted rgba(0,89,220,.8)}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls{box-shadow:0 0 2px 1px rgba(0,0,0,.08)}.react-flow__controls-button{align-items:center;background:#fefefe;border:none;border-bottom:1px solid #eee;box-sizing:initial;cursor:pointer;display:flex;height:16px;justify-content:center;padding:5px;-webkit-user-select:none;user-select:none;width:16px}.react-flow__controls-button:hover{background:#f4f4f4}.react-flow__controls-button svg{max-height:12px;max-width:12px;width:100%}.react-flow__minimap{background-color:#fff}
2
+ /*# sourceMappingURL=main.72e3d92e.css.map*/
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/css/main.72e3d92e.css","mappings":"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","sources":["index.css","../node_modules/reactflow/dist/style.css"],"sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n","/* this gets exported as style.css and can be used for the default theming */\n/* these are the necessary styles for React Flow, they get used by base.css and style.css */\n.react-flow__container {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n}\n.react-flow__pane {\n z-index: 1;\n cursor: -webkit-grab;\n cursor: grab;\n}\n.react-flow__pane.dragging {\n cursor: -webkit-grabbing;\n cursor: grabbing;\n }\n.react-flow__viewport {\n transform-origin: 0 0;\n z-index: 2;\n pointer-events: none;\n}\n.react-flow__renderer {\n z-index: 4;\n}\n.react-flow__selectionpane {\n z-index: 5;\n}\n.react-flow__nodesselection-rect:focus,\n.react-flow__nodesselection-rect:focus-visible {\n outline: none;\n}\n.react-flow .react-flow__edges {\n pointer-events: none;\n overflow: visible;\n}\n.react-flow__edge-path,\n.react-flow__connection-path {\n stroke: #b1b1b7;\n stroke-width: 1;\n fill: none;\n}\n.react-flow__edge {\n pointer-events: visibleStroke;\n cursor: pointer;\n}\n.react-flow__edge.animated path {\n stroke-dasharray: 5;\n -webkit-animation: dashdraw 0.5s linear infinite;\n animation: dashdraw 0.5s linear infinite;\n }\n.react-flow__edge.animated path.react-flow__edge-interaction {\n stroke-dasharray: none;\n -webkit-animation: none;\n animation: none;\n }\n.react-flow__edge.inactive {\n pointer-events: none;\n }\n.react-flow__edge.selected,\n .react-flow__edge:focus,\n .react-flow__edge:focus-visible {\n outline: none;\n }\n.react-flow__edge.selected .react-flow__edge-path,\n .react-flow__edge:focus .react-flow__edge-path,\n .react-flow__edge:focus-visible .react-flow__edge-path {\n stroke: #555;\n }\n.react-flow__edge-textwrapper {\n pointer-events: all;\n }\n.react-flow__edge-textbg {\n fill: white;\n }\n.react-flow__edge .react-flow__edge-text {\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n.react-flow__connection {\n pointer-events: none;\n}\n.react-flow__connection.animated {\n stroke-dasharray: 5;\n -webkit-animation: dashdraw 0.5s linear infinite;\n animation: dashdraw 0.5s linear infinite;\n }\n.react-flow__connectionline {\n z-index: 1001;\n}\n.react-flow__nodes {\n pointer-events: none;\n transform-origin: 0 0;\n}\n.react-flow__node {\n position: absolute;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n pointer-events: all;\n transform-origin: 0 0;\n box-sizing: border-box;\n cursor: -webkit-grab;\n cursor: grab;\n}\n.react-flow__node.dragging {\n cursor: -webkit-grabbing;\n cursor: grabbing;\n }\n.react-flow__nodesselection {\n z-index: 3;\n transform-origin: left top;\n pointer-events: none;\n}\n.react-flow__nodesselection-rect {\n position: absolute;\n pointer-events: all;\n cursor: -webkit-grab;\n cursor: grab;\n }\n.react-flow__handle {\n position: absolute;\n pointer-events: none;\n min-width: 5px;\n min-height: 5px;\n width: 6px;\n height: 6px;\n background: #1a192b;\n border: 1px solid white;\n border-radius: 100%;\n}\n.react-flow__handle.connectable {\n pointer-events: all;\n cursor: crosshair;\n }\n.react-flow__handle-bottom {\n top: auto;\n left: 50%;\n bottom: -4px;\n transform: translate(-50%, 0);\n }\n.react-flow__handle-top {\n left: 50%;\n top: -4px;\n transform: translate(-50%, 0);\n }\n.react-flow__handle-left {\n top: 50%;\n left: -4px;\n transform: translate(0, -50%);\n }\n.react-flow__handle-right {\n right: -4px;\n top: 50%;\n transform: translate(0, -50%);\n }\n.react-flow__edgeupdater {\n cursor: move;\n pointer-events: all;\n}\n.react-flow__panel {\n position: absolute;\n z-index: 5;\n margin: 15px;\n}\n.react-flow__panel.top {\n top: 0;\n }\n.react-flow__panel.bottom {\n bottom: 0;\n }\n.react-flow__panel.left {\n left: 0;\n }\n.react-flow__panel.right {\n right: 0;\n }\n.react-flow__panel.center {\n left: 50%;\n transform: translateX(-50%);\n }\n.react-flow__attribution {\n font-size: 10px;\n background: rgba(255, 255, 255, 0.5);\n padding: 2px 3px;\n margin: 0;\n}\n.react-flow__attribution a {\n text-decoration: none;\n color: #999;\n }\n@-webkit-keyframes dashdraw {\n from {\n stroke-dashoffset: 10;\n }\n}\n@keyframes dashdraw {\n from {\n stroke-dashoffset: 10;\n }\n}\n.react-flow__edgelabel-renderer {\n position: absolute;\n width: 100%;\n height: 100%;\n pointer-events: none;\n}\n.react-flow__edge.updating .react-flow__edge-path {\n stroke: #777;\n }\n.react-flow__edge-text {\n font-size: 10px;\n }\n.react-flow__node-default,\n.react-flow__node-input,\n.react-flow__node-output,\n.react-flow__node-group {\n padding: 10px;\n border-radius: 3px;\n width: 150px;\n font-size: 12px;\n color: #222;\n text-align: center;\n border-width: 1px;\n border-style: solid;\n border-color: #1a192b;\n background-color: white;\n}\n.react-flow__node-default.selectable:hover, .react-flow__node-input.selectable:hover, .react-flow__node-output.selectable:hover, .react-flow__node-group.selectable:hover {\n box-shadow: 0 1px 4px 1px rgba(0, 0, 0, 0.08);\n }\n.react-flow__node-default.selectable.selected,\n .react-flow__node-default.selectable:focus,\n .react-flow__node-default.selectable:focus-visible,\n .react-flow__node-input.selectable.selected,\n .react-flow__node-input.selectable:focus,\n .react-flow__node-input.selectable:focus-visible,\n .react-flow__node-output.selectable.selected,\n .react-flow__node-output.selectable:focus,\n .react-flow__node-output.selectable:focus-visible,\n .react-flow__node-group.selectable.selected,\n .react-flow__node-group.selectable:focus,\n .react-flow__node-group.selectable:focus-visible {\n box-shadow: 0 0 0 0.5px #1a192b;\n outline: none;\n }\n.react-flow__node-group {\n background-color: rgba(240, 240, 240, 0.25);\n}\n.react-flow__nodesselection-rect,\n.react-flow__selection {\n background: rgba(0, 89, 220, 0.08);\n border: 1px dotted rgba(0, 89, 220, 0.8);\n}\n.react-flow__nodesselection-rect:focus,\n .react-flow__nodesselection-rect:focus-visible,\n .react-flow__selection:focus,\n .react-flow__selection:focus-visible {\n outline: none;\n }\n.react-flow__controls {\n box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.08);\n}\n.react-flow__controls-button {\n border: none;\n background: #fefefe;\n border-bottom: 1px solid #eee;\n box-sizing: content-box;\n display: flex;\n justify-content: center;\n align-items: center;\n width: 16px;\n height: 16px;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n padding: 5px;\n }\n.react-flow__controls-button:hover {\n background: #f4f4f4;\n }\n.react-flow__controls-button svg {\n width: 100%;\n max-width: 12px;\n max-height: 12px;\n }\n.react-flow__minimap {\n background-color: #fff;\n}\n"],"names":[],"sourceRoot":""}