griptape-nodes 0.57.0__py3-none-any.whl → 0.58.0__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.
Files changed (51) hide show
  1. griptape_nodes/api_client/__init__.py +9 -0
  2. griptape_nodes/api_client/client.py +279 -0
  3. griptape_nodes/api_client/request_client.py +273 -0
  4. griptape_nodes/app/app.py +57 -150
  5. griptape_nodes/bootstrap/utils/python_subprocess_executor.py +1 -1
  6. griptape_nodes/bootstrap/workflow_executors/local_session_workflow_executor.py +22 -50
  7. griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py +6 -1
  8. griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py +27 -46
  9. griptape_nodes/bootstrap/workflow_executors/utils/subprocess_script.py +7 -0
  10. griptape_nodes/bootstrap/workflow_publishers/local_workflow_publisher.py +3 -1
  11. griptape_nodes/bootstrap/workflow_publishers/subprocess_workflow_publisher.py +3 -1
  12. griptape_nodes/bootstrap/workflow_publishers/utils/subprocess_script.py +16 -1
  13. griptape_nodes/common/node_executor.py +466 -0
  14. griptape_nodes/drivers/storage/base_storage_driver.py +0 -11
  15. griptape_nodes/drivers/storage/griptape_cloud_storage_driver.py +7 -25
  16. griptape_nodes/drivers/storage/local_storage_driver.py +2 -2
  17. griptape_nodes/exe_types/connections.py +37 -9
  18. griptape_nodes/exe_types/core_types.py +1 -1
  19. griptape_nodes/exe_types/node_types.py +115 -22
  20. griptape_nodes/machines/control_flow.py +48 -7
  21. griptape_nodes/machines/parallel_resolution.py +98 -29
  22. griptape_nodes/machines/sequential_resolution.py +61 -22
  23. griptape_nodes/node_library/library_registry.py +24 -1
  24. griptape_nodes/node_library/workflow_registry.py +38 -2
  25. griptape_nodes/retained_mode/events/execution_events.py +8 -1
  26. griptape_nodes/retained_mode/events/flow_events.py +90 -3
  27. griptape_nodes/retained_mode/events/node_events.py +17 -10
  28. griptape_nodes/retained_mode/events/workflow_events.py +5 -0
  29. griptape_nodes/retained_mode/griptape_nodes.py +16 -219
  30. griptape_nodes/retained_mode/managers/config_manager.py +0 -46
  31. griptape_nodes/retained_mode/managers/engine_identity_manager.py +225 -74
  32. griptape_nodes/retained_mode/managers/flow_manager.py +1276 -230
  33. griptape_nodes/retained_mode/managers/library_manager.py +7 -8
  34. griptape_nodes/retained_mode/managers/node_manager.py +197 -9
  35. griptape_nodes/retained_mode/managers/secrets_manager.py +26 -0
  36. griptape_nodes/retained_mode/managers/session_manager.py +264 -227
  37. griptape_nodes/retained_mode/managers/settings.py +4 -38
  38. griptape_nodes/retained_mode/managers/static_files_manager.py +3 -3
  39. griptape_nodes/retained_mode/managers/version_compatibility_manager.py +135 -6
  40. griptape_nodes/retained_mode/managers/workflow_manager.py +206 -78
  41. griptape_nodes/servers/mcp.py +23 -15
  42. griptape_nodes/utils/async_utils.py +36 -0
  43. griptape_nodes/utils/dict_utils.py +8 -2
  44. griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_removal.py +11 -6
  45. griptape_nodes/version_compatibility/workflow_versions/v0_7_0/local_executor_argument_addition.py +12 -5
  46. {griptape_nodes-0.57.0.dist-info → griptape_nodes-0.58.0.dist-info}/METADATA +4 -3
  47. {griptape_nodes-0.57.0.dist-info → griptape_nodes-0.58.0.dist-info}/RECORD +49 -47
  48. {griptape_nodes-0.57.0.dist-info → griptape_nodes-0.58.0.dist-info}/WHEEL +1 -1
  49. griptape_nodes/retained_mode/utils/engine_identity.py +0 -245
  50. griptape_nodes/servers/ws_request_manager.py +0 -268
  51. {griptape_nodes-0.57.0.dist-info → griptape_nodes-0.58.0.dist-info}/entry_points.txt +0 -0
@@ -2,11 +2,13 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING
4
4
 
5
+ import semver
6
+
5
7
  from griptape_nodes.retained_mode.events.app_events import (
6
8
  GetEngineVersionRequest,
7
9
  GetEngineVersionResultSuccess,
8
10
  )
9
- from griptape_nodes.retained_mode.griptape_nodes import GriptapeNodes, Version
11
+ from griptape_nodes.retained_mode.griptape_nodes import GriptapeNodes
10
12
  from griptape_nodes.retained_mode.managers.library_lifecycle.library_status import LibraryStatus
11
13
  from griptape_nodes.retained_mode.managers.version_compatibility_manager import (
12
14
  LibraryVersionCompatibilityCheck,
@@ -22,8 +24,11 @@ class ModifiedParametersSetRemovalCheck(LibraryVersionCompatibilityCheck):
22
24
 
23
25
  def applies_to_library(self, library_data: LibrarySchema) -> bool:
24
26
  """Check applies to libraries with engine_version < 0.39.0."""
25
- library_version = Version.from_string(library_data.metadata.engine_version)
26
- return library_version is not None and library_version < Version(0, 39, 0)
27
+ try:
28
+ library_version = semver.VersionInfo.parse(library_data.metadata.engine_version)
29
+ return library_version < semver.VersionInfo(0, 39, 0)
30
+ except Exception:
31
+ return False
27
32
 
28
33
  def check_library(self, library_data: LibrarySchema) -> list[LibraryVersionCompatibilityIssue]:
29
34
  """Perform the modified_parameters_set deprecation check."""
@@ -33,14 +38,14 @@ class ModifiedParametersSetRemovalCheck(LibraryVersionCompatibilityCheck):
33
38
  # If we can't get current engine version, skip version-specific warnings
34
39
  return []
35
40
 
36
- current_engine_version = Version(
41
+ current_engine_version = semver.VersionInfo(
37
42
  engine_version_result.major, engine_version_result.minor, engine_version_result.patch
38
43
  )
39
44
 
40
45
  # Determine which phase we're in based on current engine version
41
46
  library_version_str = library_data.metadata.engine_version
42
47
 
43
- if current_engine_version >= Version(0, 39, 0):
48
+ if current_engine_version >= semver.VersionInfo(0, 39, 0):
44
49
  # 0.39+ Release: Parameter removed, reject incompatible libraries
45
50
  return [
46
51
  LibraryVersionCompatibilityIssue(
@@ -56,7 +61,7 @@ class ModifiedParametersSetRemovalCheck(LibraryVersionCompatibilityCheck):
56
61
  severity=LibraryStatus.UNUSABLE,
57
62
  ),
58
63
  ]
59
- if current_engine_version >= Version(0, 38, 0):
64
+ if current_engine_version >= semver.VersionInfo(0, 38, 0):
60
65
  # 0.38 Release: Warning about upcoming removal in 0.39
61
66
  return [
62
67
  LibraryVersionCompatibilityIssue(
@@ -4,7 +4,8 @@ from __future__ import annotations
4
4
 
5
5
  from typing import TYPE_CHECKING
6
6
 
7
- from griptape_nodes.retained_mode.griptape_nodes import Version
7
+ import semver
8
+
8
9
  from griptape_nodes.retained_mode.managers.version_compatibility_manager import (
9
10
  WorkflowVersionCompatibilityCheck,
10
11
  WorkflowVersionCompatibilityIssue,
@@ -20,16 +21,22 @@ class LocalExecutorArgumentAddition(WorkflowVersionCompatibilityCheck):
20
21
 
21
22
  def applies_to_workflow(self, workflow_metadata: WorkflowMetadata) -> bool:
22
23
  """Apply this check to workflows with schema version < 0.7.0."""
23
- workflow_version = Version.from_string(workflow_metadata.schema_version)
24
- return workflow_version is not None and workflow_version < Version(0, 7, 0)
24
+ try:
25
+ workflow_version = semver.VersionInfo.parse(workflow_metadata.schema_version)
26
+ return workflow_version < semver.VersionInfo(0, 7, 0)
27
+ except Exception:
28
+ return False
25
29
 
26
30
  def check_workflow(self, workflow_metadata: WorkflowMetadata) -> list[WorkflowVersionCompatibilityIssue]:
27
31
  """Check workflow schema version compatibility."""
28
32
  issues = []
29
33
 
30
- workflow_schema_version = Version.from_string(workflow_metadata.schema_version)
34
+ try:
35
+ workflow_schema_version = semver.VersionInfo.parse(workflow_metadata.schema_version)
36
+ except Exception:
37
+ return issues
31
38
 
32
- if workflow_schema_version is not None and workflow_schema_version < Version(0, 7, 0):
39
+ if workflow_schema_version < semver.VersionInfo(0, 7, 0):
33
40
  issues.append(
34
41
  WorkflowVersionCompatibilityIssue(
35
42
  message=f"Workflow schema version {workflow_metadata.schema_version} is older than version 0.7.0. "
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: griptape-nodes
3
- Version: 0.57.0
3
+ Version: 0.58.0
4
4
  Summary: Add your description here
5
- Requires-Dist: griptape>=1.8.3
5
+ Requires-Dist: griptape>=1.8.5
6
6
  Requires-Dist: pydantic>=2.10.6
7
7
  Requires-Dist: python-dotenv>=1.0.1
8
8
  Requires-Dist: xdg-base-dirs>=6.0.2
@@ -20,8 +20,9 @@ Requires-Dist: binaryornot>=0.4.4
20
20
  Requires-Dist: pillow>=11.3.0
21
21
  Requires-Dist: watchfiles>=1.1.0
22
22
  Requires-Dist: typer>=0.15.0
23
- Requires-Dist: huggingface-hub>=0.28.0
23
+ Requires-Dist: huggingface-hub[xf-xet]>=0.28.0
24
24
  Requires-Dist: rich>=14.1.0
25
+ Requires-Dist: semver>=3.0.4
25
26
  Requires-Dist: austin-dist>=3.7.0 ; extra == 'profiling'
26
27
  Requires-Python: >=3.12.0, <3.13
27
28
  Provides-Extra: profiling
@@ -1,24 +1,27 @@
1
1
  griptape_nodes/__init__.py,sha256=WxWjICLxwuyZGDpPUyCmj047GbN7PIspi4YMWgmrrQc,671
2
2
  griptape_nodes/__main__.py,sha256=fJhor6_1A27abwbnceyNheONP1iXkPzjjsV5jBEfF2M,144
3
+ griptape_nodes/api_client/__init__.py,sha256=9iyLcPbcXjxxLhhCSYQ5zgvlwxceyrNXDE8YhOIVH8g,216
4
+ griptape_nodes/api_client/client.py,sha256=3qmTLMeVTFeyO-XlxTUUWwsEgG41R8swE64EccotaJQ,9664
5
+ griptape_nodes/api_client/request_client.py,sha256=2_fi1RN8BE89SVmLl_JRAkZvNTNqc7b4rFUfW-mWYJI,9620
3
6
  griptape_nodes/app/.python-version,sha256=e1X45ntWI8S-8_ppEojalDfXnTq6FW3kjUgdsyrH0W0,5
4
7
  griptape_nodes/app/__init__.py,sha256=DB-DTsgcNnbmEClXEouwzGhrmo3gHBCWXB9BkPGpdQI,90
5
- griptape_nodes/app/app.py,sha256=B0GVXGUMGadhM3OrgW-2MOyY6wlnjIkTb8_QVfwz5WA,18700
8
+ griptape_nodes/app/app.py,sha256=q1dRMnMxFcinyI36ehhU08buni1scBhU1zm2U6WUVDo,15333
6
9
  griptape_nodes/app/watch.py,sha256=hKVP_SuV9C17bH1h9o4uIVTKH-IL_-0iyHaNYmILTWU,1594
7
10
  griptape_nodes/bootstrap/__init__.py,sha256=ENv3SIzQ9TtlRrg1y4e4CnoBpJaFpFSkNpTFBV8X5Ls,25
8
11
  griptape_nodes/bootstrap/utils/__init__.py,sha256=tlNEApJLZazcBNhxkTdup4URwznnz4nZxjSaRfFrTBM,31
9
- griptape_nodes/bootstrap/utils/python_subprocess_executor.py,sha256=s2Ymn5YsMVKYbwt8uaiiZElhorSX62FvxGQd24gMUE0,4288
12
+ griptape_nodes/bootstrap/utils/python_subprocess_executor.py,sha256=8T_hqABisEBWemh4__XpnrR0Edbli4RQc_uF5jL0lMY,4294
10
13
  griptape_nodes/bootstrap/workflow_executors/__init__.py,sha256=pyjN81-eLtjyECFYLXOtMCixiiI9qBi5yald86iM7Ek,34
11
- griptape_nodes/bootstrap/workflow_executors/local_session_workflow_executor.py,sha256=t8eKqGnSSMx3TdP319UsUGGe-ezBocFMMdPnqZxtrrA,17952
12
- griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py,sha256=jdv912EFLa-lSHxWeKGw9yjHGUZIiCSlTBAKI6x00L8,9767
13
- griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py,sha256=huyvnqOD9Snx_0K4-ScSxhMyA6R3Jm-qUO4pkK3xcfo,13861
14
+ griptape_nodes/bootstrap/workflow_executors/local_session_workflow_executor.py,sha256=Xgnp5JKemMhCBX1nhfQ2hksWJx7JtQKBWEAHArcAhZo,16858
15
+ griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py,sha256=816m9wf_lOUj7GXGAH4DbQBMT_JEjkUbvg3btzzm-ns,10114
16
+ griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py,sha256=XKxK01j7LdvZIYCF788SJr3gQGBKXSFb6T_DADfN0Mw,12861
14
17
  griptape_nodes/bootstrap/workflow_executors/utils/__init__.py,sha256=IEz4GHM4-w_u6VpLemrj-V38v8aZJinr5Wya9ucEad0,40
15
- griptape_nodes/bootstrap/workflow_executors/utils/subprocess_script.py,sha256=YJj85uZxdrEabwown4AbGo84zWVa4f1z1Gh0wNVv0-4,1413
18
+ griptape_nodes/bootstrap/workflow_executors/utils/subprocess_script.py,sha256=LCW6P3s3DTG_cUvG41l4GxRyj43c1p9yYlcJMACeW3s,1659
16
19
  griptape_nodes/bootstrap/workflow_executors/workflow_executor.py,sha256=MBbUFdbvsYOJl_ebxxSCxq1R37StghQ1gAdMkIcGtbI,1145
17
20
  griptape_nodes/bootstrap/workflow_publishers/__init__.py,sha256=7ncdCGtEArgTBgSFDNCSBoIIAJpzlph1wTd2wipwvvM,35
18
- griptape_nodes/bootstrap/workflow_publishers/local_workflow_publisher.py,sha256=zWLnXduPJw9vBoGfcGJZJ2DUzhLeJK6fS4J7oMQgoAA,1652
19
- griptape_nodes/bootstrap/workflow_publishers/subprocess_workflow_publisher.py,sha256=RRZmmTE_inUe4UgFqnP45BdGHKSbcvl7D24mEjTAuJU,2778
21
+ griptape_nodes/bootstrap/workflow_publishers/local_workflow_publisher.py,sha256=f2jQL1RO5HnC0_gZVlx4UOTo5X7pqUAkgmJj_tliAcg,1788
22
+ griptape_nodes/bootstrap/workflow_publishers/subprocess_workflow_publisher.py,sha256=O9gK7BvBE-5pMSG70rXLjibbUKfJuce85hWcs6iYyXg,2879
20
23
  griptape_nodes/bootstrap/workflow_publishers/utils/__init__.py,sha256=Kj-IIxgg01ihyUmLWgZu4ZJ6M7V1fK4Efw9quCcu-ZM,41
21
- griptape_nodes/bootstrap/workflow_publishers/utils/subprocess_script.py,sha256=f-11vcvC7C821rTfX4PV1LMJuE5AeJp6yiBDWYjYoLc,1679
24
+ griptape_nodes/bootstrap/workflow_publishers/utils/subprocess_script.py,sha256=5NfuaGrL-97Wb6JORRhR-zU4ooj3FaxOjqJizGb96Y0,2060
22
25
  griptape_nodes/cli/__init__.py,sha256=HuXHtxqDMtpYRokxiFYuNB7R5EgkOshPil273kTmgNg,33
23
26
  griptape_nodes/cli/commands/__init__.py,sha256=8EbS15rm9xrbcPocuQO2RmOwSD1BBwa8iDgPSdsvzuU,35
24
27
  griptape_nodes/cli/commands/config.py,sha256=zh5rs2vCY_x9dEUK2jtQQJGcjlJzhpJJ-EgHHvkrvdg,2302
@@ -31,31 +34,32 @@ griptape_nodes/cli/main.py,sha256=A9k-4vdxOrm3Z0NNtDWLmvSW5ecvtIXInLR0zn2AERA,17
31
34
  griptape_nodes/cli/shared.py,sha256=JnUt-i7_hi81rqkT2fpVBJMTmODNiGFd7-Cv0Xt9QOU,2600
32
35
  griptape_nodes/common/__init__.py,sha256=HTbJfTpu6-nU91zFCZW2qUNeW6bitNWNDayWqH6fpbA,22
33
36
  griptape_nodes/common/directed_graph.py,sha256=hk3C_S4GiG4FZOmufjebb-6_2SwQrbyTidYTSbCDWMU,2361
37
+ griptape_nodes/common/node_executor.py,sha256=bMM6hiaNfwN6wxkL43xqklSC9gzt2Ml3EINx2J6hw5s,20921
34
38
  griptape_nodes/drivers/__init__.py,sha256=tHmiFQn6uJyFVhC2PrqHgRUH3d3yDsqMQpWqRasmaqA,42
35
39
  griptape_nodes/drivers/storage/__init__.py,sha256=_7p8vJt3YnnF6sD3Uxxw38c-gazuMIHSS-m3G6sa2Qk,208
36
- griptape_nodes/drivers/storage/base_storage_driver.py,sha256=m03j8vA_D0h0yrveROZJC2uorcwzpJyOhGrSh29biuE,4296
37
- griptape_nodes/drivers/storage/griptape_cloud_storage_driver.py,sha256=-fVb65zqVYR7dKPukll4_X9QS0RlDG-JXgDFJJBCh_A,7597
38
- griptape_nodes/drivers/storage/local_storage_driver.py,sha256=U1-2gqFQKsAyHL-S4eGUQI3X4T6XhebVrS8bk7Wnkok,3652
40
+ griptape_nodes/drivers/storage/base_storage_driver.py,sha256=47PrMzxOuJhV2ee4CbPT7YOqR2MjlHr3VxhGON_ygio,3945
41
+ griptape_nodes/drivers/storage/griptape_cloud_storage_driver.py,sha256=wFAssDP4pE06-KJXzKfpykSDjwDWgPlz0hWfOfnL-zg,6854
42
+ griptape_nodes/drivers/storage/local_storage_driver.py,sha256=6FqtT4I4lZTRSa_7gQG7hDHShVKYySWXaQUCe6i-RmM,3674
39
43
  griptape_nodes/drivers/storage/storage_backend.py,sha256=3QBIwrgPc1krBIiPYLoK2swhIPDiKJnnucOEdyx7y3c,184
40
44
  griptape_nodes/exe_types/__init__.py,sha256=wGGwKGX9-TSarUFbXpDvdU_J7eXIbWTBl_NCLOZa-G8,32
41
- griptape_nodes/exe_types/connections.py,sha256=_-VNzf6Kay62QzJlSX-LlHTUhz-CKF-UDsbZLJ0l6Wk,12435
42
- griptape_nodes/exe_types/core_types.py,sha256=XlYXSQnlHew7yK_iJnSdOQyiYq63OmVMGF2SjKGA3lM,81328
45
+ griptape_nodes/exe_types/connections.py,sha256=Cjt-RLjYhkTUHTrYlNIUZrYVzsyH7OXo6JO2O6exI8k,13853
46
+ griptape_nodes/exe_types/core_types.py,sha256=9QNMFintNgP5iqmrEbbKUHS2QHjsEEP3GL_wbaVTkBg,81327
43
47
  griptape_nodes/exe_types/flow.py,sha256=pCeTrx8yrUgLw1U9yQxC7arzJjyP2vag-pG0QTKut-M,5716
44
- griptape_nodes/exe_types/node_types.py,sha256=SqTKffO-Iux18v038DxVOpY-nrZkop7HoOH-sv7JUnI,77950
48
+ griptape_nodes/exe_types/node_types.py,sha256=JAf5m7XZTvwtZdldj7oljRD5JOOg6Akse6HML_qB1O8,81833
45
49
  griptape_nodes/exe_types/param_components/__init__.py,sha256=ocm75WnsgiD6ozKVGFhoH9cQe_FEzeF2osxrRujOes0,60
46
50
  griptape_nodes/exe_types/param_components/execution_status_component.py,sha256=eeUcUOOraGa6sDH_zg_QnGPoP0K-pm3fu90-KAtrmq8,5532
47
51
  griptape_nodes/exe_types/type_validator.py,sha256=RTz1vX09jzQpHhozITMJ0siOZUXvsERDhrApjdaM1WM,1120
48
52
  griptape_nodes/machines/__init__.py,sha256=v0jkwr-CFOLmfEYUQvX8BKQLOdvhSsA6toXkdHcPGUE,30
49
- griptape_nodes/machines/control_flow.py,sha256=iFCh2cjgBo_-nARVPmmJp4m9qAfEKR85iRPcTHJtuzc,15048
53
+ griptape_nodes/machines/control_flow.py,sha256=INMj9HU-WOgd-e9HD3-rkbGGCePw_ImviLfSn2MeiGo,17340
50
54
  griptape_nodes/machines/dag_builder.py,sha256=Fijbe46OsZQztcXGlvel2VUtn-CFbJm7Ui3_zCeKNXA,9932
51
55
  griptape_nodes/machines/fsm.py,sha256=WNo2w5c9Gbgzo5odcvbRT02EhCMFf3n3WYbZ0GYk1WI,2553
52
- griptape_nodes/machines/parallel_resolution.py,sha256=qnbzH6EO64A4xBfsWtBQYXfE5sAVglQUIe0P3kKsKMk,26043
53
- griptape_nodes/machines/sequential_resolution.py,sha256=f7DdsJ55pejaL1SPnQUr1NYPWEAKMt1GutPaM2OPUog,16951
56
+ griptape_nodes/machines/parallel_resolution.py,sha256=l4ijlef_yi638YFudOCR6Hspvbzko_-P331k08j2Lx0,29487
57
+ griptape_nodes/machines/sequential_resolution.py,sha256=x0qi21iCtb6rkc5keeuAk0_MlFFzD4QwuHsHM47YXHw,18827
54
58
  griptape_nodes/mcp_server/__init__.py,sha256=GSpJWqE4lICaryhsQR1okeMH2x6j1bBL0HVxtr52WLg,42
55
59
  griptape_nodes/node_library/__init__.py,sha256=U3FcSdmq6UW7qt6E3Up3NWKvUEn5_5lqL-u5qbzfxMQ,28
56
60
  griptape_nodes/node_library/advanced_node_library.py,sha256=B1ZaxuFIzQ6tx_3MLIxlsHuahthEC1Hw_t6K_ByIdzs,2104
57
- griptape_nodes/node_library/library_registry.py,sha256=lGYjFa6xtEPOam5OIZdpENTkm4OmRcwiUC7w-OWBxZc,13090
58
- griptape_nodes/node_library/workflow_registry.py,sha256=FMiR_XWk2R1U0HhvzoQzk2tkzu1X-LEycm43jFLpbmw,8835
61
+ griptape_nodes/node_library/library_registry.py,sha256=s77u0NbESOzaB29-PzQ1EKrR1WyQKOQTRGaKx3ORXoY,13888
62
+ griptape_nodes/node_library/workflow_registry.py,sha256=q7CdlBVptccSu43AUd6eJvKvAvNiZt4wvtoMi2sqsBY,10522
59
63
  griptape_nodes/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
64
  griptape_nodes/retained_mode/__init__.py,sha256=X12DKL6KhLsiRTPIlrPj2h76_sJ0q0eH4r0kMQkodm0,29
61
65
  griptape_nodes/retained_mode/events/__init__.py,sha256=7B1C-c0jVvnShtHJ2lfX6BZPE0U1DgQwg1e4DorhKG0,22
@@ -66,14 +70,14 @@ griptape_nodes/retained_mode/events/base_events.py,sha256=UPEMkoU7lUtm8L_wdeTp8Y
66
70
  griptape_nodes/retained_mode/events/config_events.py,sha256=Y03YMLoJTXy0Sz6tq-6lOIs37CmXn1Br3GYAinl02nY,7070
67
71
  griptape_nodes/retained_mode/events/connection_events.py,sha256=QjHAp0SeCbRSG-dF_nU_CPaOcSKItq2DWJ_FHWgF1b4,4744
68
72
  griptape_nodes/retained_mode/events/context_events.py,sha256=-FIwjI0hJodDhfM4BF-3GTRycu80v1TlSSOX34oA9nA,2122
69
- griptape_nodes/retained_mode/events/execution_events.py,sha256=JMKqauFNjfRTEIcm18sa5xFvn8rzDRjR8oThHWD3bzs,10297
70
- griptape_nodes/retained_mode/events/flow_events.py,sha256=NBczPiloib0xAbRIbFa6qXaniJOrc-UOESVRAkqA95k,16890
73
+ griptape_nodes/retained_mode/events/execution_events.py,sha256=MQY-igbmaPCM45fcWl2-U6I66cUbI6VjxGYvtrIpjyw,10802
74
+ griptape_nodes/retained_mode/events/flow_events.py,sha256=QLHzD3IvdKzuA8LC_PlqDfFDhfVSfiyaYMQ_Xwe7_Qo,21284
71
75
  griptape_nodes/retained_mode/events/generate_request_payload_schemas.py,sha256=PQ0QRZAUBljSIGjB8QhYUeRmSrfmLsJ6XVcygJKi13I,1102
72
76
  griptape_nodes/retained_mode/events/library_events.py,sha256=9KVMHA5VazY3fXEIm31Zmy-rJ43AxNgna4SzVPmy8Pg,17629
73
77
  griptape_nodes/retained_mode/events/logger_events.py,sha256=jYlxzPomgCsJuPtJ0znWBhD8QJfC8qC4xfChDiuVuyg,705
74
78
  griptape_nodes/retained_mode/events/mcp_events.py,sha256=51OlMZVcabdcIxBb_ojvrHtq2jAzZA31pooPBKaApyg,10734
75
79
  griptape_nodes/retained_mode/events/model_events.py,sha256=EbSjIpJrQi2RuRRFJsoioAyMchAba-vEOXvLBCR0xi0,9227
76
- griptape_nodes/retained_mode/events/node_events.py,sha256=ZV9kK5GqgJlDKT7ybifQDGbHpG5ObCywKH-OCVGq-gE,30026
80
+ griptape_nodes/retained_mode/events/node_events.py,sha256=jTcO5-Mw52fAJUzVc6UaXwRKHfO2HO0hnNYcGg9phVo,30321
77
81
  griptape_nodes/retained_mode/events/object_events.py,sha256=cJaqEU73Lzf1RRxJrFqEpl8eTr-gDhKpXKywJ-vVCJQ,2631
78
82
  griptape_nodes/retained_mode/events/os_events.py,sha256=X0mmyk_r5t6upaQ8eWClD7J25AiX2ggsAuxMZSW9Vx0,8085
79
83
  griptape_nodes/retained_mode/events/parameter_events.py,sha256=32dDaVe9oV_fNRtz5xv4_9GP_yr_EXUMsRi2i1rTSNI,19276
@@ -84,16 +88,16 @@ griptape_nodes/retained_mode/events/static_file_events.py,sha256=c8kKkrxAPZxrE9f
84
88
  griptape_nodes/retained_mode/events/sync_events.py,sha256=AoxBZLPPdzx4S5CiOJVRDebHnQb349Dq5jVO8Fh_sn8,2016
85
89
  griptape_nodes/retained_mode/events/validation_events.py,sha256=H2yWoHp2t7QwGV_fDQXRy7JojYnK4k6SOAlEvRYST_Q,3062
86
90
  griptape_nodes/retained_mode/events/variable_events.py,sha256=fnl_sY8GWI_R4UJQTEJSlmsyCD9TiEW0U2UD2seBabs,10587
87
- griptape_nodes/retained_mode/events/workflow_events.py,sha256=pvY-RTAUMM4YQjJPPDH1OWcJw-N5Gth6pJznK0Wkki0,22135
88
- griptape_nodes/retained_mode/griptape_nodes.py,sha256=yGJzCeKKT2wyMVJbstmUoJ-fV5WIEMm4doWWbdottCs,28231
91
+ griptape_nodes/retained_mode/events/workflow_events.py,sha256=FjARlC9wwWFMqtugEkPOEf_y9eyEhfzP-MZSl4TGRBI,22530
92
+ griptape_nodes/retained_mode/griptape_nodes.py,sha256=jB8Ufn13JbanahY3pc_43C9-DS-p4YAX_h8OvkOLgSw,18826
89
93
  griptape_nodes/retained_mode/managers/__init__.py,sha256=OTXysKusqYCQeAYwnVj4PbE3MxvAUTq9xOZT6vUE3JA,24
90
94
  griptape_nodes/retained_mode/managers/agent_manager.py,sha256=GeBAMGnSB7wnkA6LGwBxR7WVXOc028X6B-Y4d2Two1I,15447
91
95
  griptape_nodes/retained_mode/managers/arbitrary_code_exec_manager.py,sha256=3IRIrpKR62MvTdGWfQa1ARUVxCmMUNtzUU4xMcQdlCY,1891
92
- griptape_nodes/retained_mode/managers/config_manager.py,sha256=LwtcdRx0r-3eU6K0O0M2jLlYQo5yoDQYM93Fg_vh9Mw,27854
96
+ griptape_nodes/retained_mode/managers/config_manager.py,sha256=WfzvFDPyboHgsCMpVGER6Ar1OHyPD_827LQx9xaUsMM,25573
93
97
  griptape_nodes/retained_mode/managers/context_manager.py,sha256=eb44_CAZhCg2iYIoodlAPpYc67tG3sHyq9dPNoiq_1s,23031
94
- griptape_nodes/retained_mode/managers/engine_identity_manager.py,sha256=GBBz7HJBJVNyXLGRdAvqDgihMRB_YjWqdEwLMCnadUg,4409
98
+ griptape_nodes/retained_mode/managers/engine_identity_manager.py,sha256=-31364A03kU0YmAx3nM7nHdWfKnkej5Cawt_Plbwa68,10526
95
99
  griptape_nodes/retained_mode/managers/event_manager.py,sha256=n8qt5kefgEk-5uba9n96yHeUzB_3zJukqG_qo2pvhqo,12910
96
- griptape_nodes/retained_mode/managers/flow_manager.py,sha256=k0JfkQ2mz6QgnEOmXjITGi51WCXmTJ6crzHf7fKwpXM,147418
100
+ griptape_nodes/retained_mode/managers/flow_manager.py,sha256=_ozGVx5binKfoMx_kuB3qLkDgOJVI_gDqYfpVeSaZ94,202232
97
101
  griptape_nodes/retained_mode/managers/library_lifecycle/__init__.py,sha256=Iq79VxTdETiExBfFWXceJggDZqS6X3OkzXE9XwFclVw,1340
98
102
  griptape_nodes/retained_mode/managers/library_lifecycle/data_models.py,sha256=fvAP0VaYGPHYl_Kg3RL4gdJlpqya8UTvpP-C49r950k,6723
99
103
  griptape_nodes/retained_mode/managers/library_lifecycle/library_directory.py,sha256=Ywno93eVJH4sAtQ1dgHG2Pw9B3vw8fN8oAL0gn_l6OI,14836
@@ -106,10 +110,10 @@ griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/packa
106
110
  griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/sandbox.py,sha256=XgG7whE74zWDxX1pOvhASW0pwjOei1EDLvIH19xdzT0,6117
107
111
  griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance.py,sha256=cCGr-MQ1RlVBiUTZepYEKdVhPgC4ebcYrmpv8rI3VeM,894
108
112
  griptape_nodes/retained_mode/managers/library_lifecycle/library_status.py,sha256=K3UEBzAdCY9wphyBbLxDYP0Q43aYvhLZ_Pz7_SzcPec,443
109
- griptape_nodes/retained_mode/managers/library_manager.py,sha256=4wl1eDbwCyT8r8E1KBWvogWLycAnMR94_NC9iNWO6rE,100102
113
+ griptape_nodes/retained_mode/managers/library_manager.py,sha256=UWumU3HSLdECEhfUscOIredXZVrYympOzh4_c3V0rTM,100104
110
114
  griptape_nodes/retained_mode/managers/mcp_manager.py,sha256=BxNVDYUAn5-iylGzURqVZq1DRintrIK5T6q2X_rxm_U,15596
111
115
  griptape_nodes/retained_mode/managers/model_manager.py,sha256=tjrzCYaacFsmcTMplxt2IDis9hkrVa7wuu3NQq9Sba0,44519
112
- griptape_nodes/retained_mode/managers/node_manager.py,sha256=hgKHdhqE5qgJHAPEfCW4V4NlC3bjj1OW8e97KNGNuxw,152309
116
+ griptape_nodes/retained_mode/managers/node_manager.py,sha256=udPMF0OJWYQa0_D8CtDenFdIqpwWgk6Yqij8yQUoid4,159928
113
117
  griptape_nodes/retained_mode/managers/object_manager.py,sha256=NDbDSGI4PLU78xXBK0WGbk1Ejh5BN21I7dJOXbgl1bU,12814
114
118
  griptape_nodes/retained_mode/managers/operation_manager.py,sha256=lTkMZlaacTgtV5oV-YF6HG8xsx9V_LwX1eg074WTs2k,20137
115
119
  griptape_nodes/retained_mode/managers/os_manager.py,sha256=uQ0jRGXOimdmcdnwZUMAJnEdqvE33p7w5bBXjPN20fw,40128
@@ -122,23 +126,21 @@ griptape_nodes/retained_mode/managers/resource_manager.py,sha256=c1JETPMseisT1zu
122
126
  griptape_nodes/retained_mode/managers/resource_types/__init__.py,sha256=ganDZJriNgrxvLPs45X48XpLK8ifzljVpD95xeCPzO8,80
123
127
  griptape_nodes/retained_mode/managers/resource_types/cpu_resource.py,sha256=YHjU6_Pm41wGvdMlRzNkQS9yJY8wD2NN2-WwOFpVpUo,3830
124
128
  griptape_nodes/retained_mode/managers/resource_types/os_resource.py,sha256=ImgkOQI_br4yI3EY777D93NR20al8b4q9IocqWESjkw,3082
125
- griptape_nodes/retained_mode/managers/secrets_manager.py,sha256=tYiUpUhQYdpfu6Tvj98xGNHLc2ytSjH1tOshubD7BHI,6712
126
- griptape_nodes/retained_mode/managers/session_manager.py,sha256=fLjtBvgGY3daq1vbpJPXq069n35Z-Zr5dF3B0XyD2JY,11817
127
- griptape_nodes/retained_mode/managers/settings.py,sha256=6JuxKLQrk3nbkHjiQdJDnpFDadZAGRIn7jSEzGl3Nx4,11159
128
- griptape_nodes/retained_mode/managers/static_files_manager.py,sha256=f117cctpXh35TmXN8jzWNr1XFRzpkmqib9xkzNTay9U,11286
129
+ griptape_nodes/retained_mode/managers/secrets_manager.py,sha256=2DU2002dgr3XipnAhmjqLXH82ZFb8wlGpTWX8pl4f7E,7722
130
+ griptape_nodes/retained_mode/managers/session_manager.py,sha256=u3OEir9rjwG7GFM4MA5crKwcwq6F-lCUKlFzxlFU4co,14085
131
+ griptape_nodes/retained_mode/managers/settings.py,sha256=4wJte850nr_M4laXFbEjWkmN5Ysuo18t5fujBofktOc,9343
132
+ griptape_nodes/retained_mode/managers/static_files_manager.py,sha256=dDeX1Z5cmviNPkEBkF2MWYryLacJOh0TTpu-t7oCHps,11283
129
133
  griptape_nodes/retained_mode/managers/sync_manager.py,sha256=-m2krEh2YtGs8iAPc8bhFGX8JqjeM5kEV1rnCmcj_yk,21247
130
134
  griptape_nodes/retained_mode/managers/variable_manager.py,sha256=TnuqHSRK9Yiu_EtKxQksF9SyyQb72lbFQuTQZdpBxeE,24116
131
- griptape_nodes/retained_mode/managers/version_compatibility_manager.py,sha256=85gpl9WCgHbWNifxoiAidHmsXyqpUCTjuEW-FziFYME,8375
132
- griptape_nodes/retained_mode/managers/workflow_manager.py,sha256=aPg8M6FQZdMRvkGlhSqfiE5nzxxC_vKbtAo-Lv6h0j4,194792
135
+ griptape_nodes/retained_mode/managers/version_compatibility_manager.py,sha256=3GEsJs1yNub8NP_ZNBgUEbaqHJXte8-u3Uapim_x0OU,14709
136
+ griptape_nodes/retained_mode/managers/workflow_manager.py,sha256=eUrgBMLeKqpiU07-mMH3Z96vIflKWjXNnd-WCQbHftY,200444
133
137
  griptape_nodes/retained_mode/retained_mode.py,sha256=wGMkZX7clW7o4bA-t5ovPDK5cQaPQo_4_Yrvy4KxwL4,57615
134
138
  griptape_nodes/retained_mode/utils/__init__.py,sha256=W5dvv8YwvVVq_8eVTgMd3Z_VB_Dtq1sIIVq8745QH_I,52
135
- griptape_nodes/retained_mode/utils/engine_identity.py,sha256=PZmdlYM69-B-6Z1F4iJfZyVm2twJY5cSGoiUJCMj0xU,7846
136
139
  griptape_nodes/retained_mode/utils/name_generator.py,sha256=IZLahtfP3XC79XApLdGoZ0IKKUkgiITpd16RK7NbyEs,2524
137
140
  griptape_nodes/retained_mode/variable_types.py,sha256=GVrSWMB3gEDAufSPOBXbNfIRhA9M43MoxpqLyuIg_HE,435
138
141
  griptape_nodes/servers/__init__.py,sha256=JCmorB8tQUu_kQ8hSRhgw4VsOqsC0iZjZ-mCXYy9ZOQ,60
139
- griptape_nodes/servers/mcp.py,sha256=U0ecgKR64D2qyzpkZcOdpxQwCdhmg5SjVQYEP-qfud0,5214
142
+ griptape_nodes/servers/mcp.py,sha256=du0xBErKpAMS2sbe8HBTAHUhii4BmBGK-7-pbLOs--U,5452
140
143
  griptape_nodes/servers/static.py,sha256=j-RiY10i8OhQRYi22eeq5rZ7I2An-DzIPA96rF5Tm4o,6975
141
- griptape_nodes/servers/ws_request_manager.py,sha256=UpXOKNq_VauQmJ0Rx0C7OrzcwjeCoDfjpx3IE38NgsE,10949
142
144
  griptape_nodes/traits/__init__.py,sha256=bTLXTiZTJz2z15RRLoPI4nvLnNW9FiLcKL_2pT4E10g,32
143
145
  griptape_nodes/traits/add_param_button.py,sha256=27RZDVLMD0HmRF6hjfz7iV7LBau92vMc_d2eD2Ey8fA,649
144
146
  griptape_nodes/traits/button.py,sha256=cnI2YXYpz9Y3WlmZW64IgaTISRBwbGKMmM65wf1W8p0,13422
@@ -157,8 +159,8 @@ griptape_nodes/traits/traits.json,sha256=JwFsOaFfLeR1ohcyh6XApc5N2-mWMPGSaYbpA-m
157
159
  griptape_nodes/updater/__init__.py,sha256=eWalSt_N5a0RPT2YkXeIee_YPiCL47OB0G9GB0gn3pY,2522
158
160
  griptape_nodes/updater/__main__.py,sha256=lhMMctbBeni57ximitvkwqJ1TQzk79Jg9w0rkKjtp5Y,79
159
161
  griptape_nodes/utils/__init__.py,sha256=kzDZW_VPyxWJFonM3kYTl7A91_JmtHPK0Io4KPLTYT4,122
160
- griptape_nodes/utils/async_utils.py,sha256=iHv67wIZFySh4MP84SKIw59dQ0pqm8HaFiKx6TxT7wI,3461
161
- griptape_nodes/utils/dict_utils.py,sha256=kyli5MOfzSor0a8lmXfYBVS_NXGf6UK1SM6k_Qn5bs8,6889
162
+ griptape_nodes/utils/async_utils.py,sha256=4IrW8Ub8iJ2QB9yguZtfN1EB9B5nXHS7jbDaLOHWso0,4844
163
+ griptape_nodes/utils/dict_utils.py,sha256=1VP2EoyOP0nswoAgjPehpA0izpkygWRX7L--ArN6LV8,7314
162
164
  griptape_nodes/utils/image_preview.py,sha256=NhYIqohRF9vbFpWIEvZHdPLLPK_JdUBvC4RvNAsSa1w,4480
163
165
  griptape_nodes/utils/metaclasses.py,sha256=RSKyAvZppH_hbMugmUmIr8QqOg1sYY4uRNfQybD4O8Q,287
164
166
  griptape_nodes/utils/uv_utils.py,sha256=ZK37LmacKfxMVKkcIOyJ35HOXgV6sFWE9CzgKPmaRU0,519
@@ -166,11 +168,11 @@ griptape_nodes/utils/version_utils.py,sha256=Y-HJfJW6Jxuz_jOnHxMiy-pmMauHRnY-7BO
166
168
  griptape_nodes/version_compatibility/__init__.py,sha256=JMz1sB7Zsj6pS1S5sdsPR0kn89s1A0sB0kFIvygJYfo,74
167
169
  griptape_nodes/version_compatibility/versions/__init__.py,sha256=PWSxM28LPUdBdRPA98j4RUWvuZ4NqfX1day2VU6SqPw,74
168
170
  griptape_nodes/version_compatibility/versions/v0_39_0/__init__.py,sha256=21iKlFpsmBW4WsAexSD0WMAJnsYmMq2sIbDeYC831fc,62
169
- griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_removal.py,sha256=z4hXUeZNSlkJ7xwG6HRJISeWA7iAtZLKQhTiTvyhSwk,5262
171
+ griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_removal.py,sha256=nYGBKDDXIPerHBD15VSwUzXWr7O2dyqRufhAkj5ftpg,5357
170
172
  griptape_nodes/version_compatibility/workflow_versions/__init__.py,sha256=z5XDgkizoNByCXpyo34hfsJKFsWlOHbD6hgzfYH9ubc,52
171
173
  griptape_nodes/version_compatibility/workflow_versions/v0_7_0/__init__.py,sha256=IzPPmGK86h2swfGGTOHyVcBIlOng6SjgWQzlbf3ngmo,51
172
- griptape_nodes/version_compatibility/workflow_versions/v0_7_0/local_executor_argument_addition.py,sha256=9PclAp_Mm5IPtd5yj5XSS5-x7QYmifvhTly20CgBZmo,2018
173
- griptape_nodes-0.57.0.dist-info/WHEEL,sha256=-neZj6nU9KAMg2CnCY6T3w8J53nx1kFGw_9HfoSzM60,79
174
- griptape_nodes-0.57.0.dist-info/entry_points.txt,sha256=qvevqd3BVbAV5TcantnAm0ouqaqYKhsRO3pkFymWLWM,82
175
- griptape_nodes-0.57.0.dist-info/METADATA,sha256=ysmbxz6mjxtOqJONhtdzPxeZZffiL05JNhqSqjQrrsk,5039
176
- griptape_nodes-0.57.0.dist-info/RECORD,,
174
+ griptape_nodes/version_compatibility/workflow_versions/v0_7_0/local_executor_argument_addition.py,sha256=Y8n1wzI5a-ZCHK5eiwtnnD3zF5lN-52R67rxYn0hxyI,2069
175
+ griptape_nodes-0.58.0.dist-info/WHEEL,sha256=I8-bO5cg2sb8TH6ZM6EgCP87Y1cV_f9UGgWnfAhVOZI,78
176
+ griptape_nodes-0.58.0.dist-info/entry_points.txt,sha256=qvevqd3BVbAV5TcantnAm0ouqaqYKhsRO3pkFymWLWM,82
177
+ griptape_nodes-0.58.0.dist-info/METADATA,sha256=zbvjKxo7pKYzffX1nvD4ZEio6pn7JPn3cf43sq4Gz9Y,5076
178
+ griptape_nodes-0.58.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.8.22
2
+ Generator: uv 0.9.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,245 +0,0 @@
1
- """Manages engine identity for multiple engines per machine.
2
-
3
- Handles engine ID, name storage, and generation for unique engine identification.
4
- Supports multiple engines with selection via GTN_ENGINE_ID environment variable.
5
- """
6
-
7
- import json
8
- import os
9
- import uuid
10
- from datetime import UTC, datetime
11
- from pathlib import Path
12
-
13
- from xdg_base_dirs import xdg_data_home
14
-
15
- from .name_generator import generate_engine_name
16
-
17
-
18
- class EngineIdentity:
19
- """Manages engine identity for multiple engines per machine."""
20
-
21
- _ENGINE_DATA_FILE = "engines.json"
22
-
23
- @classmethod
24
- def _get_engine_data_dir(cls) -> Path:
25
- """Get the XDG data directory for engine identity storage."""
26
- return xdg_data_home() / "griptape_nodes"
27
-
28
- @classmethod
29
- def _get_engine_data_file(cls) -> Path:
30
- """Get the path to the engine data storage file."""
31
- return cls._get_engine_data_dir() / cls._ENGINE_DATA_FILE
32
-
33
- @classmethod
34
- def _load_engines_data(cls) -> dict:
35
- """Load engines data from storage.
36
-
37
- Returns:
38
- dict: Engines data structure with engines array and default_engine_id
39
- """
40
- engine_data_file = cls._get_engine_data_file()
41
-
42
- if engine_data_file.exists():
43
- try:
44
- with engine_data_file.open("r") as f:
45
- data = json.load(f)
46
- if isinstance(data, dict) and "engines" in data:
47
- return data
48
- except (json.JSONDecodeError, OSError):
49
- pass
50
-
51
- return {"engines": [], "default_engine_id": None}
52
-
53
- @classmethod
54
- def _save_engines_data(cls, engines_data: dict) -> None:
55
- """Save engines data to storage.
56
-
57
- Args:
58
- engines_data: Engines data structure to save
59
- """
60
- engine_data_dir = cls._get_engine_data_dir()
61
- engine_data_dir.mkdir(parents=True, exist_ok=True)
62
-
63
- engine_data_file = cls._get_engine_data_file()
64
- with engine_data_file.open("w") as f:
65
- json.dump(engines_data, f, indent=2)
66
-
67
- @classmethod
68
- def _get_selected_engine_id(cls) -> str | None:
69
- """Get the selected engine ID from environment variable or default.
70
-
71
- Returns:
72
- str | None: The selected engine ID or None if not specified
73
- """
74
- return os.getenv("GTN_ENGINE_ID")
75
-
76
- @classmethod
77
- def _find_engine_by_id(cls, engines_data: dict, engine_id: str) -> dict | None:
78
- """Find an engine by ID in the engines data.
79
-
80
- Args:
81
- engines_data: The engines data structure
82
- engine_id: The engine ID to find
83
-
84
- Returns:
85
- dict | None: The engine data if found, None otherwise
86
- """
87
- for engine in engines_data.get("engines", []):
88
- if engine.get("id") == engine_id:
89
- return engine
90
- return None
91
-
92
- @classmethod
93
- def get_engine_data(cls) -> dict:
94
- """Get the current engine data, creating default if it doesn't exist.
95
-
96
- Returns:
97
- dict: The current engine data
98
- """
99
- engines_data = cls._load_engines_data()
100
-
101
- # Determine which engine to use
102
- selected_engine_id = cls._get_selected_engine_id()
103
-
104
- if selected_engine_id:
105
- # Use specified engine ID
106
- engine_data = cls._find_engine_by_id(engines_data, selected_engine_id)
107
- if engine_data:
108
- return engine_data
109
- # If specified engine not found, create it
110
- engine_data = {
111
- "id": selected_engine_id,
112
- "name": generate_engine_name(),
113
- "created_at": datetime.now(tz=UTC).isoformat(),
114
- }
115
- else:
116
- # Use default engine (first one) or create new one
117
- if engines_data.get("engines"):
118
- default_id = engines_data.get("default_engine_id")
119
- if default_id:
120
- engine_data = cls._find_engine_by_id(engines_data, default_id)
121
- if engine_data:
122
- return engine_data
123
- # Fall back to first engine
124
- return engines_data["engines"][0]
125
-
126
- # Create new engine
127
- engine_data = {
128
- "id": str(uuid.uuid4()),
129
- "name": generate_engine_name(),
130
- "created_at": datetime.now(tz=UTC).isoformat(),
131
- }
132
-
133
- # Add or update engine in the data structure
134
- cls._add_or_update_engine(engine_data)
135
- return engine_data
136
-
137
- @classmethod
138
- def _add_or_update_engine(cls, engine_data: dict) -> None:
139
- """Add or update an engine in the engines data structure.
140
-
141
- Args:
142
- engine_data: The engine data to add or update
143
- """
144
- engines_data = cls._load_engines_data()
145
-
146
- # Find existing engine
147
- engine_id = engine_data["id"]
148
- existing_engine = cls._find_engine_by_id(engines_data, engine_id)
149
-
150
- if existing_engine:
151
- # Update existing engine
152
- existing_engine.update(engine_data)
153
- existing_engine["updated_at"] = datetime.now(tz=UTC).isoformat()
154
- else:
155
- # Add new engine
156
- engines_data.setdefault("engines", []).append(engine_data)
157
-
158
- # Set as default if it's the first engine
159
- if not engines_data.get("default_engine_id") and len(engines_data["engines"]) == 1:
160
- engines_data["default_engine_id"] = engine_id
161
-
162
- cls._save_engines_data(engines_data)
163
-
164
- @classmethod
165
- def get_engine_id(cls) -> str:
166
- """Get the engine ID.
167
-
168
- Returns:
169
- str: The engine ID (UUID)
170
- """
171
- engine_data = cls.get_engine_data()
172
- return engine_data["id"]
173
-
174
- @classmethod
175
- def get_engine_name(cls) -> str:
176
- """Get the engine name.
177
-
178
- Returns:
179
- str: The engine name
180
- """
181
- engine_data = cls.get_engine_data()
182
- return engine_data["name"]
183
-
184
- @classmethod
185
- def set_engine_name(cls, engine_name: str) -> None:
186
- """Set and persist the current engine name.
187
-
188
- Args:
189
- engine_name: The new engine name to set
190
- """
191
- # Get current engine data
192
- engine_data = cls.get_engine_data()
193
-
194
- # Update the name
195
- engine_data["name"] = engine_name
196
- engine_data["updated_at"] = datetime.now(tz=UTC).isoformat()
197
-
198
- # Save updated engine data
199
- cls._add_or_update_engine(engine_data)
200
-
201
- @classmethod
202
- def get_all_engines(cls) -> list[dict]:
203
- """Get all registered engines.
204
-
205
- Returns:
206
- list[dict]: List of all engine data
207
- """
208
- engines_data = cls._load_engines_data()
209
- return engines_data.get("engines", [])
210
-
211
- @classmethod
212
- def get_default_engine_id(cls) -> str | None:
213
- """Get the default engine ID.
214
-
215
- Returns:
216
- str | None: The default engine ID or None if not set
217
- """
218
- engines_data = cls._load_engines_data()
219
- return engines_data.get("default_engine_id")
220
-
221
- @classmethod
222
- def set_default_engine_id(cls, engine_id: str) -> None:
223
- """Set the default engine ID.
224
-
225
- Args:
226
- engine_id: The engine ID to set as default
227
- """
228
- engines_data = cls._load_engines_data()
229
-
230
- # Verify the engine exists
231
- if cls._find_engine_by_id(engines_data, engine_id):
232
- engines_data["default_engine_id"] = engine_id
233
- cls._save_engines_data(engines_data)
234
- else:
235
- msg = f"Engine with ID {engine_id} not found"
236
- raise ValueError(msg)
237
-
238
- @classmethod
239
- def get_engine_data_file_path(cls) -> Path:
240
- """Get the path where engine data is stored (for debugging/inspection).
241
-
242
- Returns:
243
- Path: The path to the engine data file
244
- """
245
- return cls._get_engine_data_file()