griptape-nodes 0.66.1__py3-none-any.whl → 0.67.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 (31) hide show
  1. griptape_nodes/common/node_executor.py +77 -0
  2. griptape_nodes/exe_types/core_types.py +28 -1
  3. griptape_nodes/exe_types/node_groups/base_iterative_node_group.py +27 -8
  4. griptape_nodes/exe_types/node_groups/base_node_group.py +64 -1
  5. griptape_nodes/exe_types/node_groups/subflow_node_group.py +0 -34
  6. griptape_nodes/exe_types/param_components/seed_parameter.py +3 -2
  7. griptape_nodes/exe_types/param_types/parameter_audio.py +3 -0
  8. griptape_nodes/exe_types/param_types/parameter_bool.py +3 -0
  9. griptape_nodes/exe_types/param_types/parameter_button.py +3 -0
  10. griptape_nodes/exe_types/param_types/parameter_dict.py +151 -0
  11. griptape_nodes/exe_types/param_types/parameter_float.py +3 -0
  12. griptape_nodes/exe_types/param_types/parameter_image.py +3 -0
  13. griptape_nodes/exe_types/param_types/parameter_int.py +3 -0
  14. griptape_nodes/exe_types/param_types/parameter_json.py +268 -0
  15. griptape_nodes/exe_types/param_types/parameter_number.py +3 -0
  16. griptape_nodes/exe_types/param_types/parameter_range.py +393 -0
  17. griptape_nodes/exe_types/param_types/parameter_string.py +3 -0
  18. griptape_nodes/exe_types/param_types/parameter_three_d.py +3 -0
  19. griptape_nodes/exe_types/param_types/parameter_video.py +3 -0
  20. griptape_nodes/retained_mode/events/library_events.py +2 -0
  21. griptape_nodes/retained_mode/events/parameter_events.py +89 -1
  22. griptape_nodes/retained_mode/managers/event_manager.py +176 -10
  23. griptape_nodes/retained_mode/managers/library_manager.py +14 -4
  24. griptape_nodes/retained_mode/managers/node_manager.py +187 -7
  25. griptape_nodes/retained_mode/managers/workflow_manager.py +58 -16
  26. griptape_nodes/utils/file_utils.py +58 -0
  27. griptape_nodes/utils/git_utils.py +6 -0
  28. {griptape_nodes-0.66.1.dist-info → griptape_nodes-0.67.0.dist-info}/METADATA +1 -1
  29. {griptape_nodes-0.66.1.dist-info → griptape_nodes-0.67.0.dist-info}/RECORD +31 -28
  30. {griptape_nodes-0.66.1.dist-info → griptape_nodes-0.67.0.dist-info}/WHEEL +1 -1
  31. {griptape_nodes-0.66.1.dist-info → griptape_nodes-0.67.0.dist-info}/entry_points.txt +0 -0
@@ -938,9 +938,17 @@ class WorkflowManager:
938
938
  # Use provided metadata object as the new metadata
939
939
  new_metadata = request.workflow_metadata
940
940
  # Allow JSON dicts from frontend by coercing to WorkflowMetadata
941
+ # Merge with existing metadata to ensure required fields are present
941
942
  if isinstance(new_metadata, dict):
943
+ # Start with existing metadata as base, then overlay provided fields
944
+ existing_metadata_dict = resolution.workflow.metadata.model_dump()
945
+ # Only overlay non-None values from the incoming dict to preserve required fields
946
+ for key, value in new_metadata.items():
947
+ if value is not None or key in ("description", "image", "branched_from", "workflow_shape"):
948
+ # Allow explicit None for optional fields, but preserve required fields if incoming is None
949
+ existing_metadata_dict[key] = value
942
950
  try:
943
- new_metadata = WorkflowMetadata.model_validate(new_metadata)
951
+ new_metadata = WorkflowMetadata.model_validate(existing_metadata_dict)
944
952
  except Exception as e:
945
953
  return SetWorkflowMetadataResultFailure(result_details=f"Invalid workflow_metadata: {e!s}")
946
954
  # Refresh last_modified_date to reflect this change
@@ -1562,6 +1570,41 @@ class WorkflowManager:
1562
1570
  else:
1563
1571
  return None
1564
1572
 
1573
+ def _generate_unique_filename(self, base_name: str) -> str:
1574
+ """Generate a unique filename for a workflow, avoiding collisions.
1575
+
1576
+ Uses the same logic as object_manager:
1577
+ 1. If base name has no collision, use it as-is
1578
+ 2. If collision exists and name ends in a number, find first free prefix + integer
1579
+ 3. If collision exists and name doesn't end in a number, append _1, _2, etc.
1580
+
1581
+ Args:
1582
+ base_name: The desired base name for the workflow
1583
+
1584
+ Returns:
1585
+ A unique filename that doesn't exist in the workspace
1586
+ """
1587
+ workspace_path = GriptapeNodes.ConfigManager().workspace_path
1588
+ base_path = workspace_path.joinpath(f"{base_name}.py")
1589
+ if not base_path.exists():
1590
+ return base_name
1591
+
1592
+ pattern_match = re.search(r"\d+$", base_name)
1593
+ if pattern_match is not None:
1594
+ # Name ends in a number - strip it and find first free integer
1595
+ incremental_prefix = base_name[: pattern_match.start()]
1596
+ else:
1597
+ # Name doesn't end in a number - append underscore prefix
1598
+ incremental_prefix = f"{base_name}_"
1599
+
1600
+ curr_idx = 1
1601
+ while True:
1602
+ candidate_name = f"{incremental_prefix}{curr_idx}"
1603
+ candidate_path = workspace_path.joinpath(f"{candidate_name}.py")
1604
+ if not candidate_path.exists():
1605
+ return candidate_name
1606
+ curr_idx += 1
1607
+
1565
1608
  def _determine_save_target(
1566
1609
  self, requested_file_name: str | None, current_workflow_name: str | None
1567
1610
  ) -> SaveWorkflowTargetInfo:
@@ -1587,27 +1630,25 @@ class WorkflowManager:
1587
1630
  current_workflow = WorkflowRegistry.get_workflow_by_name(current_workflow_name)
1588
1631
 
1589
1632
  # Determine scenario and build target info
1590
- if (target_workflow and target_workflow.metadata.is_template) or (
1591
- current_workflow and current_workflow.metadata.is_template
1592
- ):
1593
- # Template workflows always create new copies with unique names
1633
+ # Only treat as SAVE_FROM_TEMPLATE if this is a Griptape-provided template.
1634
+ # User-marked templates (is_template=True but is_griptape_provided=False) should be saved normally.
1635
+ target_is_griptape_template = (
1636
+ target_workflow and target_workflow.metadata.is_template and target_workflow.metadata.is_griptape_provided
1637
+ )
1638
+ current_is_griptape_template = (
1639
+ current_workflow
1640
+ and current_workflow.metadata.is_template
1641
+ and current_workflow.metadata.is_griptape_provided
1642
+ )
1643
+ if target_is_griptape_template or current_is_griptape_template:
1644
+ # Griptape-provided template workflows always create new copies with unique names
1594
1645
  scenario = WorkflowManager.SaveWorkflowScenario.SAVE_FROM_TEMPLATE
1595
1646
  template_workflow = target_workflow or current_workflow
1596
1647
  if template_workflow is None:
1597
1648
  msg = "Save From Template scenario requires either target_workflow or current_workflow to be present"
1598
1649
  raise ValueError(msg)
1599
1650
  base_name = requested_file_name if requested_file_name else template_workflow.metadata.name
1600
-
1601
- # Find unique filename
1602
- curr_idx = 1
1603
- while True:
1604
- candidate_name = f"{base_name}_{curr_idx}"
1605
- candidate_path = GriptapeNodes.ConfigManager().workspace_path.joinpath(f"{candidate_name}.py")
1606
- if not candidate_path.exists():
1607
- break
1608
- curr_idx += 1
1609
-
1610
- file_name = candidate_name
1651
+ file_name = self._generate_unique_filename(base_name)
1611
1652
  creation_date = datetime.now(tz=UTC)
1612
1653
  branched_from = None
1613
1654
  relative_file_path = f"{file_name}.py"
@@ -3576,6 +3617,7 @@ class WorkflowManager:
3576
3617
  "ui_options",
3577
3618
  "settable",
3578
3619
  "is_user_defined",
3620
+ "private",
3579
3621
  "parent_container_name",
3580
3622
  "parent_element_name",
3581
3623
  ]
@@ -99,3 +99,61 @@ def find_all_files_in_directory(directory: Path, pattern: str) -> list[Path]:
99
99
  logger.debug("Found %d file(s) matching pattern '%s' in directory: %s", len(matches), pattern, directory)
100
100
 
101
101
  return matches
102
+
103
+
104
+ def find_files_recursive(directory: Path, pattern: str, *, skip_hidden: bool = True) -> set[Path]:
105
+ """Search directory recursively for files matching pattern.
106
+
107
+ Args:
108
+ directory: Directory to search in
109
+ pattern: Glob pattern to match files against (e.g., '*.json', '*library*.json')
110
+ skip_hidden: If True, skip hidden directories (those starting with .). Default is True.
111
+ This is more efficient when dealing with large hidden directories like .git, .venv, etc.
112
+
113
+ Returns:
114
+ Set of all matching file paths. Returns empty set if none found.
115
+
116
+ Examples:
117
+ >>> find_files_recursive(Path("/workspace"), "*.json")
118
+ {Path("/workspace/a.json"), Path("/workspace/sub/b.json")}
119
+ >>> find_files_recursive(Path("/workspace"), "*.json", skip_hidden=False)
120
+ {Path("/workspace/a.json"), Path("/workspace/.config/b.json")}
121
+ >>> find_files_recursive(Path("/empty"), "*.txt")
122
+ set()
123
+ """
124
+ if not directory.exists():
125
+ logger.debug("Directory does not exist: %s", directory)
126
+ return set()
127
+
128
+ if not directory.is_dir():
129
+ logger.debug("Path is not a directory: %s", directory)
130
+ return set()
131
+
132
+ def _recurse(path: Path) -> set[Path]:
133
+ """Recursively find files."""
134
+ results = set()
135
+ try:
136
+ for item in path.iterdir():
137
+ # Skip hidden files/directories if requested
138
+ if skip_hidden and item.name.startswith("."):
139
+ continue
140
+
141
+ if item.is_file() and fnmatch(item.name, pattern):
142
+ results.add(item)
143
+ elif item.is_dir():
144
+ # Recurse into directories
145
+ results.update(_recurse(item))
146
+ except (PermissionError, OSError) as e:
147
+ # Skip directories we can't access
148
+ logger.debug("Cannot access directory %s: %s", path, e)
149
+
150
+ return results
151
+
152
+ matches = _recurse(directory)
153
+
154
+ if not matches:
155
+ logger.debug("No files matching pattern '%s' found in directory: %s", pattern, directory)
156
+ else:
157
+ logger.debug("Found %d file(s) matching pattern '%s' in directory: %s", len(matches), pattern, directory)
158
+
159
+ return matches
@@ -1163,6 +1163,7 @@ def _shallow_clone_with_pygit2(remote_url: str, ref: str) -> tuple[str, str, dic
1163
1163
  """
1164
1164
  with tempfile.TemporaryDirectory() as temp_dir:
1165
1165
  temp_path = Path(temp_dir)
1166
+ repo = None # Initialize for finally block
1166
1167
 
1167
1168
  try:
1168
1169
  # Use SSH callbacks for SSH URLs
@@ -1222,6 +1223,11 @@ def _shallow_clone_with_pygit2(remote_url: str, ref: str) -> tuple[str, str, dic
1222
1223
  except pygit2.GitError as e:
1223
1224
  msg = f"Git error during clone from {remote_url}: {e}"
1224
1225
  raise GitCloneError(msg) from e
1226
+ finally:
1227
+ # Release repository file handles before temp directory cleanup
1228
+ # Critical on Windows where open handles prevent directory deletion
1229
+ if repo is not None:
1230
+ repo.free()
1225
1231
 
1226
1232
  return (library_version, commit_sha, library_data)
1227
1233
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: griptape-nodes
3
- Version: 0.66.1
3
+ Version: 0.67.0
4
4
  Summary: Add your description here
5
5
  Requires-Dist: griptape>=1.8.12
6
6
  Requires-Dist: pydantic>=2.10.6
@@ -42,7 +42,7 @@ griptape_nodes/common/macro_parser/matching.py,sha256=hnlPIihz8W1TGnfq4anbBGciwg
42
42
  griptape_nodes/common/macro_parser/parsing.py,sha256=_37L3lCQFeetamWIiHT0C7eW1E3Wyx5V8y8OWzIUw_g,7428
43
43
  griptape_nodes/common/macro_parser/resolution.py,sha256=30_bAIRMKWw-kM3E1ne-my16xT1Wd734JMmZSOZtNPA,6937
44
44
  griptape_nodes/common/macro_parser/segments.py,sha256=r-WbZas1nSc-PlEdAZ7DycNoD6IUf3R_nhGo3T9vIa8,1010
45
- griptape_nodes/common/node_executor.py,sha256=NOHt1U7ASCLBqAlGoxAG4U57kwLdhuSsLmv0ujCvmcc,134316
45
+ griptape_nodes/common/node_executor.py,sha256=BOAeOPHul0qsbyT1HCnw2eotRZELdyH7PelwisBL3wY,137796
46
46
  griptape_nodes/common/project_templates/__init__.py,sha256=5DP6Sa6ClsdDcjD30pkK0iTTysTgGdRKEkeY7ztHZyc,1541
47
47
  griptape_nodes/common/project_templates/default_project_template.py,sha256=PJFPfziH0EOGVxU5L0wZnc21bVVweW4S7wcnGPF45Co,3120
48
48
  griptape_nodes/common/project_templates/defaults/README.md,sha256=1ou6_OFi7-t86nj-7tulW1vxNMtsvkJmNxr6SseG8hA,1080
@@ -65,12 +65,12 @@ griptape_nodes/drivers/thread_storage/thread_storage_backend.py,sha256=QXLvFOZrF
65
65
  griptape_nodes/exe_types/__init__.py,sha256=wGGwKGX9-TSarUFbXpDvdU_J7eXIbWTBl_NCLOZa-G8,32
66
66
  griptape_nodes/exe_types/base_iterative_nodes.py,sha256=z2u4Pb9iqy2Zl3gz_LB7k6hmxYyet1Z6sLjF8afPN_0,43810
67
67
  griptape_nodes/exe_types/connections.py,sha256=HcM_fwWivMsXk5q6K7ZBSJpmK9THQwX_xLS_daF0PDQ,21737
68
- griptape_nodes/exe_types/core_types.py,sha256=TrSd_Z-99epMILmqcnr2kIPeUTuQuC7ghyWAOh0B73E,100822
68
+ griptape_nodes/exe_types/core_types.py,sha256=XrMT0Rf0bPZBcx06f1GUTi5G_IwLgdyzGjBKkUwRh3M,101505
69
69
  griptape_nodes/exe_types/flow.py,sha256=2iAh3vN5wnMVxTc5jcPBg9TSiASq1DGIm5jgpO9Bdq4,5732
70
70
  griptape_nodes/exe_types/node_groups/__init__.py,sha256=N-x5jU8XthYShF9TYnP90pd9DfUE5toiXb5lEoGFL-A,298
71
- griptape_nodes/exe_types/node_groups/base_iterative_node_group.py,sha256=xy05VkgLQORVE_jr5eCkAprCSlTiduCYkZkNHQGH-Cc,6343
72
- griptape_nodes/exe_types/node_groups/base_node_group.py,sha256=jXgmI2lLdCPK6Wh19LxSzsit6wIpRw6AcPqmMF9bjc8,885
73
- griptape_nodes/exe_types/node_groups/subflow_node_group.py,sha256=oIyX0VZcJvJ32KFqAsFbdMvrT-r_z8L8uclrwzCQceU,49972
71
+ griptape_nodes/exe_types/node_groups/base_iterative_node_group.py,sha256=1q8-3Rwlx6bXNDte3K0WMRrrddGfq4nD57W_eKmBE94,7411
72
+ griptape_nodes/exe_types/node_groups/base_node_group.py,sha256=dJofcmERzYQSQ2KB7dC0rOKjbZKW8Ko8eD6r0smBu48,3209
73
+ griptape_nodes/exe_types/node_groups/subflow_node_group.py,sha256=UlZS95TKUCWiHgg6z4Wm1t9xXfUjWhk0L8pB5cXMcV0,48361
74
74
  griptape_nodes/exe_types/node_types.py,sha256=pPljG84zJ6Wd6yzcRjnK0n1805b-Jyzxx7-NFox66QE,84227
75
75
  griptape_nodes/exe_types/param_components/README.md,sha256=mcNFxJIan9CGTnecsrJ8mkHC55dlA3fb7k4HFznou-k,14850
76
76
  griptape_nodes/exe_types/param_components/__init__.py,sha256=ocm75WnsgiD6ozKVGFhoH9cQe_FEzeF2osxrRujOes0,60
@@ -85,18 +85,21 @@ griptape_nodes/exe_types/param_components/huggingface/huggingface_repo_parameter
85
85
  griptape_nodes/exe_types/param_components/huggingface/huggingface_utils.py,sha256=cE0Ht81kDcZjlN_2VoRirCA4zMlrG9GFlcptn-gC2tU,4696
86
86
  griptape_nodes/exe_types/param_components/log_parameter.py,sha256=K6XRWVIpL9MtQ6IZG3hYYwIv3sNqFxONxbVnKcA_Oes,4160
87
87
  griptape_nodes/exe_types/param_components/progress_bar_component.py,sha256=GrAFTOrLNAx6q9zfOqiioPTG_NLHKhTe9NiZOo6zGSc,1949
88
- griptape_nodes/exe_types/param_components/seed_parameter.py,sha256=nXyi9bPCK9LuRB6s4Q2ezwdboIaivEObglNrSFn0y-0,2045
88
+ griptape_nodes/exe_types/param_components/seed_parameter.py,sha256=DUaYJTU8Jafu5sfibKJiO628813C37zMIJLYeXcoeuE,2119
89
89
  griptape_nodes/exe_types/param_types/__init__.py,sha256=xEEmKvIFF6M7zVjQZCupbbv6SZKt-itD-rPtfRhxJVg,53
90
- griptape_nodes/exe_types/param_types/parameter_audio.py,sha256=m9C5bASK6lJFhYkhwly7q6pRWq1q0pc1wGh38nn3kGs,9419
91
- griptape_nodes/exe_types/param_types/parameter_bool.py,sha256=mDbs4JW8dlEPvaR-u_tTKa6rzycF6KF5EPnezoQFufA,8100
92
- griptape_nodes/exe_types/param_types/parameter_button.py,sha256=sFkl7jcQbFOMJk17UEZu0zj6wgAmZ9kfnCZCn_R7L9I,17177
93
- griptape_nodes/exe_types/param_types/parameter_float.py,sha256=qjMTcMNzKkCLBBzlr2vdSweChXr-M-erSqqUVIU95tc,6678
94
- griptape_nodes/exe_types/param_types/parameter_image.py,sha256=YldCdmmpL2jeJNRgwSrWavaMVtC0jXiIuO8Np49PTXs,9318
95
- griptape_nodes/exe_types/param_types/parameter_int.py,sha256=fozMjPfBXL6AIQJ3E5rljloeYdw4ramqh6CU7jsrw24,6827
96
- griptape_nodes/exe_types/param_types/parameter_number.py,sha256=NY3c1iKCNnIZ4BKXGykxmggzr4D9-9GZoZCwQxasp0s,15257
97
- griptape_nodes/exe_types/param_types/parameter_string.py,sha256=8Mrx3Ktw12D78HNzfL19aoMtgUacxyYE9ZyNun8htcI,9468
98
- griptape_nodes/exe_types/param_types/parameter_three_d.py,sha256=G8gf5v_hplzprC-jBPufgtwnpZiqsKlbYnsuwc3D_VI,8278
99
- griptape_nodes/exe_types/param_types/parameter_video.py,sha256=MDjadF3WQIi8EiYAnT0ILOimKU0xIJTKu5HlqWKRE-I,9339
90
+ griptape_nodes/exe_types/param_types/parameter_audio.py,sha256=9oIBtDg6miZDD_5y8VWr6XXjYhsRb9HjSKoaLdgqaHA,9534
91
+ griptape_nodes/exe_types/param_types/parameter_bool.py,sha256=VS76CODOy7_1MJI9spxmi9VwL3fwCxRKaj_8zpqB7dw,8215
92
+ griptape_nodes/exe_types/param_types/parameter_button.py,sha256=lrFnw4dBRKTSsaMxSVMOwtAV8a-Tcex2Tf58u25qCy8,17292
93
+ griptape_nodes/exe_types/param_types/parameter_dict.py,sha256=vbgasnkx9U9-h43geRhLjQ60ekhFlLBvuCVT9wHgWdY,6016
94
+ griptape_nodes/exe_types/param_types/parameter_float.py,sha256=9msvMnmzYGNpqFpGyTT4tswiAlHomo9Y5EiYsydT7IM,6793
95
+ griptape_nodes/exe_types/param_types/parameter_image.py,sha256=FeoqQdr1dj0F60WK0pVyNyzYsZCDjt4JiZQn252Oz3I,9433
96
+ griptape_nodes/exe_types/param_types/parameter_int.py,sha256=06h1QpWaWLeP2tlRRW5IOGO-t_ZlxsWqnezlgoyBKaE,6942
97
+ griptape_nodes/exe_types/param_types/parameter_json.py,sha256=M5A0_XhTKZ8qVBd1db55UA23H3nmaqryaITeN2-GwB0,9961
98
+ griptape_nodes/exe_types/param_types/parameter_number.py,sha256=acmFnpeYI0Gi2yVYmn9ftkruBxR_TpjDrpYi3Kj0vc8,15372
99
+ griptape_nodes/exe_types/param_types/parameter_range.py,sha256=fkCBN0X09fAfTG9AhKQ3Nxkit_8NrFi4IGQPpmOQR8k,14689
100
+ griptape_nodes/exe_types/param_types/parameter_string.py,sha256=-Q_9FwPtCXzpbv1C5FixLEET0c9WLJ228168IaSlZEU,9583
101
+ griptape_nodes/exe_types/param_types/parameter_three_d.py,sha256=wbUeWJUVPJW5JJrkckzGnTM6SsWPSQNupyHGVoBjrOA,8393
102
+ griptape_nodes/exe_types/param_types/parameter_video.py,sha256=_GhpqZwn3kFJIJA7w-oiK2DHFfPW_JosMgUFlWvK6r0,9454
100
103
  griptape_nodes/exe_types/type_validator.py,sha256=RTz1vX09jzQpHhozITMJ0siOZUXvsERDhrApjdaM1WM,1120
101
104
  griptape_nodes/machines/__init__.py,sha256=v0jkwr-CFOLmfEYUQvX8BKQLOdvhSsA6toXkdHcPGUE,30
102
105
  griptape_nodes/machines/control_flow.py,sha256=mmiA7OHXG3Nq36uFPKSGVgqm-ws-T21vzHgvF-um0hg,23007
@@ -122,14 +125,14 @@ griptape_nodes/retained_mode/events/context_events.py,sha256=-FIwjI0hJodDhfM4BF-
122
125
  griptape_nodes/retained_mode/events/execution_events.py,sha256=AQHD04wxQXJDHGnw_ij4QvdUoiMckpMTZqZJX3ehGgA,13512
123
126
  griptape_nodes/retained_mode/events/flow_events.py,sha256=UcRHfaubb1GpDFSPg-5HRWrPnA7ifH1zBMYtWnYNy_E,19434
124
127
  griptape_nodes/retained_mode/events/generate_request_payload_schemas.py,sha256=PQ0QRZAUBljSIGjB8QhYUeRmSrfmLsJ6XVcygJKi13I,1102
125
- griptape_nodes/retained_mode/events/library_events.py,sha256=Ke9B7pzhiJk_ctmZPJqilzHhZXByG4B2rArG6ec9KF4,36085
128
+ griptape_nodes/retained_mode/events/library_events.py,sha256=4NUc3uoLgofo1X9nrCVl2zPX3hsnk06Oo4Op0AQKA5o,36229
126
129
  griptape_nodes/retained_mode/events/logger_events.py,sha256=jYlxzPomgCsJuPtJ0znWBhD8QJfC8qC4xfChDiuVuyg,705
127
130
  griptape_nodes/retained_mode/events/mcp_events.py,sha256=51OlMZVcabdcIxBb_ojvrHtq2jAzZA31pooPBKaApyg,10734
128
131
  griptape_nodes/retained_mode/events/model_events.py,sha256=jXm-v-_Uxysn4MJ7a80_uIphrxTHgua3BGgHGyy3T_Y,9232
129
132
  griptape_nodes/retained_mode/events/node_events.py,sha256=vpILjBkgrPzF_KSow2EJCwcU-tDD78WEWM2DAAzhhiE,37720
130
133
  griptape_nodes/retained_mode/events/object_events.py,sha256=cJaqEU73Lzf1RRxJrFqEpl8eTr-gDhKpXKywJ-vVCJQ,2631
131
134
  griptape_nodes/retained_mode/events/os_events.py,sha256=fVraPXCz48kDpCTttJFtsyfTfkaLSfTX57hexYSD7I8,23429
132
- griptape_nodes/retained_mode/events/parameter_events.py,sha256=2s3U_cc45LjSmq2pZyTEnjD6yAlc207wAYY633z4zO4,23938
135
+ griptape_nodes/retained_mode/events/parameter_events.py,sha256=TazVXxvfv64n3XJzToOQKiWQ1UIzrUAB4ri_QIvZ2ng,26968
133
136
  griptape_nodes/retained_mode/events/payload_registry.py,sha256=q-wxUqp63vhNj-Pl1JGJHnBkhUefcCArPoMN3KBREEI,1691
134
137
  griptape_nodes/retained_mode/events/project_events.py,sha256=C_jHk_7dRJLtbRgCi8IGe-mH46tueuTxLxGL7xxZVBI,17096
135
138
  griptape_nodes/retained_mode/events/resource_events.py,sha256=K47UK92wvaRtHu3ByfhkQEMyorrV0ArGewrFSJuVMiI,9015
@@ -146,7 +149,7 @@ griptape_nodes/retained_mode/managers/arbitrary_code_exec_manager.py,sha256=LyWz
146
149
  griptape_nodes/retained_mode/managers/config_manager.py,sha256=74AMeaCS0eOeFbzMk5I54MtB7-SNQbwlx_-O6zBBQRo,26739
147
150
  griptape_nodes/retained_mode/managers/context_manager.py,sha256=eb44_CAZhCg2iYIoodlAPpYc67tG3sHyq9dPNoiq_1s,23031
148
151
  griptape_nodes/retained_mode/managers/engine_identity_manager.py,sha256=-31364A03kU0YmAx3nM7nHdWfKnkej5Cawt_Plbwa68,10526
149
- griptape_nodes/retained_mode/managers/event_manager.py,sha256=v66GUmh5Knyxls-lB3TicsOxK535A7aZkmjDOIehbog,20537
152
+ griptape_nodes/retained_mode/managers/event_manager.py,sha256=jiUX3WW6Hz0Z4Y1dK1X7fMwZawT3_BOKl_Dbiui-iNQ,26933
150
153
  griptape_nodes/retained_mode/managers/fitness_problems/__init__.py,sha256=H_Wwfn1k_IaxwRxgbw3-seb1HWbcxl2Cvhw7wB7bCo8,75
151
154
  griptape_nodes/retained_mode/managers/fitness_problems/libraries/__init__.py,sha256=vjyI8VUKNieAhlLlaxoUZZK9AxacdbajHVVFTPo_82A,3340
152
155
  griptape_nodes/retained_mode/managers/fitness_problems/libraries/advanced_library_load_failure_problem.py,sha256=Z7bIE_Ll4qqsG-D_PLe48r3ZuUCChgk04mopDvZ5MD0,1215
@@ -198,10 +201,10 @@ griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_not_fo
198
201
  griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_problem.py,sha256=NLAoF_x7g5tL70qZtPVFI8xeM1jPZNsm7FKt9nkuGBc,542
199
202
  griptape_nodes/retained_mode/managers/fitness_problems/workflows/workflow_schema_version_problem.py,sha256=rUnbBBnGwgq5WTVPt2G4pGP3gVPoX5xvCdTkRPBmP04,1328
200
203
  griptape_nodes/retained_mode/managers/flow_manager.py,sha256=0Z8hNjfwlnJgQGOsQf3MEvQnkPLeQBXe2ZuixUov2QY,220137
201
- griptape_nodes/retained_mode/managers/library_manager.py,sha256=vNIwBweMIO84gJp05M_vBFYW2JjTyCpQa4G62ACsBP4,191730
204
+ griptape_nodes/retained_mode/managers/library_manager.py,sha256=paogGavZj2MDOYvfUklhjORQg16YdpVGBxBncVSxtR0,192265
202
205
  griptape_nodes/retained_mode/managers/mcp_manager.py,sha256=Ezmn5_48r4JWYe-tFGqmw9dXLvvTiO1rw9b4MNCkw0U,15955
203
206
  griptape_nodes/retained_mode/managers/model_manager.py,sha256=3lj2X8vIvDSERPtR2VEXNFEWy_D8H6muxRvD-PEx8U8,44845
204
- griptape_nodes/retained_mode/managers/node_manager.py,sha256=LVF7_KCb01mJ_fAaCfg_9D0Rw40KKxRSr3n3nsRg8Ss,215328
207
+ griptape_nodes/retained_mode/managers/node_manager.py,sha256=KbThJ5fvBTuF9EEIqBT37Rop41_7o-irb_-KY8hkXVY,225038
205
208
  griptape_nodes/retained_mode/managers/object_manager.py,sha256=xABsjpE1_HLEIFwYj60zDOLi18EqrYUBuNaj37lUcH4,12921
206
209
  griptape_nodes/retained_mode/managers/operation_manager.py,sha256=4Vn_79vHrawy3wJVUx52tfblO4mURww58nb5RtCTpKU,20190
207
210
  griptape_nodes/retained_mode/managers/os_manager.py,sha256=Ttgj6R063p2Yf1lcdeSTB2xOTg94MIDCMPxO8FDczEQ,142397
@@ -224,7 +227,7 @@ griptape_nodes/retained_mode/managers/sync_manager.py,sha256=dF6nAAy1DLDQydefx7v
224
227
  griptape_nodes/retained_mode/managers/user_manager.py,sha256=JAOOKDhUfIbj0CJ5EHRBcplmxheQTzeogbvGO23VqXQ,4508
225
228
  griptape_nodes/retained_mode/managers/variable_manager.py,sha256=TnuqHSRK9Yiu_EtKxQksF9SyyQb72lbFQuTQZdpBxeE,24116
226
229
  griptape_nodes/retained_mode/managers/version_compatibility_manager.py,sha256=kaCtmNMqJW-mvLCFHf77wbBZbc3CgW2h8fYYkLkNrPs,17041
227
- griptape_nodes/retained_mode/managers/workflow_manager.py,sha256=VCOV0BfkW9ynLhmH7jRvcEJnFr6YiAF0f76sc9wCjBg,215471
230
+ griptape_nodes/retained_mode/managers/workflow_manager.py,sha256=n6jmr966Y_0MPd9aaOssX2CYgojf_mNRxC07990Anec,217769
228
231
  griptape_nodes/retained_mode/retained_mode.py,sha256=dG8FFpLXSxT49naOcphEq2aSRCEVoQyklWgaDljjuDA,71728
229
232
  griptape_nodes/retained_mode/utils/__init__.py,sha256=W5dvv8YwvVVq_8eVTgMd3Z_VB_Dtq1sIIVq8745QH_I,52
230
233
  griptape_nodes/retained_mode/utils/name_generator.py,sha256=IZLahtfP3XC79XApLdGoZ0IKKUkgiITpd16RK7NbyEs,2524
@@ -252,8 +255,8 @@ griptape_nodes/updater/__main__.py,sha256=lhMMctbBeni57ximitvkwqJ1TQzk79Jg9w0rkK
252
255
  griptape_nodes/utils/__init__.py,sha256=kzDZW_VPyxWJFonM3kYTl7A91_JmtHPK0Io4KPLTYT4,122
253
256
  griptape_nodes/utils/async_utils.py,sha256=4IrW8Ub8iJ2QB9yguZtfN1EB9B5nXHS7jbDaLOHWso0,4844
254
257
  griptape_nodes/utils/dict_utils.py,sha256=1VP2EoyOP0nswoAgjPehpA0izpkygWRX7L--ArN6LV8,7314
255
- griptape_nodes/utils/file_utils.py,sha256=Lj1SQH8XyuJx3WoHmWhyZf2gHPirZ0ZpQtPPcuP-ONQ,3288
256
- griptape_nodes/utils/git_utils.py,sha256=J25Z3_Kh567oRd4enjHDF9GbRnpuO1U7irHfrDkqqQs,45388
258
+ griptape_nodes/utils/file_utils.py,sha256=D7VBkYl2MI0GUHdvI3IDB-fRN2XTp4xDpANnUcnEVvY,5524
259
+ griptape_nodes/utils/git_utils.py,sha256=Gz55JqSFPuxbTzvnXHKHsbMy3PvkNDAYyMQ7szekcL0,45674
257
260
  griptape_nodes/utils/huggingface_utils.py,sha256=txR5XS_01W3TvsH4SQ3AJrFy8oS8Ah9M-ePRSs3jHYA,4737
258
261
  griptape_nodes/utils/image_preview.py,sha256=NhYIqohRF9vbFpWIEvZHdPLLPK_JdUBvC4RvNAsSa1w,4480
259
262
  griptape_nodes/utils/library_utils.py,sha256=UwTdOJcPwJljWYD-DbctjExicaw-6isXZ-Js02jrGCw,4224
@@ -272,7 +275,7 @@ griptape_nodes/version_compatibility/versions/v0_65_5/__init__.py,sha256=4UyspOV
272
275
  griptape_nodes/version_compatibility/versions/v0_65_5/flux_2_removed_parameters.py,sha256=jOlmY5kKHXh8HPzAUtvwMJqzD4bP7pkE--yHUb7jTRA,3305
273
276
  griptape_nodes/version_compatibility/versions/v0_7_0/__init__.py,sha256=IzPPmGK86h2swfGGTOHyVcBIlOng6SjgWQzlbf3ngmo,51
274
277
  griptape_nodes/version_compatibility/versions/v0_7_0/local_executor_argument_addition.py,sha256=Thx8acnbw5OychhwEEj9aFxvbPe7Wgn4V9ZmZ7KRZqc,2082
275
- griptape_nodes-0.66.1.dist-info/WHEEL,sha256=ZyFSCYkV2BrxH6-HRVRg3R9Fo7MALzer9KiPYqNxSbo,79
276
- griptape_nodes-0.66.1.dist-info/entry_points.txt,sha256=qvevqd3BVbAV5TcantnAm0ouqaqYKhsRO3pkFymWLWM,82
277
- griptape_nodes-0.66.1.dist-info/METADATA,sha256=wf5GdcViPaYyMMpwKRLIExwSWNmDg3hl2UWcuWVNRZc,5374
278
- griptape_nodes-0.66.1.dist-info/RECORD,,
278
+ griptape_nodes-0.67.0.dist-info/WHEEL,sha256=KSLUh82mDPEPk0Bx0ScXlWL64bc8KmzIPNcpQZFV-6E,79
279
+ griptape_nodes-0.67.0.dist-info/entry_points.txt,sha256=qvevqd3BVbAV5TcantnAm0ouqaqYKhsRO3pkFymWLWM,82
280
+ griptape_nodes-0.67.0.dist-info/METADATA,sha256=1YMtiTN8fY4LDSKw5JlmUaQpIK6ehIW-vHAZtLGdM3k,5374
281
+ griptape_nodes-0.67.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.9.18
2
+ Generator: uv 0.9.22
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any