griptape-nodes 0.47.0__py3-none-any.whl → 0.48.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.
griptape_nodes/app/app.py CHANGED
@@ -118,7 +118,7 @@ def _ensure_api_key() -> str:
118
118
  "[code]gtn init --api-key <your key>[/code]\n"
119
119
  "[bold red]You can generate a new key from [/bold red][bold blue][link=https://nodes.griptape.ai]https://nodes.griptape.ai[/link][/bold blue]",
120
120
  ),
121
- title="🔑 Missing Nodes API Key",
121
+ title="[red]X[/red] Missing Nodes API Key",
122
122
  border_style="red",
123
123
  padding=(1, 4),
124
124
  )
@@ -1450,6 +1450,70 @@ class ParameterList(ParameterContainer):
1450
1450
  self.remove_child(child)
1451
1451
  del child
1452
1452
 
1453
+ # --- Convenience methods for stable list management ---
1454
+ def get_child_parameters(self) -> list[Parameter]:
1455
+ """Return direct child parameters only, in order of appearance."""
1456
+ return self.find_elements_by_type(element_type=Parameter, find_recursively=False)
1457
+
1458
+ def append_child_parameter(self, display_name: str | None = None) -> Parameter:
1459
+ """Append one child parameter and optionally set a display name.
1460
+
1461
+ This preserves existing children and adds a new one at the end.
1462
+ """
1463
+ child = self.add_child_parameter()
1464
+ if display_name is not None:
1465
+ ui_opts = child.ui_options or {}
1466
+ ui_opts["display_name"] = display_name
1467
+ child.ui_options = ui_opts
1468
+ return child
1469
+
1470
+ def remove_last_child_parameter(self) -> None:
1471
+ """Remove the last child parameter if one exists.
1472
+
1473
+ This removes from the end to preserve earlier children and their connections.
1474
+ """
1475
+ children = self.get_child_parameters()
1476
+ if children:
1477
+ last = children[-1]
1478
+ self.remove_child(last)
1479
+ del last
1480
+
1481
+ def ensure_length(self, desired_count: int, display_name_prefix: str | None = None) -> None:
1482
+ """Grow or shrink the list to the desired length while preserving existing items.
1483
+
1484
+ - If increasing, appends new children to the end.
1485
+ - If decreasing, removes children from the end.
1486
+ - Optionally sets display names like "{prefix} 1", "{prefix} 2", ...
1487
+ """
1488
+ if desired_count is None:
1489
+ return
1490
+ try:
1491
+ desired_count = int(desired_count)
1492
+ except Exception:
1493
+ desired_count = 0
1494
+ desired_count = max(desired_count, 0)
1495
+
1496
+ current_children = self.get_child_parameters()
1497
+ current_len = len(current_children)
1498
+
1499
+ # Grow
1500
+ if current_len < desired_count:
1501
+ for index in range(current_len, desired_count):
1502
+ name = f"{display_name_prefix} {index + 1}" if display_name_prefix else None
1503
+ self.append_child_parameter(display_name=name)
1504
+
1505
+ # Shrink
1506
+ elif current_len > desired_count:
1507
+ for _ in range(current_len - desired_count):
1508
+ self.remove_last_child_parameter()
1509
+
1510
+ # Optionally re-apply display names to existing children to keep indices tidy
1511
+ if display_name_prefix:
1512
+ for index, child in enumerate(self.get_child_parameters()):
1513
+ ui_opts = child.ui_options or {}
1514
+ ui_opts["display_name"] = f"{display_name_prefix} {index + 1}"
1515
+ child.ui_options = ui_opts
1516
+
1453
1517
  def add_child(self, child: BaseNodeElement) -> None:
1454
1518
  """Override to mark parent node as unresolved when children are added.
1455
1519
 
@@ -849,21 +849,11 @@ class BaseNode(ABC):
849
849
  # Create event data using the parameter's to_event method
850
850
  if remove:
851
851
  # Import logger here to avoid circular dependency
852
- from griptape_nodes.retained_mode.griptape_nodes import logger
853
-
854
- logger.info(
855
- f"RemoveElementEvent: Emitting parameter lifecycle event for element {parameter.name} on node {self.name}"
856
- )
857
852
  event = ExecutionGriptapeNodeEvent(
858
853
  wrapped_event=ExecutionEvent(payload=RemoveElementEvent(element_id=parameter.element_id))
859
854
  )
860
855
  else:
861
856
  event_data = parameter.to_event(self)
862
- from griptape_nodes.retained_mode.griptape_nodes import logger
863
-
864
- logger.info(
865
- f"AlterElementEvent: Emitting parameter lifecycle eventfor element {parameter.name} on node {self.name}"
866
- )
867
857
  # Publish the event
868
858
  event = ExecutionGriptapeNodeEvent(
869
859
  wrapped_event=ExecutionEvent(payload=AlterElementEvent(element_details=event_data))
@@ -1063,11 +1053,17 @@ class EndNode(BaseNode):
1063
1053
 
1064
1054
 
1065
1055
  class StartLoopNode(BaseNode):
1066
- finished: bool
1067
- current_index: int
1068
1056
  end_node: EndLoopNode | None = None
1069
1057
  """Creating class for Start Loop Node in order to implement loop functionality in execution."""
1070
1058
 
1059
+ @abstractmethod
1060
+ def is_loop_finished(self) -> bool:
1061
+ """Return True if the loop has finished executing.
1062
+
1063
+ This method must be implemented by subclasses to define when
1064
+ the loop should terminate.
1065
+ """
1066
+
1071
1067
 
1072
1068
  class EndLoopNode(BaseNode):
1073
1069
  start_node: StartLoopNode | None = None
@@ -41,7 +41,7 @@ class WebSocketConnectionManager:
41
41
  try:
42
42
  message = json.dumps(data)
43
43
  await self.websocket.send(message)
44
- logger.debug("📤 Sent message: %s", message)
44
+ logger.debug("Sent message: %s", message)
45
45
  except Exception as e:
46
46
  logger.error("Failed to send message: %s", e)
47
47
  raise
@@ -157,7 +157,7 @@ class AsyncRequestManager(Generic[T]): # noqa: UP046
157
157
 
158
158
  except Exception as e:
159
159
  self.connection_manager.connected = False
160
- logger.error("🔴 WebSocket connection failed: %s", str(e))
160
+ logger.error("[red]X[/red] WebSocket connection failed: %s", str(e))
161
161
  msg = f"Failed to connect to WebSocket: {e!s}"
162
162
  raise ConnectionError(msg) from e
163
163
 
@@ -192,7 +192,7 @@ class AsyncRequestManager(Generic[T]): # noqa: UP046
192
192
  """Send an event to the API without waiting for a response."""
193
193
  from griptape_nodes.app.app import _determine_request_topic
194
194
 
195
- logger.debug("📝 Creating Event: %s - %s", request_type, json.dumps(payload))
195
+ logger.debug("Creating Event: %s - %s", request_type, json.dumps(payload))
196
196
 
197
197
  data = {"event_type": "EventRequest", "request_type": request_type, "request": payload}
198
198
  topic = _determine_request_topic()
@@ -231,7 +231,7 @@ class AsyncRequestManager(Generic[T]): # noqa: UP046
231
231
  def success_handler(response: Any, _: Any) -> None:
232
232
  if not response_future.done():
233
233
  result = response.get("payload", {}).get("result", "Success")
234
- logger.debug(" Request succeeded: %s", result)
234
+ logger.debug("[green]OK[/green] Request succeeded: %s", result)
235
235
  response_future.set_result(result)
236
236
 
237
237
  def failure_handler(response: Any, _: Any) -> None:
@@ -239,14 +239,14 @@ class AsyncRequestManager(Generic[T]): # noqa: UP046
239
239
  error = (
240
240
  response.get("payload", {}).get("result", {}).get("exception", "Unknown error") or "Unknown error"
241
241
  )
242
- logger.error(" Request failed: %s", error)
242
+ logger.error("[red]X[/red] Request failed: %s", error)
243
243
  response_future.set_exception(Exception(error))
244
244
 
245
245
  # Generate request ID and subscribe
246
246
  request_id = self.connection_manager.subscribe_to_request_event(success_handler, failure_handler)
247
247
  payload["request_id"] = request_id
248
248
 
249
- logger.debug("🚀 Request (%s): %s %s", request_id, request_type, json.dumps(payload))
249
+ logger.debug("Request (%s): %s %s", request_id, request_type, json.dumps(payload))
250
250
 
251
251
  try:
252
252
  # Send the event
@@ -240,10 +240,10 @@ class LibraryManager:
240
240
 
241
241
  # Status emojis mapping
242
242
  status_emoji = {
243
- LibraryStatus.GOOD: "",
244
- LibraryStatus.FLAWED: "🟡",
245
- LibraryStatus.UNUSABLE: "",
246
- LibraryStatus.MISSING: "",
243
+ LibraryStatus.GOOD: "[green]OK[/green]",
244
+ LibraryStatus.FLAWED: "[yellow]![/yellow]",
245
+ LibraryStatus.UNUSABLE: "[red]X[/red]",
246
+ LibraryStatus.MISSING: "[red]?[/red]",
247
247
  }
248
248
 
249
249
  # Add rows for each library info
@@ -256,7 +256,7 @@ class LibraryManager:
256
256
  # Library name column with emoji based on status
257
257
  emoji = status_emoji.get(lib_info.status, "ERROR: Unknown/Unexpected Library Status")
258
258
  name = lib_info.library_name if lib_info.library_name else "*UNKNOWN*"
259
- library_name = f"{emoji} {name}"
259
+ library_name = f"{emoji} - {name}"
260
260
 
261
261
  library_version = lib_info.library_version
262
262
  if library_version:
@@ -1596,7 +1596,7 @@ class LibraryManager:
1596
1596
  f"[bold blue]Return to: [link={nodes_app_url}]{nodes_app_url}[/link] to access the Workflow Editor[/bold blue]",
1597
1597
  vertical="middle",
1598
1598
  ),
1599
- title="🚀 Griptape Nodes Engine Started",
1599
+ title="Griptape Nodes Engine Started",
1600
1600
  subtitle=f"[green]{engine_version}{session_info}[/green]",
1601
1601
  border_style="green",
1602
1602
  padding=(1, 4),
@@ -167,10 +167,7 @@ class StaticFilesManager:
167
167
 
168
168
  try:
169
169
  response = httpx.request(
170
- response["method"],
171
- response["url"],
172
- content=data,
173
- headers=response["headers"],
170
+ response["method"], response["url"], content=data, headers=response["headers"], timeout=60
174
171
  )
175
172
  response.raise_for_status()
176
173
  except httpx.HTTPStatusError as e:
@@ -389,19 +389,19 @@ class WorkflowManager:
389
389
 
390
390
  # Status emojis mapping
391
391
  status_emoji = {
392
- self.WorkflowStatus.GOOD: "",
393
- self.WorkflowStatus.FLAWED: "🟡",
394
- self.WorkflowStatus.UNUSABLE: "",
395
- self.WorkflowStatus.MISSING: "",
392
+ self.WorkflowStatus.GOOD: "[green]OK[/green]",
393
+ self.WorkflowStatus.FLAWED: "[yellow]![/yellow]",
394
+ self.WorkflowStatus.UNUSABLE: "[red]X[/red]",
395
+ self.WorkflowStatus.MISSING: "[red]?[/red]",
396
396
  }
397
397
 
398
398
  dependency_status_emoji = {
399
- self.WorkflowDependencyStatus.PERFECT: "",
400
- self.WorkflowDependencyStatus.GOOD: "👌",
401
- self.WorkflowDependencyStatus.CAUTION: "🟡",
402
- self.WorkflowDependencyStatus.BAD: "",
403
- self.WorkflowDependencyStatus.MISSING: "",
404
- self.WorkflowDependencyStatus.UNKNOWN: "",
399
+ self.WorkflowDependencyStatus.PERFECT: "[green]OK[/green]",
400
+ self.WorkflowDependencyStatus.GOOD: "[green]GOOD[/green]",
401
+ self.WorkflowDependencyStatus.CAUTION: "[yellow]CAUTION[/yellow]",
402
+ self.WorkflowDependencyStatus.BAD: "[red]BAD[/red]",
403
+ self.WorkflowDependencyStatus.MISSING: "[red]MISSING[/red]",
404
+ self.WorkflowDependencyStatus.UNKNOWN: "[red]UNKNOWN[/red]",
405
405
  }
406
406
 
407
407
  # Add rows for each workflow info
@@ -414,7 +414,7 @@ class WorkflowManager:
414
414
  # Workflow name column with emoji based on status
415
415
  emoji = status_emoji.get(wf_info.status, "ERR: Unknown/Unexpected Workflow Status")
416
416
  name = wf_info.workflow_name if wf_info.workflow_name else "*UNKNOWN*"
417
- workflow_name = f"{emoji} {name}"
417
+ workflow_name = f"{emoji} - {name}"
418
418
 
419
419
  # Problems column - format with numbers if there's more than one
420
420
  problems = "\n".join(wf_info.problems) if wf_info.problems else "No problems detected."
@@ -423,11 +423,11 @@ class WorkflowManager:
423
423
  if wf_info.status == self.WorkflowStatus.MISSING or (
424
424
  wf_info.status == self.WorkflowStatus.UNUSABLE and not wf_info.workflow_dependencies
425
425
  ):
426
- dependencies = " UNKNOWN"
426
+ dependencies = "[red]?[/red] UNKNOWN"
427
427
  else:
428
428
  dependencies = (
429
429
  "\n".join(
430
- f"{dependency_status_emoji.get(dep.status, '?')} {dep.library_name} ({dep.version_requested}): {dep.status.value}"
430
+ f"{dependency_status_emoji.get(dep.status, '?')} - {dep.library_name} ({dep.version_requested}): {dep.status.value}"
431
431
  for dep in wf_info.workflow_dependencies
432
432
  )
433
433
  if wf_info.workflow_dependencies
@@ -886,7 +886,12 @@ class WorkflowManager:
886
886
  # See how our desired version compares against the actual library we (may) have.
887
887
  # See if the library exists.
888
888
  library_metadata_request = GetLibraryMetadataRequest(library=library_name)
889
- library_metadata_result = GriptapeNodes.handle_request(library_metadata_request)
889
+ # NOTE: Per https://github.com/griptape-ai/griptape-vsl-gui/issues/1123, we
890
+ # generate a FLOOD of error messages here that can swamp the GUI. We'll call
891
+ # directly instead of the usual handle_request() path so we don't generate those.
892
+ library_metadata_result = GriptapeNodes.LibraryManager().get_library_metadata_request(
893
+ library_metadata_request
894
+ )
890
895
  if not isinstance(library_metadata_result, GetLibraryMetadataResultSuccess):
891
896
  # Metadata failed to be found.
892
897
  had_critical_error = True
@@ -125,10 +125,10 @@ def command_arg_handler(node_param_split_func: Callable) -> Callable:
125
125
  instance_or_cls,
126
126
  node=node,
127
127
  param=param,
128
- *args_to_process,
128
+ *args_to_process, # noqa: B026
129
129
  **cleaned_kwargs,
130
130
  )
131
- return func(node=node, param=param, *args_to_process, **cleaned_kwargs)
131
+ return func(node=node, param=param, *args_to_process, **cleaned_kwargs) # noqa: B026
132
132
 
133
133
  return wrapper
134
134
 
@@ -1460,7 +1460,7 @@ class RetainedMode:
1460
1460
  if command_name:
1461
1461
  func = getattr(cls, command_name, None)
1462
1462
  if not func or not callable(func):
1463
- return f" No such command: {command_name}"
1463
+ return f"[red]X[/red] No such command: {command_name}"
1464
1464
 
1465
1465
  doc = inspect.getdoc(func) or "No documentation available."
1466
1466
  sig_lines = _fancy_signature(func)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: griptape-nodes
3
- Version: 0.47.0
3
+ Version: 0.48.0
4
4
  Summary: Add your description here
5
5
  Requires-Dist: griptape>=1.8.0
6
6
  Requires-Dist: pydantic>=2.10.6
@@ -2,7 +2,7 @@ griptape_nodes/__init__.py,sha256=086f45e6ae694a24d828e6a1823376b75b6e64bf05ae95
2
2
  griptape_nodes/app/.python-version,sha256=7b55f8e67b5623c4bef3fa691288da9437d79d3aba156de48d481db32ac7d16d,5
3
3
  griptape_nodes/app/__init__.py,sha256=0c1f834ec81c3676e6102957128bb0cc686b9a8de01c10965c1f4190f1a97502,90
4
4
  griptape_nodes/app/api.py,sha256=46a36af068a4784b0317daede79befd59198320c3934ee1b84c74b297108774f,6925
5
- griptape_nodes/app/app.py,sha256=eed6bcbe52e556eff4e250af915940c574028f1d799ffeb17b0f6259ed401ba8,17743
5
+ griptape_nodes/app/app.py,sha256=764f9ef01e11bd5649bc0b0b3e72c4a7e113b5c94eb2236770152cfd81a0eafa,17747
6
6
  griptape_nodes/app/watch.py,sha256=413353c7811b54440276277250d766b3be30edf8eb8c128069dbb52d40e9e962,2064
7
7
  griptape_nodes/bootstrap/__init__.py,sha256=10dbf7488cd0f53b6546b835cb87b80a7a01a49685a454a43694c5055f17e4bb,25
8
8
  griptape_nodes/bootstrap/workflow_executors/__init__.py,sha256=a728cdf35f9e2ed8f21021582d73ad3028b18a223da818b9c9a95df3a88cec49,34
@@ -17,9 +17,9 @@ griptape_nodes/drivers/storage/local_storage_driver.py,sha256=3e912fb41fd35a0e5c
17
17
  griptape_nodes/drivers/storage/storage_backend.py,sha256=dd0048c2b80f73592b04888f60ba0adacc2120f0e22899e7b9c384772c7bcb77,184
18
18
  griptape_nodes/exe_types/__init__.py,sha256=c061b02865fdf9349aad415b5e90ef754fc9ede5c86d64c197f3422ce65af86f,32
19
19
  griptape_nodes/exe_types/connections.py,sha256=ffe54dcdfe8a6b2eb6433265497f8b9474d4873f82285f940ec6d92c9d25e969,12435
20
- griptape_nodes/exe_types/core_types.py,sha256=9cc1c97eb0119d10a056617ecb73133665ef5c3b6fa3a7ea6c054a15d60ee9e1,68407
20
+ griptape_nodes/exe_types/core_types.py,sha256=717894764822cad1cedc893adba82cac334a1070087a36fecaad3c9c3e583962,71043
21
21
  griptape_nodes/exe_types/flow.py,sha256=a42793af1f32ad480bc3553dc90c42edaaf3263c8fdaf6a0fa91b44132aeb7e3,5716
22
- griptape_nodes/exe_types/node_types.py,sha256=188f0386434b42e965fa1359eb994356bb7572cac67b0e5f1cc094ec4c419e6d,47726
22
+ griptape_nodes/exe_types/node_types.py,sha256=50ac21cb902277f5e3c42e83c8c16001a6fdbc4c8b6e09f62312204351fe5ec8,47447
23
23
  griptape_nodes/exe_types/type_validator.py,sha256=453cf5bd7d3d8f34291e1a33213309d2c88e6545efb0444386b0298dd68cd563,1120
24
24
  griptape_nodes/machines/__init__.py,sha256=bf48e4c2bf8214e2e67c461442f5fc04a40b39dbe14ac03ab685e474770f1941,30
25
25
  griptape_nodes/machines/control_flow.py,sha256=ac7e9d4555eb0aa5c30cfa182d4df542e661f24b8871113bb26962de917451d5,9843
@@ -27,7 +27,7 @@ griptape_nodes/machines/fsm.py,sha256=83a7c5c9ea0d6c8711fe1eb732dd0bdac7233ae589
27
27
  griptape_nodes/machines/node_resolution.py,sha256=ef4f5c461bdce92bb722c6b6a839c86d7f3be9a5e336e9b33f6160eafdb3a704,22145
28
28
  griptape_nodes/mcp_server/__init__.py,sha256=192a495aa13894809aaf286c411d6891e307db1ea3d5b04bd07571b6be7658b8,42
29
29
  griptape_nodes/mcp_server/server.py,sha256=c53f5ad20677ebadd1a3da5173817969aef37b7ba96d2539a8b3ce7a9fd16a0c,5058
30
- griptape_nodes/mcp_server/ws_request_manager.py,sha256=44c8d6cdf55eee12682afce81657687c7652cad51b8ad00737266dc942781802,10935
30
+ griptape_nodes/mcp_server/ws_request_manager.py,sha256=28502ac205c3d45a3528bcc4f5f731dec014e0160544da83eff73237df1b47b1,10951
31
31
  griptape_nodes/node_library/__init__.py,sha256=53715c49d9aae945bbaade84dd4a773562af5049f9ff996a2febb9a9bcdfc4c4,28
32
32
  griptape_nodes/node_library/advanced_node_library.py,sha256=07565ac6e148cd0eadc7fdcc2c8c65b07b9a86d8440b51f0fede8afc1c88773b,2104
33
33
  griptape_nodes/node_library/library_registry.py,sha256=7c4d4d17ef527913cafe958f4207de0c1b0ccefc620254a13c1be2ef50c21bd4,12099
@@ -78,7 +78,7 @@ griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/packa
78
78
  griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance/sandbox.py,sha256=df6b23dba767b3cbaf408654c47366083b0ac975190cffcf34a89f5cf5167878,6111
79
79
  griptape_nodes/retained_mode/managers/library_lifecycle/library_provenance.py,sha256=7021abf8c4354655418944d97a960429d5613e00b879b718ae6a6ff2b23755e3,894
80
80
  griptape_nodes/retained_mode/managers/library_lifecycle/library_status.py,sha256=2b750407301d098f70a61c816cbc4360fd10e37698be12d9fcfcfbfd2cdc3de7,443
81
- griptape_nodes/retained_mode/managers/library_manager.py,sha256=a234d2cee308d21b25798d6fb0275cdf1f23827bc53bc1392fa7a23ea387866d,98773
81
+ griptape_nodes/retained_mode/managers/library_manager.py,sha256=c89cf240000f6bcf940a4e3106d968694787f51417ec5f90b1738c0852294f11,98816
82
82
  griptape_nodes/retained_mode/managers/node_manager.py,sha256=6710033aa69ae8d4a818b585264737ab14c68fffdb9f59225d889e418c818294,135551
83
83
  griptape_nodes/retained_mode/managers/object_manager.py,sha256=b483de02217de29b48a57c4cdbda858104da5dacd1817edf69324b57cef25991,12403
84
84
  griptape_nodes/retained_mode/managers/operation_manager.py,sha256=95390c66569a71382d579a15f9817a1c6f31b31f55fcbc17d5e834ef8593b369,20137
@@ -86,11 +86,11 @@ griptape_nodes/retained_mode/managers/os_manager.py,sha256=6cf2580a42404a2b1b5ae
86
86
  griptape_nodes/retained_mode/managers/secrets_manager.py,sha256=e8c4ef9d74148d85ee0b35c8961a33298a05d634e4e81ac388c2febdea6a69f6,6384
87
87
  griptape_nodes/retained_mode/managers/session_manager.py,sha256=7cb8ed06f80663775aab5bdba493d7ab4ebd9f7e59f99af9745dc1d17c83d896,11817
88
88
  griptape_nodes/retained_mode/managers/settings.py,sha256=c003d01655079b0e6740ac53fbd070ff2c5db9ac5ced71ed75e85d1c386a5197,4665
89
- griptape_nodes/retained_mode/managers/static_files_manager.py,sha256=9575fa0c439cb79a9e2eeeb3aef75a8aafd6eb152a0d90657094b0a3977ce862,7376
89
+ griptape_nodes/retained_mode/managers/static_files_manager.py,sha256=704b735a84ec975b09c98c955ab7763bb90f4a9435ae3458c7b3ff2e6e70b45f,7339
90
90
  griptape_nodes/retained_mode/managers/sync_manager.py,sha256=a15b452d06be4b88a21b0baecbc609d2566f6e4175d3a544de35b6aa3090a103,20671
91
91
  griptape_nodes/retained_mode/managers/version_compatibility_manager.py,sha256=f3982997d5828076d63627f1a220227479ac5f2aa95024e3b845be17388560c1,8375
92
- griptape_nodes/retained_mode/managers/workflow_manager.py,sha256=fa8cbbdf4ed239de8884ad5479662ea97cf10afaacf0bcf0dab689e8af5f0271,177057
93
- griptape_nodes/retained_mode/retained_mode.py,sha256=e900efe9c2d557642783440e29de8430038f7034d87ba4a1f8ab0c6344e4daea,56866
92
+ griptape_nodes/retained_mode/managers/workflow_manager.py,sha256=5e1b08000da006b3b6648e635e28db98fd39745bf2043686f434cfc18eaa7d9e,177538
93
+ griptape_nodes/retained_mode/retained_mode.py,sha256=366a40437364b0374067d48c1917db483281af97034634aed3a4893461f656fc,56903
94
94
  griptape_nodes/retained_mode/utils/__init__.py,sha256=5b976fbfc630bd556affc7954e031ddd9fd507f0edab5b08215abcef8e501ff2,52
95
95
  griptape_nodes/retained_mode/utils/engine_identity.py,sha256=3d999d95833af7e07ee99d45e2225f672566dadc096397121a8894242323d315,7846
96
96
  griptape_nodes/retained_mode/utils/name_generator.py,sha256=2192da86d7cfdd70bbf570292dd1a867420a2949208884e9775e912bb35bc84b,2524
@@ -121,7 +121,7 @@ griptape_nodes/version_compatibility/versions/v0_39_0/modified_parameters_set_re
121
121
  griptape_nodes/version_compatibility/workflow_versions/__init__.py,sha256=cf95c38248b3a0d072097a72a37e217ec24a16c5a53876c3ea18337d81fdb9b7,52
122
122
  griptape_nodes/version_compatibility/workflow_versions/v0_7_0/__init__.py,sha256=2333cf9862bcea1dacc1f1864ce1f255c04894e9e0e928e0590ce56dfde7826a,51
123
123
  griptape_nodes/version_compatibility/workflow_versions/v0_7_0/local_executor_argument_addition.py,sha256=f4f725029fcc9b920fb5de728f95d24b9fb1ed062689fbe14e5cb6d02801666a,2018
124
- griptape_nodes-0.47.0.dist-info/WHEEL,sha256=a5e55b04b8f33877bc27f65ac29d291cffc1b9f6d9ba47a56762330128f68bcb,78
125
- griptape_nodes-0.47.0.dist-info/entry_points.txt,sha256=aaf7afa9ddc155b015e5371a9ed9c09b4a2ea9aa982a1b113b7a641729962d63,82
126
- griptape_nodes-0.47.0.dist-info/METADATA,sha256=a4f83cb924800b2e1f7c0a1b3c0451daf0c99e4ade891aff4cd684aa6f30e9ba,4980
127
- griptape_nodes-0.47.0.dist-info/RECORD,,
124
+ griptape_nodes-0.48.0.dist-info/WHEEL,sha256=a51d7af6bb8356f1000fb3d205aba975eca53e14c9e011c620094d822eb4863c,79
125
+ griptape_nodes-0.48.0.dist-info/entry_points.txt,sha256=aaf7afa9ddc155b015e5371a9ed9c09b4a2ea9aa982a1b113b7a641729962d63,82
126
+ griptape_nodes-0.48.0.dist-info/METADATA,sha256=62b03f4479b27f2548ff0dbbb1daf21749fca32f9aad00092d7968b1b24aebc1,4980
127
+ griptape_nodes-0.48.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: uv 0.8.6
2
+ Generator: uv 0.8.10
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any