griptape-nodes 0.56.0__py3-none-any.whl → 0.57.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 (39) hide show
  1. griptape_nodes/app/app.py +10 -15
  2. griptape_nodes/app/watch.py +35 -67
  3. griptape_nodes/bootstrap/utils/__init__.py +1 -0
  4. griptape_nodes/bootstrap/utils/python_subprocess_executor.py +122 -0
  5. griptape_nodes/bootstrap/workflow_executors/local_session_workflow_executor.py +418 -0
  6. griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py +37 -8
  7. griptape_nodes/bootstrap/workflow_executors/subprocess_workflow_executor.py +326 -0
  8. griptape_nodes/bootstrap/workflow_executors/utils/__init__.py +1 -0
  9. griptape_nodes/bootstrap/workflow_executors/utils/subprocess_script.py +51 -0
  10. griptape_nodes/bootstrap/workflow_publishers/__init__.py +1 -0
  11. griptape_nodes/bootstrap/workflow_publishers/local_workflow_publisher.py +43 -0
  12. griptape_nodes/bootstrap/workflow_publishers/subprocess_workflow_publisher.py +84 -0
  13. griptape_nodes/bootstrap/workflow_publishers/utils/__init__.py +1 -0
  14. griptape_nodes/bootstrap/workflow_publishers/utils/subprocess_script.py +54 -0
  15. griptape_nodes/cli/commands/engine.py +4 -15
  16. griptape_nodes/cli/main.py +6 -1
  17. griptape_nodes/exe_types/core_types.py +26 -0
  18. griptape_nodes/exe_types/node_types.py +116 -1
  19. griptape_nodes/retained_mode/events/agent_events.py +2 -0
  20. griptape_nodes/retained_mode/events/base_events.py +18 -17
  21. griptape_nodes/retained_mode/events/execution_events.py +3 -1
  22. griptape_nodes/retained_mode/events/flow_events.py +5 -7
  23. griptape_nodes/retained_mode/events/mcp_events.py +363 -0
  24. griptape_nodes/retained_mode/events/node_events.py +3 -4
  25. griptape_nodes/retained_mode/griptape_nodes.py +8 -0
  26. griptape_nodes/retained_mode/managers/agent_manager.py +67 -4
  27. griptape_nodes/retained_mode/managers/event_manager.py +31 -13
  28. griptape_nodes/retained_mode/managers/flow_manager.py +76 -44
  29. griptape_nodes/retained_mode/managers/library_manager.py +7 -9
  30. griptape_nodes/retained_mode/managers/mcp_manager.py +364 -0
  31. griptape_nodes/retained_mode/managers/node_manager.py +12 -1
  32. griptape_nodes/retained_mode/managers/settings.py +40 -0
  33. griptape_nodes/retained_mode/managers/workflow_manager.py +94 -8
  34. griptape_nodes/traits/multi_options.py +5 -1
  35. griptape_nodes/traits/options.py +10 -2
  36. {griptape_nodes-0.56.0.dist-info → griptape_nodes-0.57.0.dist-info}/METADATA +2 -2
  37. {griptape_nodes-0.56.0.dist-info → griptape_nodes-0.57.0.dist-info}/RECORD +39 -26
  38. {griptape_nodes-0.56.0.dist-info → griptape_nodes-0.57.0.dist-info}/WHEEL +0 -0
  39. {griptape_nodes-0.56.0.dist-info → griptape_nodes-0.57.0.dist-info}/entry_points.txt +0 -0
@@ -18,6 +18,7 @@ from griptape_nodes.exe_types.node_types import (
18
18
  BaseNode,
19
19
  EndLoopNode,
20
20
  ErrorProxyNode,
21
+ NodeDependencies,
21
22
  NodeResolutionState,
22
23
  StartLoopNode,
23
24
  )
@@ -2075,11 +2076,21 @@ class NodeManager:
2075
2076
  lock_command = SetLockNodeStateRequest(node_name=None, lock=True)
2076
2077
  else:
2077
2078
  lock_command = None
2079
+
2080
+ # Collect node dependencies
2081
+ node_dependencies = node.get_node_dependencies()
2082
+ if node_dependencies is None:
2083
+ # Ensure we always have a NodeDependencies object, even if empty
2084
+ node_dependencies = NodeDependencies()
2085
+
2086
+ # Add the library dependency to the node dependencies
2087
+ node_dependencies.libraries.add(library_details)
2088
+
2078
2089
  # Hooray
2079
2090
  serialized_node_commands = SerializedNodeCommands(
2080
2091
  create_node_command=create_node_request,
2081
2092
  element_modification_commands=element_modification_commands,
2082
- node_library_details=library_details,
2093
+ node_dependencies=node_dependencies,
2083
2094
  lock_node_command=lock_command,
2084
2095
  )
2085
2096
  details = f"Successfully serialized node '{node_name}' into commands."
@@ -23,6 +23,7 @@ API_KEYS = Category(name="API Keys", description="API keys and authentication cr
23
23
  EXECUTION = Category(name="Execution", description="Workflow execution and processing settings")
24
24
  STORAGE = Category(name="Storage", description="Data storage and persistence configuration")
25
25
  SYSTEM_REQUIREMENTS = Category(name="System Requirements", description="System resource requirements and limits")
26
+ MCP_SERVERS = Category(name="MCP Servers", description="Model Context Protocol server configurations")
26
27
 
27
28
 
28
29
  def Field(category: str | Category = "General", **kwargs) -> Any:
@@ -56,6 +57,40 @@ class LogLevel(StrEnum):
56
57
  DEBUG = "DEBUG"
57
58
 
58
59
 
60
+ class MCPServerConfig(BaseModel):
61
+ """Configuration for a single MCP server."""
62
+
63
+ name: str = Field(description="Unique name/identifier for the MCP server")
64
+ enabled: bool = Field(default=True, description="Whether this MCP server is enabled")
65
+ transport: str = Field(default="stdio", description="Transport type: stdio, sse, streamable_http, or websocket")
66
+
67
+ # StdioConnection fields
68
+ command: str | None = Field(default=None, description="Command to start the MCP server (required for stdio)")
69
+ args: list[str] = Field(default_factory=list, description="Arguments to pass to the MCP server command (stdio)")
70
+ env: dict[str, str] = Field(default_factory=dict, description="Environment variables for the MCP server (stdio)")
71
+ cwd: str | None = Field(default=None, description="Working directory for the MCP server (stdio)")
72
+ encoding: str = Field(default="utf-8", description="Text encoding for stdio communication")
73
+ encoding_error_handler: str = Field(default="strict", description="Encoding error handler for stdio")
74
+
75
+ # HTTP-based connection fields (sse, streamable_http, websocket)
76
+ url: str | None = Field(
77
+ default=None, description="URL for HTTP-based connections (sse, streamable_http, websocket)"
78
+ )
79
+ headers: dict[str, str] | None = Field(default=None, description="HTTP headers for HTTP-based connections")
80
+ timeout: float | None = Field(default=None, description="HTTP timeout in seconds")
81
+ sse_read_timeout: float | None = Field(default=None, description="SSE read timeout in seconds")
82
+ terminate_on_close: bool = Field(
83
+ default=True, description="Whether to terminate session on close (streamable_http)"
84
+ )
85
+
86
+ # Common fields
87
+ description: str | None = Field(default=None, description="Optional description of what this MCP server provides")
88
+ capabilities: list[str] = Field(default_factory=list, description="List of capabilities this MCP server provides")
89
+
90
+ def __str__(self) -> str:
91
+ return f"{self.name} ({'enabled' if self.enabled else 'disabled'})"
92
+
93
+
59
94
  class AppInitializationComplete(BaseModel):
60
95
  libraries_to_register: list[str] = Field(default_factory=list)
61
96
  workflows_to_register: list[str] = Field(default_factory=list)
@@ -215,3 +250,8 @@ class Settings(BaseModel):
215
250
  default=True,
216
251
  description="Enable file watching for synced workflows directory",
217
252
  )
253
+ mcp_servers: list[MCPServerConfig] = Field(
254
+ category=MCP_SERVERS,
255
+ default_factory=list,
256
+ description="List of Model Context Protocol server configurations",
257
+ )
@@ -31,12 +31,12 @@ from griptape_nodes.retained_mode.events.app_events import (
31
31
 
32
32
  # Runtime imports for ResultDetails since it's used at runtime
33
33
  from griptape_nodes.retained_mode.events.base_events import ResultDetail, ResultDetails
34
+ from griptape_nodes.retained_mode.events.execution_events import StartFlowResultFailure, StartFlowResultSuccess
34
35
  from griptape_nodes.retained_mode.events.flow_events import (
35
36
  CreateFlowRequest,
36
37
  GetTopLevelFlowRequest,
37
38
  GetTopLevelFlowResultSuccess,
38
39
  SerializedFlowCommands,
39
- SerializedNodeCommands,
40
40
  SerializeFlowToCommandsRequest,
41
41
  SerializeFlowToCommandsResultSuccess,
42
42
  SetFlowMetadataRequest,
@@ -118,7 +118,7 @@ if TYPE_CHECKING:
118
118
 
119
119
  from griptape_nodes.exe_types.core_types import Parameter
120
120
  from griptape_nodes.retained_mode.events.base_events import ResultPayload
121
- from griptape_nodes.retained_mode.events.node_events import SetLockNodeStateRequest
121
+ from griptape_nodes.retained_mode.events.node_events import SerializedNodeCommands, SetLockNodeStateRequest
122
122
  from griptape_nodes.retained_mode.managers.event_manager import EventManager
123
123
 
124
124
 
@@ -1379,14 +1379,14 @@ class WorkflowManager:
1379
1379
 
1380
1380
  # Create the Workflow Metadata header
1381
1381
  workflows_referenced = None
1382
- if serialized_flow_commands.referenced_workflows:
1383
- workflows_referenced = list(serialized_flow_commands.referenced_workflows)
1382
+ if serialized_flow_commands.node_dependencies.referenced_workflows:
1383
+ workflows_referenced = list(serialized_flow_commands.node_dependencies.referenced_workflows)
1384
1384
 
1385
1385
  return WorkflowMetadata(
1386
1386
  name=str(file_name),
1387
1387
  schema_version=WorkflowMetadata.LATEST_SCHEMA_VERSION,
1388
1388
  engine_version_created_with=engine_version,
1389
- node_libraries_referenced=list(serialized_flow_commands.node_libraries_used),
1389
+ node_libraries_referenced=list(serialized_flow_commands.node_dependencies.libraries),
1390
1390
  workflows_referenced=workflows_referenced,
1391
1391
  creation_date=creation_date,
1392
1392
  last_modified_date=datetime.now(tz=UTC),
@@ -1395,7 +1395,7 @@ class WorkflowManager:
1395
1395
  image=image_path,
1396
1396
  )
1397
1397
 
1398
- def _generate_workflow_file_content( # noqa: PLR0912, C901
1398
+ def _generate_workflow_file_content( # noqa: PLR0912, PLR0915, C901
1399
1399
  self,
1400
1400
  serialized_flow_commands: SerializedFlowCommands,
1401
1401
  workflow_metadata: WorkflowMetadata,
@@ -1410,6 +1410,13 @@ class WorkflowManager:
1410
1410
  import_recorder = ImportRecorder()
1411
1411
  import_recorder.add_from_import("griptape_nodes.retained_mode.griptape_nodes", "GriptapeNodes")
1412
1412
 
1413
+ # Add imports from node dependencies
1414
+ for import_dep in serialized_flow_commands.node_dependencies.imports:
1415
+ if import_dep.class_name:
1416
+ import_recorder.add_from_import(import_dep.module, import_dep.class_name)
1417
+ else:
1418
+ import_recorder.add_import(import_dep.module)
1419
+
1413
1420
  ast_container = ASTContainer()
1414
1421
 
1415
1422
  prereq_code = self._generate_workflow_run_prerequisite_code(
@@ -1989,6 +1996,17 @@ class WorkflowManager:
1989
1996
  ]
1990
1997
  )
1991
1998
 
1999
+ # Ensure body is not empty - add pass statement if no input parameters
2000
+ if not build_flow_input_stmts:
2001
+ build_flow_input_stmts = [
2002
+ ast.Expr(
2003
+ value=ast.Constant(
2004
+ value="This workflow has no input parameters defined, so there's nothing necessary to supply"
2005
+ )
2006
+ ),
2007
+ ast.Pass(),
2008
+ ]
2009
+
1992
2010
  # Wrap the individual argument processing in an else clause
1993
2011
  individual_args_else = ast.If(
1994
2012
  test=ast.Compare(
@@ -3160,7 +3178,7 @@ class WorkflowManager:
3160
3178
  for node in nodes:
3161
3179
  for param in node.parameters:
3162
3180
  # Expose only the parameters that are relevant for workflow input and output.
3163
- param_info = self.extract_parameter_shape_info(param, include_control_params=False)
3181
+ param_info = self.extract_parameter_shape_info(param, include_control_params=True)
3164
3182
  if param_info is not None:
3165
3183
  if node.name in workflow_shape[workflow_shape_type]:
3166
3184
  cast("dict", workflow_shape[workflow_shape_type][node.name])[param.name] = param_info
@@ -3217,7 +3235,7 @@ class WorkflowManager:
3217
3235
  return workflow_shape
3218
3236
 
3219
3237
  def extract_parameter_shape_info(
3220
- self, parameter: Parameter, *, include_control_params: bool = False
3238
+ self, parameter: Parameter, *, include_control_params: bool
3221
3239
  ) -> ParameterShapeInfo | None:
3222
3240
  """Extract shape information from a parameter for workflow shape building.
3223
3241
 
@@ -3276,12 +3294,80 @@ class WorkflowManager:
3276
3294
  if isinstance(result, PublishWorkflowResultSuccess):
3277
3295
  workflow_file = Path(result.published_workflow_file_path)
3278
3296
  result = self._register_published_workflow_file(workflow_file, result)
3297
+
3298
+ if request.execute_on_publish:
3299
+ await self._handle_execute_on_publish(request, workflow_file)
3300
+
3279
3301
  return result # noqa: TRY300
3280
3302
  except Exception as e:
3281
3303
  details = f"Failed to publish workflow '{request.workflow_name}': {e!s}"
3282
3304
  logger.exception(details)
3283
3305
  return PublishWorkflowResultFailure(exception=e, result_details=details)
3284
3306
 
3307
+ async def _handle_execute_on_publish(self, request: PublishWorkflowRequest, workflow_file: Path) -> None:
3308
+ class ExecuteOnPublishError(Exception):
3309
+ pass
3310
+
3311
+ # Create an event to track when we get a start workflow result
3312
+ start_result_received = asyncio.Event()
3313
+ exception: ExecuteOnPublishError | None = None
3314
+
3315
+ def invoke_done_callback(future: asyncio.Future) -> None:
3316
+ nonlocal exception
3317
+ try:
3318
+ future.result()
3319
+ except Exception as e:
3320
+ msg = f"Error during invocation of published workflow '{request.workflow_name}': {e!s}"
3321
+ logger.exception(msg)
3322
+ exception = ExecuteOnPublishError(e)
3323
+ start_result_received.set()
3324
+
3325
+ def on_start_flow_result(start_result: ResultPayload) -> None:
3326
+ nonlocal exception
3327
+ if isinstance(start_result, StartFlowResultSuccess):
3328
+ msg = f"Successfully started published workflow '{request.workflow_name}'"
3329
+ logger.info(msg)
3330
+ elif isinstance(start_result, StartFlowResultFailure):
3331
+ msg = f"Failed to invoke published workflow '{request.workflow_name}': {start_result.exception}"
3332
+ logger.exception(msg)
3333
+ exceptions = start_result.validation_exceptions
3334
+ exceptions.append(start_result.exception) if start_result.exception else None
3335
+ exception = ExecuteOnPublishError(exceptions)
3336
+
3337
+ start_result_received.set()
3338
+
3339
+ invoke_task = asyncio.create_task(
3340
+ self._invoke_published_workflow(request.workflow_name, workflow_file, on_start_flow_result)
3341
+ )
3342
+ invoke_task.add_done_callback(invoke_done_callback)
3343
+
3344
+ # Wait for StartFlow result
3345
+ try:
3346
+ await asyncio.wait_for(start_result_received.wait(), timeout=10.0)
3347
+ if exception is not None:
3348
+ raise exception
3349
+ except TimeoutError:
3350
+ # Timeout occurred - don't block on subprocess workflow execution, just log a warning
3351
+ msg = f"Timeout waiting for workflow '{request.workflow_name}' StartFlow result."
3352
+ logger.warning(msg)
3353
+
3354
+ async def _invoke_published_workflow(
3355
+ self, workflow_name: str, workflow_path: Path, on_start_flow_result: Callable[[ResultPayload], None]
3356
+ ) -> None:
3357
+ from griptape_nodes.bootstrap.workflow_executors.subprocess_workflow_executor import SubprocessWorkflowExecutor
3358
+
3359
+ subprocess_executor = SubprocessWorkflowExecutor(
3360
+ workflow_path=str(workflow_path), on_start_flow_result=on_start_flow_result
3361
+ )
3362
+ storage_backend_value = GriptapeNodes.ConfigManager().get_config_value("storage_backend")
3363
+
3364
+ async with subprocess_executor as executor:
3365
+ await executor.arun(
3366
+ workflow_name=workflow_name,
3367
+ flow_input={},
3368
+ storage_backend=StorageBackend(value=storage_backend_value),
3369
+ )
3370
+
3285
3371
  def _register_published_workflow_file(
3286
3372
  self, workflow_file: Path, result: PublishWorkflowResultSuccess
3287
3373
  ) -> ResultPayload:
@@ -29,15 +29,17 @@ class MultiOptions(Trait):
29
29
  placeholder: str = field(default="Select options...")
30
30
  max_selected_display: int = field(default=3)
31
31
  show_search: bool = field(default=True)
32
+ search_filter: str = field(default="")
32
33
  icon_size: str = field(default="small")
33
34
 
34
- def __init__(
35
+ def __init__( # noqa: PLR0913
35
36
  self,
36
37
  *,
37
38
  choices: list | None = None,
38
39
  placeholder: str = "Select options...",
39
40
  max_selected_display: int = 3,
40
41
  show_search: bool = True,
42
+ search_filter: str = "",
41
43
  icon_size: str = "small",
42
44
  ) -> None:
43
45
  super().__init__()
@@ -48,6 +50,7 @@ class MultiOptions(Trait):
48
50
  self.placeholder = placeholder
49
51
  self.max_selected_display = max_selected_display
50
52
  self.show_search = show_search
53
+ self.search_filter = search_filter
51
54
 
52
55
  # Validate icon_size
53
56
  if icon_size not in ["small", "large"]:
@@ -183,6 +186,7 @@ class MultiOptions(Trait):
183
186
  "placeholder": self.placeholder,
184
187
  "max_selected_display": self.max_selected_display,
185
188
  "show_search": self.show_search,
189
+ "search_filter": self.search_filter,
186
190
  "icon_size": self.icon_size,
187
191
  }
188
192
  }
@@ -26,12 +26,16 @@ class Options(Trait):
26
26
 
27
27
  _choices: list = field(default_factory=lambda: ["choice 1", "choice 2", "choice 3"])
28
28
  element_id: str = field(default_factory=lambda: "Options")
29
+ show_search: bool = field(default=True)
30
+ search_filter: str = field(default="")
29
31
 
30
- def __init__(self, *, choices: list | None = None) -> None:
32
+ def __init__(self, *, choices: list | None = None, show_search: bool = True, search_filter: str = "") -> None:
31
33
  super().__init__()
32
34
  # Set choices through property to ensure dual sync from the start
33
35
  if choices is not None:
34
36
  self.choices = choices
37
+ self.show_search = show_search
38
+ self.search_filter = search_filter
35
39
 
36
40
  @property
37
41
  def choices(self) -> list:
@@ -122,4 +126,8 @@ class Options(Trait):
122
126
  Using _choices directly breaks this cycle while still providing the correct
123
127
  initial choices for UI rendering. The property-based sync handles runtime updates.
124
128
  """
125
- return {"simple_dropdown": self._choices}
129
+ return {
130
+ "simple_dropdown": self._choices,
131
+ "show_search": self.show_search,
132
+ "search_filter": self.search_filter,
133
+ }
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: griptape-nodes
3
- Version: 0.56.0
3
+ Version: 0.57.0
4
4
  Summary: Add your description here
5
- Requires-Dist: griptape>=1.8.2
5
+ Requires-Dist: griptape>=1.8.3
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
@@ -2,21 +2,32 @@ griptape_nodes/__init__.py,sha256=WxWjICLxwuyZGDpPUyCmj047GbN7PIspi4YMWgmrrQc,67
2
2
  griptape_nodes/__main__.py,sha256=fJhor6_1A27abwbnceyNheONP1iXkPzjjsV5jBEfF2M,144
3
3
  griptape_nodes/app/.python-version,sha256=e1X45ntWI8S-8_ppEojalDfXnTq6FW3kjUgdsyrH0W0,5
4
4
  griptape_nodes/app/__init__.py,sha256=DB-DTsgcNnbmEClXEouwzGhrmo3gHBCWXB9BkPGpdQI,90
5
- griptape_nodes/app/app.py,sha256=4w7B4c_l7iH_3hTro1aher6q0a5K2APpglo8pGUJqQ4,19043
6
- griptape_nodes/app/watch.py,sha256=WE3P0Hl_jDezqy_UetNK2K5NTQFYKcoEbcKwzRWY4MU,2648
5
+ griptape_nodes/app/app.py,sha256=B0GVXGUMGadhM3OrgW-2MOyY6wlnjIkTb8_QVfwz5WA,18700
6
+ griptape_nodes/app/watch.py,sha256=hKVP_SuV9C17bH1h9o4uIVTKH-IL_-0iyHaNYmILTWU,1594
7
7
  griptape_nodes/bootstrap/__init__.py,sha256=ENv3SIzQ9TtlRrg1y4e4CnoBpJaFpFSkNpTFBV8X5Ls,25
8
+ griptape_nodes/bootstrap/utils/__init__.py,sha256=tlNEApJLZazcBNhxkTdup4URwznnz4nZxjSaRfFrTBM,31
9
+ griptape_nodes/bootstrap/utils/python_subprocess_executor.py,sha256=s2Ymn5YsMVKYbwt8uaiiZElhorSX62FvxGQd24gMUE0,4288
8
10
  griptape_nodes/bootstrap/workflow_executors/__init__.py,sha256=pyjN81-eLtjyECFYLXOtMCixiiI9qBi5yald86iM7Ek,34
9
- griptape_nodes/bootstrap/workflow_executors/local_workflow_executor.py,sha256=IucqryCU0PnLbgXDSS-o9w__NgjiGVe8_qcpZOTBeao,8721
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/utils/__init__.py,sha256=IEz4GHM4-w_u6VpLemrj-V38v8aZJinr5Wya9ucEad0,40
15
+ griptape_nodes/bootstrap/workflow_executors/utils/subprocess_script.py,sha256=YJj85uZxdrEabwown4AbGo84zWVa4f1z1Gh0wNVv0-4,1413
10
16
  griptape_nodes/bootstrap/workflow_executors/workflow_executor.py,sha256=MBbUFdbvsYOJl_ebxxSCxq1R37StghQ1gAdMkIcGtbI,1145
17
+ 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
20
+ 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
11
22
  griptape_nodes/cli/__init__.py,sha256=HuXHtxqDMtpYRokxiFYuNB7R5EgkOshPil273kTmgNg,33
12
23
  griptape_nodes/cli/commands/__init__.py,sha256=8EbS15rm9xrbcPocuQO2RmOwSD1BBwa8iDgPSdsvzuU,35
13
24
  griptape_nodes/cli/commands/config.py,sha256=zh5rs2vCY_x9dEUK2jtQQJGcjlJzhpJJ-EgHHvkrvdg,2302
14
- griptape_nodes/cli/commands/engine.py,sha256=r6Qz3pWYCKdy4hv2cg7W5dFbBGvNVXnsll2LXVtDJZ4,2869
25
+ griptape_nodes/cli/commands/engine.py,sha256=PWcjuhG_q6wnX1dZY1RJKvQQLO4CmMFBGyhOUKYOofE,2484
15
26
  griptape_nodes/cli/commands/init.py,sha256=dp7ovV2v8Q7dqeG3Q46w0TKQWKzTsAPzv0a2eeQ_gVM,25105
16
27
  griptape_nodes/cli/commands/libraries.py,sha256=XMTFbC_Ie95qSfemHg-HgQwWeYgBhFjr5GCOD7Iifec,3662
17
28
  griptape_nodes/cli/commands/models.py,sha256=txbozCLF_Hvj4q9g0P8gAi0ZfIFcL95Ad9QS_PfHiHY,17612
18
29
  griptape_nodes/cli/commands/self.py,sha256=aafOn1ThMxoRu2OvwqxAu0BuM_3vfB7e8_dOWeUpNZI,4021
19
- griptape_nodes/cli/main.py,sha256=0QFPKeq-USTlu6ldDm9fquOmKKbK7UIhbDc07KkXzao,1580
30
+ griptape_nodes/cli/main.py,sha256=A9k-4vdxOrm3Z0NNtDWLmvSW5ecvtIXInLR0zn2AERA,1739
20
31
  griptape_nodes/cli/shared.py,sha256=JnUt-i7_hi81rqkT2fpVBJMTmODNiGFd7-Cv0Xt9QOU,2600
21
32
  griptape_nodes/common/__init__.py,sha256=HTbJfTpu6-nU91zFCZW2qUNeW6bitNWNDayWqH6fpbA,22
22
33
  griptape_nodes/common/directed_graph.py,sha256=hk3C_S4GiG4FZOmufjebb-6_2SwQrbyTidYTSbCDWMU,2361
@@ -28,9 +39,9 @@ griptape_nodes/drivers/storage/local_storage_driver.py,sha256=U1-2gqFQKsAyHL-S4e
28
39
  griptape_nodes/drivers/storage/storage_backend.py,sha256=3QBIwrgPc1krBIiPYLoK2swhIPDiKJnnucOEdyx7y3c,184
29
40
  griptape_nodes/exe_types/__init__.py,sha256=wGGwKGX9-TSarUFbXpDvdU_J7eXIbWTBl_NCLOZa-G8,32
30
41
  griptape_nodes/exe_types/connections.py,sha256=_-VNzf6Kay62QzJlSX-LlHTUhz-CKF-UDsbZLJ0l6Wk,12435
31
- griptape_nodes/exe_types/core_types.py,sha256=adhGw0wI5AB0LOGqT_ivjxurq7v_GWudnbpYFYDtvvU,80352
42
+ griptape_nodes/exe_types/core_types.py,sha256=XlYXSQnlHew7yK_iJnSdOQyiYq63OmVMGF2SjKGA3lM,81328
32
43
  griptape_nodes/exe_types/flow.py,sha256=pCeTrx8yrUgLw1U9yQxC7arzJjyP2vag-pG0QTKut-M,5716
33
- griptape_nodes/exe_types/node_types.py,sha256=olziWE_saPpCj77IjeDNH6xmftyePOx-XShFY33jUHM,72809
44
+ griptape_nodes/exe_types/node_types.py,sha256=SqTKffO-Iux18v038DxVOpY-nrZkop7HoOH-sv7JUnI,77950
34
45
  griptape_nodes/exe_types/param_components/__init__.py,sha256=ocm75WnsgiD6ozKVGFhoH9cQe_FEzeF2osxrRujOes0,60
35
46
  griptape_nodes/exe_types/param_components/execution_status_component.py,sha256=eeUcUOOraGa6sDH_zg_QnGPoP0K-pm3fu90-KAtrmq8,5532
36
47
  griptape_nodes/exe_types/type_validator.py,sha256=RTz1vX09jzQpHhozITMJ0siOZUXvsERDhrApjdaM1WM,1120
@@ -48,20 +59,21 @@ griptape_nodes/node_library/workflow_registry.py,sha256=FMiR_XWk2R1U0HhvzoQzk2tk
48
59
  griptape_nodes/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
60
  griptape_nodes/retained_mode/__init__.py,sha256=X12DKL6KhLsiRTPIlrPj2h76_sJ0q0eH4r0kMQkodm0,29
50
61
  griptape_nodes/retained_mode/events/__init__.py,sha256=7B1C-c0jVvnShtHJ2lfX6BZPE0U1DgQwg1e4DorhKG0,22
51
- griptape_nodes/retained_mode/events/agent_events.py,sha256=xyCtR-Hf1vv6Ft-z0At0ytIMYBRckYympxdByVZXrCE,4880
62
+ griptape_nodes/retained_mode/events/agent_events.py,sha256=FtE9AA0yD4O2cblIO5g2_xBlU1XWwnK4BhcDJxlQDTU,5027
52
63
  griptape_nodes/retained_mode/events/app_events.py,sha256=EEZhiCFFcgUKK7p7uniZMCZUPW12Kt5xzduUsrpxii8,8622
53
64
  griptape_nodes/retained_mode/events/arbitrary_python_events.py,sha256=uhep1c1xjUc-YQO5nIStAE48PS6rFZLTDQIr_Qb3we8,1460
54
- griptape_nodes/retained_mode/events/base_events.py,sha256=ywDkoOaHxGpNMDGkzSkqFzDttp75OEylVBb2nfR5F6o,23117
65
+ griptape_nodes/retained_mode/events/base_events.py,sha256=UPEMkoU7lUtm8L_wdeTp8YRLSAFFgxJIVRasdqtuQfQ,23223
55
66
  griptape_nodes/retained_mode/events/config_events.py,sha256=Y03YMLoJTXy0Sz6tq-6lOIs37CmXn1Br3GYAinl02nY,7070
56
67
  griptape_nodes/retained_mode/events/connection_events.py,sha256=QjHAp0SeCbRSG-dF_nU_CPaOcSKItq2DWJ_FHWgF1b4,4744
57
68
  griptape_nodes/retained_mode/events/context_events.py,sha256=-FIwjI0hJodDhfM4BF-3GTRycu80v1TlSSOX34oA9nA,2122
58
- griptape_nodes/retained_mode/events/execution_events.py,sha256=ci1PS0uRm-wV2gm5euQgAL-nqVA_3lmGfKNZUdXVCTk,10194
59
- griptape_nodes/retained_mode/events/flow_events.py,sha256=A_OhHMx4nuBJSXnc1NgJUM-8p0YBMn5iT9JbIrsrLqU,17033
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
60
71
  griptape_nodes/retained_mode/events/generate_request_payload_schemas.py,sha256=PQ0QRZAUBljSIGjB8QhYUeRmSrfmLsJ6XVcygJKi13I,1102
61
72
  griptape_nodes/retained_mode/events/library_events.py,sha256=9KVMHA5VazY3fXEIm31Zmy-rJ43AxNgna4SzVPmy8Pg,17629
62
73
  griptape_nodes/retained_mode/events/logger_events.py,sha256=jYlxzPomgCsJuPtJ0znWBhD8QJfC8qC4xfChDiuVuyg,705
74
+ griptape_nodes/retained_mode/events/mcp_events.py,sha256=51OlMZVcabdcIxBb_ojvrHtq2jAzZA31pooPBKaApyg,10734
63
75
  griptape_nodes/retained_mode/events/model_events.py,sha256=EbSjIpJrQi2RuRRFJsoioAyMchAba-vEOXvLBCR0xi0,9227
64
- griptape_nodes/retained_mode/events/node_events.py,sha256=bVB7y_2C2NdAfXZWoTUyzuWs3z11Nlz8qXyDNsy-0Uo,30062
76
+ griptape_nodes/retained_mode/events/node_events.py,sha256=ZV9kK5GqgJlDKT7ybifQDGbHpG5ObCywKH-OCVGq-gE,30026
65
77
  griptape_nodes/retained_mode/events/object_events.py,sha256=cJaqEU73Lzf1RRxJrFqEpl8eTr-gDhKpXKywJ-vVCJQ,2631
66
78
  griptape_nodes/retained_mode/events/os_events.py,sha256=X0mmyk_r5t6upaQ8eWClD7J25AiX2ggsAuxMZSW9Vx0,8085
67
79
  griptape_nodes/retained_mode/events/parameter_events.py,sha256=32dDaVe9oV_fNRtz5xv4_9GP_yr_EXUMsRi2i1rTSNI,19276
@@ -73,15 +85,15 @@ griptape_nodes/retained_mode/events/sync_events.py,sha256=AoxBZLPPdzx4S5CiOJVRDe
73
85
  griptape_nodes/retained_mode/events/validation_events.py,sha256=H2yWoHp2t7QwGV_fDQXRy7JojYnK4k6SOAlEvRYST_Q,3062
74
86
  griptape_nodes/retained_mode/events/variable_events.py,sha256=fnl_sY8GWI_R4UJQTEJSlmsyCD9TiEW0U2UD2seBabs,10587
75
87
  griptape_nodes/retained_mode/events/workflow_events.py,sha256=pvY-RTAUMM4YQjJPPDH1OWcJw-N5Gth6pJznK0Wkki0,22135
76
- griptape_nodes/retained_mode/griptape_nodes.py,sha256=HqUsGZ97a_5o1Kj3SgQAUlRfYHl_1nWWcEm6dMNCsSk,27844
88
+ griptape_nodes/retained_mode/griptape_nodes.py,sha256=yGJzCeKKT2wyMVJbstmUoJ-fV5WIEMm4doWWbdottCs,28231
77
89
  griptape_nodes/retained_mode/managers/__init__.py,sha256=OTXysKusqYCQeAYwnVj4PbE3MxvAUTq9xOZT6vUE3JA,24
78
- griptape_nodes/retained_mode/managers/agent_manager.py,sha256=lqYgZwXBgs5n3atdc-qCdiuyldKEVB1UWIL1_-kLie8,12429
90
+ griptape_nodes/retained_mode/managers/agent_manager.py,sha256=GeBAMGnSB7wnkA6LGwBxR7WVXOc028X6B-Y4d2Two1I,15447
79
91
  griptape_nodes/retained_mode/managers/arbitrary_code_exec_manager.py,sha256=3IRIrpKR62MvTdGWfQa1ARUVxCmMUNtzUU4xMcQdlCY,1891
80
92
  griptape_nodes/retained_mode/managers/config_manager.py,sha256=LwtcdRx0r-3eU6K0O0M2jLlYQo5yoDQYM93Fg_vh9Mw,27854
81
93
  griptape_nodes/retained_mode/managers/context_manager.py,sha256=eb44_CAZhCg2iYIoodlAPpYc67tG3sHyq9dPNoiq_1s,23031
82
94
  griptape_nodes/retained_mode/managers/engine_identity_manager.py,sha256=GBBz7HJBJVNyXLGRdAvqDgihMRB_YjWqdEwLMCnadUg,4409
83
- griptape_nodes/retained_mode/managers/event_manager.py,sha256=pL4cftc8tm51DcpkAkZq6HZBeVwHwa236z-E1D7Gf_o,11868
84
- griptape_nodes/retained_mode/managers/flow_manager.py,sha256=w3ulYWDrLHd8ezAdZoq7nk323ugRI7on3-UbuQ_FW50,146098
95
+ 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
85
97
  griptape_nodes/retained_mode/managers/library_lifecycle/__init__.py,sha256=Iq79VxTdETiExBfFWXceJggDZqS6X3OkzXE9XwFclVw,1340
86
98
  griptape_nodes/retained_mode/managers/library_lifecycle/data_models.py,sha256=fvAP0VaYGPHYl_Kg3RL4gdJlpqya8UTvpP-C49r950k,6723
87
99
  griptape_nodes/retained_mode/managers/library_lifecycle/library_directory.py,sha256=Ywno93eVJH4sAtQ1dgHG2Pw9B3vw8fN8oAL0gn_l6OI,14836
@@ -94,9 +106,10 @@ griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/packa
94
106
  griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/sandbox.py,sha256=XgG7whE74zWDxX1pOvhASW0pwjOei1EDLvIH19xdzT0,6117
95
107
  griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance.py,sha256=cCGr-MQ1RlVBiUTZepYEKdVhPgC4ebcYrmpv8rI3VeM,894
96
108
  griptape_nodes/retained_mode/managers/library_lifecycle/library_status.py,sha256=K3UEBzAdCY9wphyBbLxDYP0Q43aYvhLZ_Pz7_SzcPec,443
97
- griptape_nodes/retained_mode/managers/library_manager.py,sha256=n_9vVMy1dUzkv6BzOhXEkIk82I7jIa-BtJ4SpAIlIBU,100203
109
+ griptape_nodes/retained_mode/managers/library_manager.py,sha256=4wl1eDbwCyT8r8E1KBWvogWLycAnMR94_NC9iNWO6rE,100102
110
+ griptape_nodes/retained_mode/managers/mcp_manager.py,sha256=BxNVDYUAn5-iylGzURqVZq1DRintrIK5T6q2X_rxm_U,15596
98
111
  griptape_nodes/retained_mode/managers/model_manager.py,sha256=tjrzCYaacFsmcTMplxt2IDis9hkrVa7wuu3NQq9Sba0,44519
99
- griptape_nodes/retained_mode/managers/node_manager.py,sha256=5OOY4R1mJfSlbOeJvZyJZyrKIsN23ILKiUFIvtbUKZA,151907
112
+ griptape_nodes/retained_mode/managers/node_manager.py,sha256=hgKHdhqE5qgJHAPEfCW4V4NlC3bjj1OW8e97KNGNuxw,152309
100
113
  griptape_nodes/retained_mode/managers/object_manager.py,sha256=NDbDSGI4PLU78xXBK0WGbk1Ejh5BN21I7dJOXbgl1bU,12814
101
114
  griptape_nodes/retained_mode/managers/operation_manager.py,sha256=lTkMZlaacTgtV5oV-YF6HG8xsx9V_LwX1eg074WTs2k,20137
102
115
  griptape_nodes/retained_mode/managers/os_manager.py,sha256=uQ0jRGXOimdmcdnwZUMAJnEdqvE33p7w5bBXjPN20fw,40128
@@ -111,12 +124,12 @@ griptape_nodes/retained_mode/managers/resource_types/cpu_resource.py,sha256=YHjU
111
124
  griptape_nodes/retained_mode/managers/resource_types/os_resource.py,sha256=ImgkOQI_br4yI3EY777D93NR20al8b4q9IocqWESjkw,3082
112
125
  griptape_nodes/retained_mode/managers/secrets_manager.py,sha256=tYiUpUhQYdpfu6Tvj98xGNHLc2ytSjH1tOshubD7BHI,6712
113
126
  griptape_nodes/retained_mode/managers/session_manager.py,sha256=fLjtBvgGY3daq1vbpJPXq069n35Z-Zr5dF3B0XyD2JY,11817
114
- griptape_nodes/retained_mode/managers/settings.py,sha256=zRvsGGLRR4mMQM89DbJkMc50YsOJueIQPaDOoWp2IrM,8804
127
+ griptape_nodes/retained_mode/managers/settings.py,sha256=6JuxKLQrk3nbkHjiQdJDnpFDadZAGRIn7jSEzGl3Nx4,11159
115
128
  griptape_nodes/retained_mode/managers/static_files_manager.py,sha256=f117cctpXh35TmXN8jzWNr1XFRzpkmqib9xkzNTay9U,11286
116
129
  griptape_nodes/retained_mode/managers/sync_manager.py,sha256=-m2krEh2YtGs8iAPc8bhFGX8JqjeM5kEV1rnCmcj_yk,21247
117
130
  griptape_nodes/retained_mode/managers/variable_manager.py,sha256=TnuqHSRK9Yiu_EtKxQksF9SyyQb72lbFQuTQZdpBxeE,24116
118
131
  griptape_nodes/retained_mode/managers/version_compatibility_manager.py,sha256=85gpl9WCgHbWNifxoiAidHmsXyqpUCTjuEW-FziFYME,8375
119
- griptape_nodes/retained_mode/managers/workflow_manager.py,sha256=1QQnHmtkZ7hnY-i-INNk9jIL9qILDVxMXGuW6rRPIo4,190744
132
+ griptape_nodes/retained_mode/managers/workflow_manager.py,sha256=aPg8M6FQZdMRvkGlhSqfiE5nzxxC_vKbtAo-Lv6h0j4,194792
120
133
  griptape_nodes/retained_mode/retained_mode.py,sha256=wGMkZX7clW7o4bA-t5ovPDK5cQaPQo_4_Yrvy4KxwL4,57615
121
134
  griptape_nodes/retained_mode/utils/__init__.py,sha256=W5dvv8YwvVVq_8eVTgMd3Z_VB_Dtq1sIIVq8745QH_I,52
122
135
  griptape_nodes/retained_mode/utils/engine_identity.py,sha256=PZmdlYM69-B-6Z1F4iJfZyVm2twJY5cSGoiUJCMj0xU,7846
@@ -135,9 +148,9 @@ griptape_nodes/traits/compare.py,sha256=X-BXGemRDxQV4EX8X24LdtcwMWwfQ1jGqDvH2bSi
135
148
  griptape_nodes/traits/compare_images.py,sha256=KW0WlwsJP6nBoC1irdeRnUWUnZIJvlROlDhyWhX8iEs,1594
136
149
  griptape_nodes/traits/file_system_picker.py,sha256=p-RaH4xwb2Fo0wuFsYbsiL66W23KdESX0Qq6EAtDFj8,5806
137
150
  griptape_nodes/traits/minmax.py,sha256=eVySrz02WPvpwbSrqW7FRTmetNBOBKyf8YrXrzyOGnk,1312
138
- griptape_nodes/traits/multi_options.py,sha256=6hiI6qAFxs5WDjsPEQNnxEcZZzpZ78DwvuOM68yHlPE,8278
151
+ griptape_nodes/traits/multi_options.py,sha256=0iI5nTyZL1u4XSTqp27noddNy88Oizd8nQB3U25zB84,8467
139
152
  griptape_nodes/traits/numbers_selector.py,sha256=Zos40TBqffWFVlgPJ1f1UtKGhl-mpfJbIid8YWeSLzI,2618
140
- griptape_nodes/traits/options.py,sha256=gOVgEx-iLdjOoWXN3-dIC-PWUlf3oAuoIpkO0lfKo9o,5981
153
+ griptape_nodes/traits/options.py,sha256=20pByxnOh_A0bzqWr2I21OCMOFowFLbHNXUn4SPv4jI,6318
141
154
  griptape_nodes/traits/slider.py,sha256=bLe46gtCmjhMCHaGzUstIWMJv2Zl2Yee7fkT6g4Q6Rk,1236
142
155
  griptape_nodes/traits/trait_registry.py,sha256=pU26mW2ztfu1UARGYloflsTPqJ1X_-u013cMNoel9Hw,1171
143
156
  griptape_nodes/traits/traits.json,sha256=JwFsOaFfLeR1ohcyh6XApc5N2-mWMPGSaYbpA-mD7mk,133
@@ -157,7 +170,7 @@ griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_re
157
170
  griptape_nodes/version_compatibility/workflow_versions/__init__.py,sha256=z5XDgkizoNByCXpyo34hfsJKFsWlOHbD6hgzfYH9ubc,52
158
171
  griptape_nodes/version_compatibility/workflow_versions/v0_7_0/__init__.py,sha256=IzPPmGK86h2swfGGTOHyVcBIlOng6SjgWQzlbf3ngmo,51
159
172
  griptape_nodes/version_compatibility/workflow_versions/v0_7_0/local_executor_argument_addition.py,sha256=9PclAp_Mm5IPtd5yj5XSS5-x7QYmifvhTly20CgBZmo,2018
160
- griptape_nodes-0.56.0.dist-info/WHEEL,sha256=-neZj6nU9KAMg2CnCY6T3w8J53nx1kFGw_9HfoSzM60,79
161
- griptape_nodes-0.56.0.dist-info/entry_points.txt,sha256=qvevqd3BVbAV5TcantnAm0ouqaqYKhsRO3pkFymWLWM,82
162
- griptape_nodes-0.56.0.dist-info/METADATA,sha256=p2aQ59h7cpuFk5NqewHdruAiyYCM4Wich8mFpF4itDs,5039
163
- griptape_nodes-0.56.0.dist-info/RECORD,,
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,,