griptape-nodes 0.57.1__py3-none-any.whl → 0.58.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.
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.1.dist-info → griptape_nodes-0.58.1.dist-info}/METADATA +4 -3
  47. {griptape_nodes-0.57.1.dist-info → griptape_nodes-0.58.1.dist-info}/RECORD +49 -47
  48. {griptape_nodes-0.57.1.dist-info → griptape_nodes-0.58.1.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.1.dist-info → griptape_nodes-0.58.1.dist-info}/entry_points.txt +0 -0
@@ -1,10 +1,21 @@
1
+ from __future__ import annotations
2
+
1
3
  from dataclasses import dataclass, field
2
4
  from enum import Enum, auto
3
- from typing import Any, NamedTuple, NewType
5
+ from typing import TYPE_CHECKING, Any, NamedTuple, NewType
4
6
  from uuid import uuid4
5
7
 
6
- from griptape_nodes.exe_types.core_types import NodeMessagePayload
7
- from griptape_nodes.exe_types.node_types import NodeDependencies, NodeResolutionState
8
+ from griptape_nodes.exe_types.node_types import NodeResolutionState
9
+
10
+ if TYPE_CHECKING:
11
+ from griptape_nodes.exe_types.core_types import NodeMessagePayload
12
+ from griptape_nodes.exe_types.node_types import NodeDependencies
13
+ from griptape_nodes.retained_mode.events.connection_events import ListConnectionsForNodeResultSuccess
14
+ from griptape_nodes.retained_mode.events.parameter_events import (
15
+ GetParameterDetailsResultSuccess,
16
+ GetParameterValueResultSuccess,
17
+ SetParameterValueRequest,
18
+ )
8
19
  from griptape_nodes.retained_mode.events.base_events import (
9
20
  RequestPayload,
10
21
  ResultPayloadFailure,
@@ -12,12 +23,6 @@ from griptape_nodes.retained_mode.events.base_events import (
12
23
  WorkflowAlteredMixin,
13
24
  WorkflowNotAlteredMixin,
14
25
  )
15
- from griptape_nodes.retained_mode.events.connection_events import ListConnectionsForNodeResultSuccess
16
- from griptape_nodes.retained_mode.events.parameter_events import (
17
- GetParameterDetailsResultSuccess,
18
- GetParameterValueResultSuccess,
19
- SetParameterValueRequest,
20
- )
21
26
  from griptape_nodes.retained_mode.events.payload_registry import PayloadRegistry
22
27
 
23
28
 
@@ -430,7 +435,7 @@ class SerializedNodeCommands:
430
435
  """
431
436
 
432
437
  set_parameter_value_command: SetParameterValueRequest
433
- unique_value_uuid: "SerializedNodeCommands.UniqueParameterValueUUID"
438
+ unique_value_uuid: SerializedNodeCommands.UniqueParameterValueUUID
434
439
 
435
440
  create_node_command: CreateNodeRequest
436
441
  element_modification_commands: list[RequestPayload]
@@ -573,12 +578,14 @@ class SerializeSelectedNodesToCommandsRequest(WorkflowNotAlteredMixin, RequestPa
573
578
 
574
579
  Args:
575
580
  nodes_to_serialize: List of node identifiers (each containing [node_name, timestamp])
581
+ copy_to_clipboard: Whether to copy the result to clipboard (defaults to True for backward compatibility)
576
582
 
577
583
  Results: SerializeSelectedNodesToCommandsResultSuccess (with commands) | SerializeSelectedNodesToCommandsResultFailure (node not found, serialization error)
578
584
  """
579
585
 
580
586
  # They will be passed with node_name, timestamp
581
587
  nodes_to_serialize: list[list[str]]
588
+ copy_to_clipboard: bool = True
582
589
 
583
590
 
584
591
  @dataclass
@@ -278,12 +278,14 @@ class SaveWorkflowRequest(RequestPayload):
278
278
  Args:
279
279
  file_name: Name of the file to save the workflow to (None for auto-generated)
280
280
  image_path: Path to save workflow image/thumbnail (None for no image)
281
+ pickle_control_flow_result: Whether to use pickle-based serialization for control flow results (None for default behavior)
281
282
 
282
283
  Results: SaveWorkflowResultSuccess (with file path) | SaveWorkflowResultFailure (save error)
283
284
  """
284
285
 
285
286
  file_name: str | None = None
286
287
  image_path: str | None = None
288
+ pickle_control_flow_result: bool | None = None
287
289
 
288
290
 
289
291
  @dataclass
@@ -388,6 +390,7 @@ class PublishWorkflowRequest(RequestPayload):
388
390
  publisher_name: str
389
391
  execute_on_publish: bool = False
390
392
  published_workflow_file_name: str | None = None
393
+ pickle_control_flow_result: bool = False
391
394
 
392
395
 
393
396
  @dataclass
@@ -655,6 +658,7 @@ class SaveWorkflowFileFromSerializedFlowRequest(RequestPayload):
655
658
  branched_from: Optional branched from information to preserve workflow lineage
656
659
  workflow_shape: Optional workflow shape defining inputs and outputs for external callers
657
660
  file_path: Optional specific file path to use (defaults to workspace path if not provided)
661
+ pickle_control_flow_result: Whether to pickle control flow results in generated execution code (defaults to False)
658
662
 
659
663
  Results: SaveWorkflowFileFromSerializedFlowResultSuccess (with file path) | SaveWorkflowFileFromSerializedFlowResultFailure (save error)
660
664
  """
@@ -667,6 +671,7 @@ class SaveWorkflowFileFromSerializedFlowRequest(RequestPayload):
667
671
  execution_flow_name: str | None = None
668
672
  branched_from: str | None = None
669
673
  workflow_shape: WorkflowShape | None = None
674
+ pickle_control_flow_result: bool = False
670
675
 
671
676
 
672
677
  @dataclass
@@ -2,42 +2,23 @@ from __future__ import annotations
2
2
 
3
3
  import logging
4
4
  import os
5
- import re
6
- import uuid
7
- from dataclasses import dataclass
8
5
  from datetime import UTC, datetime
9
6
  from typing import TYPE_CHECKING, Any
10
7
 
8
+ import semver
9
+
11
10
  from griptape_nodes.exe_types.flow import ControlFlow
12
11
  from griptape_nodes.node_library.workflow_registry import WorkflowRegistry
13
12
  from griptape_nodes.retained_mode.events.app_events import (
14
- AppConnectionEstablished,
15
- AppEndSessionRequest,
16
- AppEndSessionResultFailure,
17
- AppEndSessionResultSuccess,
18
- AppGetSessionRequest,
19
- AppGetSessionResultSuccess,
20
- AppStartSessionRequest,
21
- AppStartSessionResultSuccess,
22
13
  EngineHeartbeatRequest,
23
14
  EngineHeartbeatResultFailure,
24
15
  EngineHeartbeatResultSuccess,
25
- GetEngineNameRequest,
26
- GetEngineNameResultFailure,
27
- GetEngineNameResultSuccess,
28
16
  GetEngineVersionRequest,
29
17
  GetEngineVersionResultFailure,
30
18
  GetEngineVersionResultSuccess,
31
- SessionHeartbeatRequest,
32
- SessionHeartbeatResultFailure,
33
- SessionHeartbeatResultSuccess,
34
- SetEngineNameRequest,
35
- SetEngineNameResultFailure,
36
- SetEngineNameResultSuccess,
37
19
  )
38
20
  from griptape_nodes.retained_mode.events.base_events import (
39
21
  GriptapeNodeEvent,
40
- ResultDetails,
41
22
  ResultPayloadFailure,
42
23
  )
43
24
  from griptape_nodes.retained_mode.events.flow_events import (
@@ -89,48 +70,6 @@ if TYPE_CHECKING:
89
70
  logger = logging.getLogger("griptape_nodes")
90
71
 
91
72
 
92
- @dataclass
93
- class Version:
94
- major: int
95
- minor: int
96
- patch: int
97
-
98
- @classmethod
99
- def from_string(cls, version_string: str) -> Version | None:
100
- match = re.match(r"(\d+)\.(\d+)\.(\d+)", version_string)
101
- if match:
102
- major, minor, patch = map(int, match.groups())
103
- return cls(major, minor, patch)
104
- return None
105
-
106
- def __str__(self) -> str:
107
- return f"{self.major}.{self.minor}.{self.patch}"
108
-
109
- def __lt__(self, other: Version) -> bool:
110
- """Less than comparison."""
111
- return (self.major, self.minor, self.patch) < (other.major, other.minor, other.patch)
112
-
113
- def __le__(self, other: Version) -> bool:
114
- """Less than or equal comparison."""
115
- return (self.major, self.minor, self.patch) <= (other.major, other.minor, other.patch)
116
-
117
- def __gt__(self, other: Version) -> bool:
118
- """Greater than comparison."""
119
- return (self.major, self.minor, self.patch) > (other.major, other.minor, other.patch)
120
-
121
- def __ge__(self, other: Version) -> bool:
122
- """Greater than or equal comparison."""
123
- return (self.major, self.minor, self.patch) >= (other.major, other.minor, other.patch)
124
-
125
- def __eq__(self, other: Version) -> bool: # type: ignore[override]
126
- """Equality comparison."""
127
- return (self.major, self.minor, self.patch) == (other.major, other.minor, other.patch)
128
-
129
- def __hash__(self) -> int:
130
- """Hash function for Version."""
131
- return hash((self.major, self.minor, self.patch))
132
-
133
-
134
73
  class GriptapeNodes(metaclass=SingletonMeta):
135
74
  _event_manager: EventManager
136
75
  _os_manager: OSManager
@@ -155,7 +94,7 @@ class GriptapeNodes(metaclass=SingletonMeta):
155
94
  _resource_manager: ResourceManager
156
95
  _sync_manager: SyncManager
157
96
 
158
- def __init__(self) -> None: # noqa: PLR0915
97
+ def __init__(self) -> None:
159
98
  from griptape_nodes.retained_mode.managers.agent_manager import AgentManager
160
99
  from griptape_nodes.retained_mode.managers.arbitrary_code_exec_manager import (
161
100
  ArbitraryCodeExecManager,
@@ -213,8 +152,8 @@ class GriptapeNodes(metaclass=SingletonMeta):
213
152
  )
214
153
  self._agent_manager = AgentManager(self._static_files_manager, self._event_manager)
215
154
  self._version_compatibility_manager = VersionCompatibilityManager(self._event_manager)
216
- self._session_manager = SessionManager(self._event_manager)
217
155
  self._engine_identity_manager = EngineIdentityManager(self._event_manager)
156
+ self._session_manager = SessionManager(self._engine_identity_manager, self._event_manager)
218
157
  self._mcp_manager = MCPManager(self._event_manager, self._config_manager)
219
158
  self._sync_manager = SyncManager(self._event_manager, self._config_manager)
220
159
 
@@ -222,24 +161,9 @@ class GriptapeNodes(metaclass=SingletonMeta):
222
161
  self._event_manager.assign_manager_to_request_type(
223
162
  GetEngineVersionRequest, self.handle_engine_version_request
224
163
  )
225
- self._event_manager.assign_manager_to_request_type(
226
- AppStartSessionRequest, self.handle_session_start_request
227
- )
228
- self._event_manager.assign_manager_to_request_type(AppEndSessionRequest, self.handle_session_end_request)
229
- self._event_manager.add_listener_to_app_event(AppConnectionEstablished, self.on_app_connection_established)
230
- self._event_manager.assign_manager_to_request_type(AppGetSessionRequest, self.handle_get_session_request)
231
- self._event_manager.assign_manager_to_request_type(
232
- SessionHeartbeatRequest, self.handle_session_heartbeat_request
233
- )
234
164
  self._event_manager.assign_manager_to_request_type(
235
165
  EngineHeartbeatRequest, self.handle_engine_heartbeat_request
236
166
  )
237
- self._event_manager.assign_manager_to_request_type(
238
- GetEngineNameRequest, self.handle_get_engine_name_request
239
- )
240
- self._event_manager.assign_manager_to_request_type(
241
- SetEngineNameRequest, self.handle_set_engine_name_request
242
- )
243
167
 
244
168
  @classmethod
245
169
  def get_instance(cls) -> GriptapeNodes:
@@ -304,11 +228,11 @@ class GriptapeNodes(metaclass=SingletonMeta):
304
228
 
305
229
  @classmethod
306
230
  def get_session_id(cls) -> str | None:
307
- return GriptapeNodes.SessionManager().get_active_session_id()
231
+ return GriptapeNodes.SessionManager().active_session_id
308
232
 
309
233
  @classmethod
310
234
  def get_engine_id(cls) -> str | None:
311
- return GriptapeNodes.EngineIdentityManager().get_active_engine_id()
235
+ return GriptapeNodes.EngineIdentityManager().active_engine_id
312
236
 
313
237
  @classmethod
314
238
  def EventManager(cls) -> EventManager:
@@ -421,113 +345,20 @@ class GriptapeNodes(metaclass=SingletonMeta):
421
345
  msg = "Failed to successfully delete all objects"
422
346
  raise ValueError(msg)
423
347
 
424
- async def on_app_connection_established(self, _payload: AppConnectionEstablished) -> None:
425
- from griptape_nodes.app.app import subscribe_to_topic
426
-
427
- # Subscribe to request topic (engine discovery)
428
- await subscribe_to_topic("request")
429
-
430
- # Get engine ID and subscribe to engine_id/request
431
- engine_id = GriptapeNodes.get_engine_id()
432
- if engine_id:
433
- await subscribe_to_topic(f"engines/{engine_id}/request")
434
- else:
435
- logger.warning("Engine ID not available for subscription")
436
-
437
- # Get session ID and subscribe to session_id/request if available
438
- session_id = GriptapeNodes.get_session_id()
439
- if session_id:
440
- topic = f"sessions/{session_id}/request"
441
- await subscribe_to_topic(topic)
442
- else:
443
- logger.info("No session ID available for subscription")
444
-
445
348
  def handle_engine_version_request(self, request: GetEngineVersionRequest) -> ResultPayload: # noqa: ARG002
446
349
  try:
447
- engine_ver = Version.from_string(engine_version)
448
- if engine_ver:
449
- return GetEngineVersionResultSuccess(
450
- major=engine_ver.major,
451
- minor=engine_ver.minor,
452
- patch=engine_ver.patch,
453
- result_details="Engine version retrieved successfully.",
454
- )
455
- details = f"Attempted to get engine version. Failed because version string '{engine_ver}' wasn't in expected major.minor.patch format."
456
- logger.error(details)
457
- return GetEngineVersionResultFailure(result_details=details)
350
+ engine_ver = semver.VersionInfo.parse(engine_version)
351
+ return GetEngineVersionResultSuccess(
352
+ major=engine_ver.major,
353
+ minor=engine_ver.minor,
354
+ patch=engine_ver.patch,
355
+ result_details="Engine version retrieved successfully.",
356
+ )
458
357
  except Exception as err:
459
358
  details = f"Attempted to get engine version. Failed due to '{err}'."
460
359
  logger.error(details)
461
360
  return GetEngineVersionResultFailure(result_details=details)
462
361
 
463
- async def handle_session_start_request(self, request: AppStartSessionRequest) -> ResultPayload: # noqa: ARG002
464
- from griptape_nodes.app.app import subscribe_to_topic
465
-
466
- current_session_id = GriptapeNodes.SessionManager().get_active_session_id()
467
- if current_session_id is None:
468
- # Client wants a new session
469
- current_session_id = uuid.uuid4().hex
470
- GriptapeNodes.SessionManager().save_session(current_session_id)
471
- details = f"New session '{current_session_id}' started at {datetime.now(tz=UTC)}."
472
- logger.info(details)
473
- else:
474
- details = f"Session '{current_session_id}' already active. Joining..."
475
-
476
- topic = f"sessions/{current_session_id}/request"
477
- await subscribe_to_topic(topic)
478
- logger.info("Subscribed to new session topic: %s", topic)
479
-
480
- return AppStartSessionResultSuccess(current_session_id, result_details="Session started successfully.")
481
-
482
- async def handle_session_end_request(self, _: AppEndSessionRequest) -> ResultPayload:
483
- from griptape_nodes.app.app import unsubscribe_from_topic
484
-
485
- try:
486
- previous_session_id = GriptapeNodes.SessionManager().get_active_session_id()
487
- if previous_session_id is None:
488
- details = "No active session to end."
489
- logger.info(details)
490
- else:
491
- details = f"Session '{previous_session_id}' ended at {datetime.now(tz=UTC)}."
492
- logger.info(details)
493
- GriptapeNodes.SessionManager().clear_saved_session()
494
-
495
- unsubscribe_topic = f"sessions/{previous_session_id}/request"
496
- await unsubscribe_from_topic(unsubscribe_topic)
497
-
498
- return AppEndSessionResultSuccess(
499
- session_id=previous_session_id, result_details="Session ended successfully."
500
- )
501
- except Exception as err:
502
- details = f"Failed to end session due to '{err}'."
503
- logger.error(details)
504
- return AppEndSessionResultFailure(result_details=details)
505
-
506
- def handle_get_session_request(self, _: AppGetSessionRequest) -> ResultPayload:
507
- return AppGetSessionResultSuccess(
508
- session_id=GriptapeNodes.SessionManager().get_active_session_id(),
509
- result_details="Session ID retrieved successfully.",
510
- )
511
-
512
- def handle_session_heartbeat_request(self, request: SessionHeartbeatRequest) -> ResultPayload: # noqa: ARG002
513
- """Handle session heartbeat requests.
514
-
515
- Simply verifies that the session is active and responds with success.
516
- """
517
- try:
518
- active_session_id = GriptapeNodes.SessionManager().get_active_session_id()
519
- if active_session_id is None:
520
- details = "Session heartbeat received but no active session found"
521
- logger.warning(details)
522
- return SessionHeartbeatResultFailure(result_details=details)
523
-
524
- details = f"Session heartbeat successful for session: {active_session_id}"
525
- return SessionHeartbeatResultSuccess(result_details=details)
526
- except Exception as err:
527
- details = f"Failed to handle session heartbeat: {err}"
528
- logger.error(details)
529
- return SessionHeartbeatResultFailure(result_details=details)
530
-
531
362
  def handle_engine_heartbeat_request(self, request: EngineHeartbeatRequest) -> ResultPayload:
532
363
  """Handle engine heartbeat requests.
533
364
 
@@ -541,14 +372,14 @@ class GriptapeNodes(metaclass=SingletonMeta):
541
372
  workflow_info = self._get_current_workflow_info()
542
373
 
543
374
  # Get engine name
544
- engine_name = GriptapeNodes.EngineIdentityManager().get_engine_name()
375
+ engine_name = GriptapeNodes.EngineIdentityManager().engine_name
545
376
 
546
377
  return EngineHeartbeatResultSuccess(
547
378
  heartbeat_id=request.heartbeat_id,
548
379
  engine_version=engine_version,
549
380
  engine_name=engine_name,
550
- engine_id=GriptapeNodes.EngineIdentityManager().get_active_engine_id(),
551
- session_id=GriptapeNodes.SessionManager().get_active_session_id(),
381
+ engine_id=GriptapeNodes.EngineIdentityManager().active_engine_id,
382
+ session_id=GriptapeNodes.SessionManager().active_session_id,
552
383
  timestamp=datetime.now(tz=UTC).isoformat(),
553
384
  result_details="Engine heartbeat successful",
554
385
  **instance_info,
@@ -559,40 +390,6 @@ class GriptapeNodes(metaclass=SingletonMeta):
559
390
  logger.error(details)
560
391
  return EngineHeartbeatResultFailure(heartbeat_id=request.heartbeat_id, result_details=details)
561
392
 
562
- def handle_get_engine_name_request(self, request: GetEngineNameRequest) -> ResultPayload: # noqa: ARG002
563
- """Handle requests to get the current engine name."""
564
- try:
565
- engine_name = GriptapeNodes.EngineIdentityManager().get_engine_name()
566
- return GetEngineNameResultSuccess(
567
- engine_name=engine_name, result_details="Engine name retrieved successfully."
568
- )
569
- except Exception as err:
570
- error_message = f"Failed to get engine name: {err}"
571
- logger.error(error_message)
572
- return GetEngineNameResultFailure(error_message=error_message, result_details=error_message)
573
-
574
- def handle_set_engine_name_request(self, request: SetEngineNameRequest) -> ResultPayload:
575
- """Handle requests to set a new engine name."""
576
- try:
577
- # Validate engine name (basic validation)
578
- if not request.engine_name or not request.engine_name.strip():
579
- error_message = "Engine name cannot be empty"
580
- logger.warning(error_message)
581
- return SetEngineNameResultFailure(error_message=error_message, result_details=error_message)
582
-
583
- # Set the new engine name
584
- GriptapeNodes.EngineIdentityManager().set_engine_name(request.engine_name.strip())
585
- details = f"Engine name set to: {request.engine_name.strip()}"
586
- return SetEngineNameResultSuccess(
587
- engine_name=request.engine_name.strip(),
588
- result_details=ResultDetails(message=details, level=logging.INFO),
589
- )
590
-
591
- except Exception as err:
592
- error_message = f"Failed to set engine name: {err}"
593
- logger.error(error_message)
594
- return SetEngineNameResultFailure(error_message=error_message, result_details=error_message)
595
-
596
393
  def _get_instance_info(self) -> dict[str, str | None]:
597
394
  """Get instance information from environment variables.
598
395
 
@@ -9,7 +9,6 @@ from pydantic import ValidationError
9
9
  from xdg_base_dirs import xdg_config_home
10
10
 
11
11
  from griptape_nodes.node_library.library_registry import LibraryRegistry
12
- from griptape_nodes.retained_mode.events.app_events import AppInitializationComplete
13
12
  from griptape_nodes.retained_mode.events.base_events import ResultPayload
14
13
  from griptape_nodes.retained_mode.events.config_events import (
15
14
  GetConfigCategoryRequest,
@@ -91,11 +90,6 @@ class ConfigManager:
91
90
  )
92
91
  event_manager.assign_manager_to_request_type(ResetConfigRequest, self.on_handle_reset_config_request)
93
92
 
94
- event_manager.add_listener_to_app_event(
95
- AppInitializationComplete,
96
- self.on_app_initialization_complete,
97
- )
98
-
99
93
  @property
100
94
  def workspace_path(self) -> Path:
101
95
  """Get the base file path from the configuration.
@@ -231,34 +225,6 @@ class ConfigManager:
231
225
  )
232
226
  self.load_configs()
233
227
 
234
- def on_app_initialization_complete(self, _payload: AppInitializationComplete) -> None:
235
- # We want to ensure that all environment variables from here are pre-filled in the secrets manager.
236
- env_var_names = self.gather_env_var_names()
237
- for env_var_name in env_var_names:
238
- self._update_secret_from_env_var(env_var_name)
239
-
240
- def gather_env_var_names(self) -> list[str]:
241
- """Gather all environment variable names within the config."""
242
- return self._gather_env_var_names_in_dict(self.merged_config)
243
-
244
- def _gather_env_var_names_in_dict(self, config: dict) -> list[str]:
245
- """Gather all environment variable names from a given config dictionary."""
246
- env_var_names = []
247
- for value in config.values():
248
- if isinstance(value, dict):
249
- env_var_names.extend(self._gather_env_var_names_in_dict(value))
250
- elif isinstance(value, str) and value.startswith("$"):
251
- env_var_names.append(value[1:])
252
- return env_var_names
253
-
254
- def _update_secret_from_env_var(self, env_var_name: str) -> None:
255
- # Lazy load to avoid circular import
256
- from griptape_nodes.retained_mode.griptape_nodes import GriptapeNodes
257
-
258
- if GriptapeNodes.SecretsManager().get_secret(env_var_name, should_error_on_not_found=False) is None:
259
- # Set a blank one.
260
- GriptapeNodes.SecretsManager().set_secret(env_var_name, "")
261
-
262
228
  def save_user_workflow_json(self, workflow_file_name: str) -> None:
263
229
  config_loc = "app_events.on_app_initialization_complete.workflows_to_register"
264
230
  existing_workflows = self.get_config_value(config_loc)
@@ -393,12 +359,6 @@ class ConfigManager:
393
359
 
394
360
  self.set_config_value(key=request.category, value=request.contents)
395
361
 
396
- # Update any added env vars (this is dumb)
397
- # TODO: https://github.com/griptape-ai/griptape-nodes/issues/1022
398
- after_env_vars_set = set(self.gather_env_var_names())
399
- for after_env_var in after_env_vars_set:
400
- self._update_secret_from_env_var(after_env_var)
401
-
402
362
  result_details = f"Successfully assigned the config dictionary for section '{request.category}'."
403
363
  return SetConfigCategoryResultSuccess(result_details=result_details)
404
364
 
@@ -518,12 +478,6 @@ class ConfigManager:
518
478
  # Set the new value
519
479
  self.set_config_value(key=request.category_and_key, value=request.value)
520
480
 
521
- # Update any added env vars (this is dumb)
522
- # TODO: https://github.com/griptape-ai/griptape-nodes/issues/1022
523
- after_env_vars_set = set(self.gather_env_var_names())
524
- for after_env_var in after_env_vars_set:
525
- self._update_secret_from_env_var(after_env_var)
526
-
527
481
  # For container types, indicate the change with a diff
528
482
  if isinstance(request.value, (dict, list)):
529
483
  if old_value_copy is not None: