waldiez 0.5.10__py3-none-any.whl → 0.6.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.

Potentially problematic release.


This version of waldiez might be problematic. Click here for more details.

Files changed (62) hide show
  1. waldiez/_version.py +1 -1
  2. waldiez/cli.py +1 -0
  3. waldiez/exporting/agent/exporter.py +6 -6
  4. waldiez/exporting/agent/extras/group_manager_agent_extas.py +6 -1
  5. waldiez/exporting/agent/extras/handoffs/after_work.py +1 -0
  6. waldiez/exporting/agent/extras/handoffs/available.py +1 -0
  7. waldiez/exporting/agent/extras/handoffs/handoff.py +1 -0
  8. waldiez/exporting/agent/extras/handoffs/target.py +1 -0
  9. waldiez/exporting/agent/termination.py +1 -0
  10. waldiez/exporting/core/constants.py +3 -1
  11. waldiez/exporting/core/extras/serializer.py +12 -10
  12. waldiez/exporting/core/types.py +1 -0
  13. waldiez/exporting/core/utils/llm_config.py +2 -2
  14. waldiez/exporting/flow/execution_generator.py +1 -0
  15. waldiez/exporting/flow/utils/common.py +1 -1
  16. waldiez/exporting/flow/utils/importing.py +1 -1
  17. waldiez/exporting/flow/utils/logging.py +3 -75
  18. waldiez/io/__init__.py +3 -1
  19. waldiez/io/_ws.py +2 -0
  20. waldiez/io/structured.py +81 -28
  21. waldiez/io/utils.py +16 -10
  22. waldiez/io/ws.py +2 -2
  23. waldiez/models/agents/agent/agent.py +2 -1
  24. waldiez/models/chat/chat.py +1 -0
  25. waldiez/models/chat/chat_data.py +0 -2
  26. waldiez/models/common/base.py +2 -0
  27. waldiez/models/common/handoff.py +2 -0
  28. waldiez/models/common/method_utils.py +2 -0
  29. waldiez/models/model/_llm.py +3 -0
  30. waldiez/models/tool/predefined/_email.py +3 -0
  31. waldiez/models/tool/predefined/_perplexity.py +1 -1
  32. waldiez/models/tool/predefined/_searxng.py +1 -1
  33. waldiez/models/tool/predefined/_wikipedia.py +1 -1
  34. waldiez/running/base_runner.py +81 -20
  35. waldiez/running/post_run.py +6 -0
  36. waldiez/running/pre_run.py +167 -45
  37. waldiez/running/standard_runner.py +5 -5
  38. waldiez/running/step_by_step/breakpoints_mixin.py +368 -44
  39. waldiez/running/step_by_step/command_handler.py +151 -0
  40. waldiez/running/step_by_step/events_processor.py +199 -0
  41. waldiez/running/step_by_step/step_by_step_models.py +358 -41
  42. waldiez/running/step_by_step/step_by_step_runner.py +358 -353
  43. waldiez/running/subprocess_runner/__base__.py +4 -7
  44. waldiez/running/subprocess_runner/_async_runner.py +1 -1
  45. waldiez/running/subprocess_runner/_sync_runner.py +5 -4
  46. waldiez/running/subprocess_runner/runner.py +9 -0
  47. waldiez/running/utils.py +116 -2
  48. waldiez/ws/__init__.py +8 -7
  49. waldiez/ws/_file_handler.py +0 -2
  50. waldiez/ws/_mock.py +74 -0
  51. waldiez/ws/cli.py +27 -3
  52. waldiez/ws/client_manager.py +45 -29
  53. waldiez/ws/models.py +18 -1
  54. waldiez/ws/reloader.py +23 -2
  55. waldiez/ws/server.py +47 -8
  56. waldiez/ws/utils.py +29 -4
  57. {waldiez-0.5.10.dist-info → waldiez-0.6.0.dist-info}/METADATA +53 -44
  58. {waldiez-0.5.10.dist-info → waldiez-0.6.0.dist-info}/RECORD +62 -59
  59. {waldiez-0.5.10.dist-info → waldiez-0.6.0.dist-info}/WHEEL +0 -0
  60. {waldiez-0.5.10.dist-info → waldiez-0.6.0.dist-info}/entry_points.txt +0 -0
  61. {waldiez-0.5.10.dist-info → waldiez-0.6.0.dist-info}/licenses/LICENSE +0 -0
  62. {waldiez-0.5.10.dist-info → waldiez-0.6.0.dist-info}/licenses/NOTICE.md +0 -0
waldiez/ws/server.py CHANGED
@@ -1,5 +1,11 @@
1
1
  # SPDX-License-Identifier: Apache-2.0.
2
2
  # Copyright (c) 2024 - 2025 Waldiez and contributors.
3
+ # pyright: reportMissingImports=false,reportUnknownVariableType=false
4
+ # pyright: reportPossiblyUnboundVariable=false,reportUnknownMemberType=false
5
+ # pyright: reportUnknownParameterType=false,reportUnknownArgumentType=false
6
+ # pyright: reportAttributeAccessIssue=false
7
+ # pylint: disable=import-error,line-too-long
8
+ # flake8: noqa: E501
3
9
  """WebSocket server implementation for Waldiez."""
4
10
 
5
11
  import asyncio
@@ -12,16 +18,42 @@ import uuid
12
18
  from pathlib import Path
13
19
  from typing import Any, Sequence
14
20
 
15
- import websockets
16
- from websockets.exceptions import ConnectionClosed, WebSocketException
17
-
18
21
  from .client_manager import ClientManager
19
22
  from .errors import ErrorHandler, MessageParsingError, ServerOverloadError
20
23
  from .models import ConnectionNotification
21
- from .reloader import create_file_watcher
22
24
  from .session_manager import SessionManager
23
25
  from .utils import get_available_port, is_port_available
24
26
 
27
+ HAS_WATCHDOG = False
28
+ try:
29
+ from .reloader import create_file_watcher
30
+
31
+ HAS_WATCHDOG = True # pyright: ignore
32
+ except ImportError:
33
+ # pylint: disable=unused-argument,missing-param-doc,missing-return-doc
34
+ # noinspection PyUnusedLocal
35
+ def create_file_watcher(*args: Any, **kwargs: Any) -> Any: # type: ignore
36
+ """No file watcher available."""
37
+
38
+
39
+ HAS_WEBSOCKETS = False
40
+ try:
41
+ import websockets # type: ignore[unused-ignore, unused-import, import-not-found, import-untyped]
42
+ from websockets.exceptions import ( # type: ignore[unused-ignore, unused-import, import-not-found, import-untyped]
43
+ ConnectionClosed,
44
+ WebSocketException,
45
+ )
46
+
47
+ HAS_WEBSOCKETS = True # pyright: ignore
48
+ except ImportError:
49
+ from ._mock import ( # type: ignore[no-redef, unused-ignore, unused-import, import-not-found, import-untyped]
50
+ websockets,
51
+ )
52
+
53
+ ConnectionClosed = websockets.ConnectionClosed # type: ignore[no-redef,unused-ignore,unused-import,import-not-found,import-untyped,misc]
54
+ WebSocketException = websockets.WebSocketException # type: ignore[no-redef,unused-ignore,unused-import,import-not-found,import-untyped,misc]
55
+
56
+
25
57
  logger = logging.getLogger(__name__)
26
58
 
27
59
  CWD = Path.cwd()
@@ -35,6 +67,7 @@ class WaldiezWsServer:
35
67
  self,
36
68
  host: str = "localhost",
37
69
  port: int = 8765,
70
+ auto_reload: bool = False,
38
71
  workspace_dir: Path = CWD,
39
72
  max_clients: int = 1,
40
73
  allowed_origins: Sequence[re.Pattern[str]] | None = None,
@@ -48,11 +81,13 @@ class WaldiezWsServer:
48
81
  Server host address
49
82
  port : int
50
83
  Server port
84
+ auto_reload : bool
85
+ Enable automatic reloading of the server on code changes
51
86
  workspace_dir : Path
52
87
  Path to the workspace directory
53
88
  max_clients : int
54
89
  Maximum number of concurrent clients (default: 1)
55
- allowed_origins : list[str] | None
90
+ allowed_origins : Sequence[re.Pattern[str]] | None
56
91
  List of allowed origins for CORS (default: None)
57
92
  ping_interval : float | None
58
93
  Ping interval in seconds
@@ -69,6 +104,7 @@ class WaldiezWsServer:
69
104
  """
70
105
  self.host = host
71
106
  self.port = port
107
+ self.auto_reload = auto_reload and HAS_WATCHDOG
72
108
  self.workspace_dir = workspace_dir
73
109
  self.max_clients = max_clients
74
110
  self.allowed_origins = allowed_origins
@@ -148,7 +184,8 @@ class WaldiezWsServer:
148
184
  )
149
185
 
150
186
  # Message handling loop
151
- async for raw_message in websocket:
187
+ # noinspection PyTypeChecker
188
+ async for raw_message in websocket: # pyright: ignore
152
189
  try:
153
190
  # Parse message
154
191
  if isinstance(raw_message, bytes):
@@ -230,7 +267,7 @@ class WaldiezWsServer:
230
267
 
231
268
  await self.session_manager.start()
232
269
  # Check port availability
233
- if not is_port_available(self.port):
270
+ if not self.auto_reload and not is_port_available(self.port):
234
271
  logger.warning("Port %d is not available", self.port)
235
272
  self.port = get_available_port()
236
273
  logger.info("Using port %d", self.port)
@@ -239,6 +276,7 @@ class WaldiezWsServer:
239
276
  # pylint: disable=too-many-try-statements,broad-exception-caught
240
277
  try:
241
278
  # Create server
279
+ # noinspection PyTypeChecker
242
280
  self.server = await websockets.serve(
243
281
  self._handle_client,
244
282
  self.host,
@@ -401,6 +439,7 @@ async def run_server(
401
439
  server = WaldiezWsServer(
402
440
  host=host,
403
441
  port=port,
442
+ auto_reload=auto_reload,
404
443
  workspace_dir=workspace_dir,
405
444
  **server_kwargs,
406
445
  )
@@ -420,7 +459,7 @@ async def run_server(
420
459
 
421
460
  # Set up auto-reload if requested
422
461
  file_watcher = None
423
- if auto_reload:
462
+ if auto_reload and HAS_WATCHDOG:
424
463
  # pylint: disable=import-outside-toplevel,too-many-try-statements
425
464
  try:
426
465
  # Determine watch directories
waldiez/ws/utils.py CHANGED
@@ -1,5 +1,9 @@
1
1
  # SPDX-License-Identifier: Apache-2.0.
2
2
  # Copyright (c) 2024 - 2025 Waldiez and contributors.
3
+ # pylint: disable=import-error,line-too-long
4
+ # pyright: reportUnknownMemberType=false,reportUnknownVariableType=false
5
+ # pyright: reportUnknownArgumentType=false,reportAttributeAccessIssue=false
6
+ # flake8: noqa: E501
3
7
  """Utilities for WebSocket server management."""
4
8
 
5
9
  import asyncio
@@ -11,7 +15,11 @@ from contextlib import closing
11
15
  from dataclasses import asdict, dataclass
12
16
  from typing import TYPE_CHECKING, Any
13
17
 
14
- import websockets
18
+ try:
19
+ import websockets # type: ignore[unused-ignore, unused-import, import-not-found, import-untyped] # noqa
20
+ except ImportError: # pragma: no cover
21
+ from ._mock import websockets # type: ignore[no-redef,unused-ignore]
22
+
15
23
 
16
24
  if TYPE_CHECKING:
17
25
  from .server import WaldiezWsServer
@@ -329,7 +337,10 @@ async def test_server_connection(
329
337
  try:
330
338
  uri = f"ws://{host}:{port}"
331
339
 
332
- async with websockets.connect(uri, ping_interval=None) as websocket:
340
+ async with websockets.connect(
341
+ uri,
342
+ ping_interval=None,
343
+ ) as websocket:
333
344
  # Send ping message
334
345
  ping_msg = {"action": "ping"}
335
346
  await websocket.send(json.dumps(ping_msg))
@@ -350,6 +361,7 @@ async def test_server_connection(
350
361
  return result
351
362
 
352
363
 
364
+ # noinspection PyBroadException
353
365
  def is_port_available(port: int) -> bool:
354
366
  """Check if the port is available.
355
367
 
@@ -363,13 +375,26 @@ def is_port_available(port: int) -> bool:
363
375
  bool
364
376
  True if port is available
365
377
  """
378
+ # Check IPv4
366
379
  try:
367
380
  with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
368
381
  sock.bind(("", port))
369
- return True
370
- except OSError:
382
+ except BaseException: # pylint: disable=broad-exception-caught
371
383
  return False
372
384
 
385
+ # Check IPv6
386
+ try: # pragma: no cover
387
+ with closing(
388
+ socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
389
+ ) as sock:
390
+ # Disable dual-stack to only check IPv6
391
+ sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 1)
392
+ sock.bind(("", port))
393
+ except BaseException: # pylint: disable=broad-exception-caught
394
+ return False
395
+
396
+ return True
397
+
373
398
 
374
399
  def get_available_port() -> int:
375
400
  """Get an available port.
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: waldiez
3
- Version: 0.5.10
3
+ Version: 0.6.0
4
4
  Dynamic: Keywords
5
5
  Summary: Make AG2 Agents Collaborate: Drag, Drop, and Orchestrate with Waldiez.
6
6
  Project-URL: Homepage, https://waldiez.io
7
7
  Project-URL: Bug Tracker, https://github.com/waldiez/waldiez/issues
8
8
  Project-URL: Repository, https://github.com/waldiez/waldiez.git
9
- Author-email: Panagiotis Kasnesis <pkasnesis@waldiez.io>, Lazaros Toumanidis <laztoum@waldiez.io>, Stella Ioannidou <stella@waldiez.io>
9
+ Author-email: Panagiotis Kasnesis <pkasnesis@waldiez.io>, Lazaros Toumanidis <laztoum@waldiez.io>, Christos Chatzigeorgiou <chrihatz@waldiez.io>
10
10
  License-File: LICENSE
11
11
  License-File: NOTICE.md
12
12
  Classifier: Development Status :: 4 - Beta
@@ -36,18 +36,16 @@ Requires-Dist: graphviz<=0.21
36
36
  Requires-Dist: httpx<1
37
37
  Requires-Dist: jupytext
38
38
  Requires-Dist: nest-asyncio==1.6.0
39
- Requires-Dist: numpy<=2.3.2
39
+ Requires-Dist: numpy<=2.3.3
40
40
  Requires-Dist: pandas>=2
41
- Requires-Dist: parso==0.8.4
41
+ Requires-Dist: parso==0.8.5
42
42
  Requires-Dist: pillow
43
43
  Requires-Dist: pip>=25.1.1
44
- Requires-Dist: platformdirs==4.3.8
44
+ Requires-Dist: platformdirs==4.4.0
45
45
  Requires-Dist: psutil==7.0.0
46
46
  Requires-Dist: pydantic<3,>=2.10.2
47
- Requires-Dist: rpds-py==0.27.0
47
+ Requires-Dist: rpds-py==0.27.1
48
48
  Requires-Dist: typer<1,>=0.9.0
49
- Requires-Dist: watchdog==6.0.0
50
- Requires-Dist: websockets==15.0.1
51
49
  Provides-Extra: ag2-extras
52
50
  Requires-Dist: ag2[anthropic]==0.9.9; extra == 'ag2-extras'
53
51
  Requires-Dist: ag2[autobuild]==0.9.9; extra == 'ag2-extras'
@@ -92,12 +90,13 @@ Requires-Dist: llama-index-vector-stores-chroma; extra == 'ag2-extras'
92
90
  Requires-Dist: llama-index-vector-stores-mongodb; extra == 'ag2-extras'
93
91
  Requires-Dist: llama-index<1,>=0.12; extra == 'ag2-extras'
94
92
  Requires-Dist: pgvector>=0.4.0; extra == 'ag2-extras'
95
- Requires-Dist: psycopg>=3.2.6; (sys_platform == 'linux') and extra == 'ag2-extras'
96
- Requires-Dist: psycopg>=3.2.6; (sys_platform == 'win32' and platform_machine == 'AARCH64') and extra == 'ag2-extras'
97
- Requires-Dist: psycopg>=3.2.6; (sys_platform == 'win32' and platform_machine == 'ARM64') and extra == 'ag2-extras'
98
- Requires-Dist: psycopg>=3.2.6; (sys_platform == 'win32' and platform_machine == 'aarch64') and extra == 'ag2-extras'
99
- Requires-Dist: psycopg>=3.2.6; (sys_platform == 'win32' and platform_machine == 'arm64') and extra == 'ag2-extras'
100
- Requires-Dist: psycopg[binary]>=3.2.6; (sys_platform != 'linux' and platform_machine != 'arm64' and platform_machine != 'ARM64' and platform_machine != 'aarch64' and platform_machine != 'AARCH64') and extra == 'ag2-extras'
93
+ Requires-Dist: psycopg>=3.2.9; (sys_platform == 'linux') and extra == 'ag2-extras'
94
+ Requires-Dist: psycopg>=3.2.9; (sys_platform == 'win32' and platform_machine == 'AARCH64') and extra == 'ag2-extras'
95
+ Requires-Dist: psycopg>=3.2.9; (sys_platform == 'win32' and platform_machine == 'ARM64') and extra == 'ag2-extras'
96
+ Requires-Dist: psycopg>=3.2.9; (sys_platform == 'win32' and platform_machine == 'aarch64') and extra == 'ag2-extras'
97
+ Requires-Dist: psycopg>=3.2.9; (sys_platform == 'win32' and platform_machine == 'arm64') and extra == 'ag2-extras'
98
+ Requires-Dist: psycopg[binary]>=3.2.9; (sys_platform == 'darwin') and extra == 'ag2-extras'
99
+ Requires-Dist: psycopg[binary]>=3.2.9; (sys_platform == 'win32' and platform_machine != 'arm64' and platform_machine != 'ARM64' and platform_machine != 'aarch64' and platform_machine != 'AARCH64') and extra == 'ag2-extras'
101
100
  Requires-Dist: pydantic-ai>=0.0.21; extra == 'ag2-extras'
102
101
  Requires-Dist: pymongo>=4.11; extra == 'ag2-extras'
103
102
  Requires-Dist: qdrant-client[fastembed]; (sys_platform != 'win32') and extra == 'ag2-extras'
@@ -107,86 +106,96 @@ Requires-Dist: selenium<5,>=4.28.1; extra == 'ag2-extras'
107
106
  Requires-Dist: webdriver-manager==4.0.2; extra == 'ag2-extras'
108
107
  Provides-Extra: dev
109
108
  Requires-Dist: ag2[redis]==0.9.9; extra == 'dev'
110
- Requires-Dist: ag2[websockets]==0.9.9; extra == 'dev'
111
109
  Requires-Dist: autoflake==2.3.1; extra == 'dev'
112
110
  Requires-Dist: bandit==1.8.6; extra == 'dev'
113
111
  Requires-Dist: black[jupyter]==25.1.0; extra == 'dev'
114
112
  Requires-Dist: build==1.3.0; extra == 'dev'
115
- Requires-Dist: fakeredis==2.31.0; extra == 'dev'
113
+ Requires-Dist: fakeredis==2.31.1; extra == 'dev'
116
114
  Requires-Dist: fastjsonschema>=2.21.2; extra == 'dev'
117
115
  Requires-Dist: flake8==7.3.0; extra == 'dev'
118
116
  Requires-Dist: hatchling==1.27.0; extra == 'dev'
119
117
  Requires-Dist: jsonschema==4.25.1; extra == 'dev'
120
- Requires-Dist: jupyter-server==2.16.0; extra == 'dev'
121
- Requires-Dist: jupyterlab==4.4.6; extra == 'dev'
118
+ Requires-Dist: jupyter-server==2.17.0; extra == 'dev'
119
+ Requires-Dist: jupyterlab==4.4.7; extra == 'dev'
122
120
  Requires-Dist: mypy-extensions>=1.1.0; extra == 'dev'
123
- Requires-Dist: mypy==1.17.1; extra == 'dev'
121
+ Requires-Dist: mypy==1.18.1; extra == 'dev'
124
122
  Requires-Dist: nbclient>=0.10.2; extra == 'dev'
125
123
  Requires-Dist: nbconvert>=7.16.6; extra == 'dev'
126
124
  Requires-Dist: nbformat>=5.10.4; extra == 'dev'
127
125
  Requires-Dist: nodeenv>=1.9.1; extra == 'dev'
128
126
  Requires-Dist: notebook-shim>=0.2.4; extra == 'dev'
129
127
  Requires-Dist: paho-mqtt<3.0,>=2.1.0; extra == 'dev'
130
- Requires-Dist: pandas-stubs==2.3.0.250703; extra == 'dev'
128
+ Requires-Dist: pandas-stubs==2.3.2.250827; extra == 'dev'
131
129
  Requires-Dist: pre-commit==4.3.0; extra == 'dev'
132
130
  Requires-Dist: pydocstyle==6.3.0; extra == 'dev'
133
131
  Requires-Dist: pylint==3.3.8; extra == 'dev'
134
132
  Requires-Dist: python-dotenv>=1.1.1; extra == 'dev'
135
- Requires-Dist: ruff==0.12.9; extra == 'dev'
133
+ Requires-Dist: ruff==0.13.0; extra == 'dev'
136
134
  Requires-Dist: toml==0.10.2; (python_version <= '3.10') and extra == 'dev'
137
- Requires-Dist: types-aiofiles==24.1.0.20250809; extra == 'dev'
138
- Requires-Dist: types-jsonschema==4.25.0.20250809; extra == 'dev'
139
- Requires-Dist: types-psutil==7.0.0.20250801; extra == 'dev'
140
- Requires-Dist: types-pyyaml==6.0.12.20250809; extra == 'dev'
135
+ Requires-Dist: types-aiofiles==24.1.0.20250822; extra == 'dev'
136
+ Requires-Dist: types-jsonschema==4.25.1.20250822; extra == 'dev'
137
+ Requires-Dist: types-psutil==7.0.0.20250822; extra == 'dev'
138
+ Requires-Dist: types-pyyaml==6.0.12.20250822; extra == 'dev'
141
139
  Requires-Dist: types-redis==4.6.0.20241004; extra == 'dev'
142
- Requires-Dist: types-requests==2.32.4.20250809; extra == 'dev'
140
+ Requires-Dist: types-requests==2.32.4.20250913; extra == 'dev'
143
141
  Requires-Dist: types-toml==0.10.8.20240310; extra == 'dev'
144
- Requires-Dist: watchdog==6.0.0; extra == 'dev'
142
+ Requires-Dist: watchdog>=5.0.0; extra == 'dev'
143
+ Requires-Dist: websockets<16,>=14.0; extra == 'dev'
145
144
  Requires-Dist: yamllint==1.37.1; extra == 'dev'
146
145
  Provides-Extra: docs
147
146
  Requires-Dist: markdown-callouts==0.4.0; extra == 'docs'
148
147
  Requires-Dist: mdx-include==1.4.2; extra == 'docs'
149
148
  Requires-Dist: mdx-truly-sane-lists==1.3; extra == 'docs'
150
- Requires-Dist: mkdocs-autorefs==1.4.2; extra == 'docs'
151
- Requires-Dist: mkdocs-awesome-nav==3.1.2; extra == 'docs'
149
+ Requires-Dist: mkdocs-autorefs==1.4.3; extra == 'docs'
150
+ Requires-Dist: mkdocs-awesome-nav==3.2.0; extra == 'docs'
152
151
  Requires-Dist: mkdocs-jupyter==0.25.1; extra == 'docs'
153
152
  Requires-Dist: mkdocs-macros-plugin==1.3.9; extra == 'docs'
154
- Requires-Dist: mkdocs-material==9.6.17; extra == 'docs'
155
- Requires-Dist: mkdocs-minify-html-plugin==0.3.4; extra == 'docs'
153
+ Requires-Dist: mkdocs-material==9.6.19; extra == 'docs'
154
+ Requires-Dist: mkdocs-minify-html-plugin; (python_version >= '3.13' and sys_platform == 'win32' and platform_machine == 'AARCH64') and extra == 'docs'
155
+ Requires-Dist: mkdocs-minify-html-plugin; (python_version >= '3.13' and sys_platform == 'win32' and platform_machine == 'ARM64') and extra == 'docs'
156
+ Requires-Dist: mkdocs-minify-html-plugin; (python_version >= '3.13' and sys_platform == 'win32' and platform_machine == 'aarch64') and extra == 'docs'
157
+ Requires-Dist: mkdocs-minify-html-plugin; (python_version >= '3.13' and sys_platform == 'win32' and platform_machine == 'arm64') and extra == 'docs'
158
+ Requires-Dist: mkdocs-minify-html-plugin==0.3.4; (python_version < '3.13') and extra == 'docs'
159
+ Requires-Dist: mkdocs-minify-html-plugin==0.3.4; (python_version >= '3.13' and sys_platform != 'win32') and extra == 'docs'
160
+ Requires-Dist: mkdocs-minify-html-plugin==0.3.4; (python_version >= '3.13' and sys_platform == 'win32' and platform_machine != 'arm64' and platform_machine != 'aarch64' and platform_machine != 'ARM64' and platform_machine != 'AARCH64') and extra == 'docs'
156
161
  Requires-Dist: mkdocs-open-in-new-tab==1.0.8; extra == 'docs'
157
162
  Requires-Dist: mkdocs==1.6.1; extra == 'docs'
158
163
  Requires-Dist: mkdocstrings-crystal==0.3.7; extra == 'docs'
159
- Requires-Dist: mkdocstrings-python==1.17.0; extra == 'docs'
164
+ Requires-Dist: mkdocstrings-python==1.18.2; extra == 'docs'
160
165
  Requires-Dist: mkdocstrings[crystal,python]==0.30.0; extra == 'docs'
161
166
  Requires-Dist: natsort==8.4.0; extra == 'docs'
162
167
  Provides-Extra: jupyter
163
168
  Requires-Dist: ipywidgets==8.1.7; extra == 'jupyter'
164
- Requires-Dist: jupyter-server==2.16.0; extra == 'jupyter'
165
- Requires-Dist: jupyterlab==4.4.6; extra == 'jupyter'
166
- Requires-Dist: waldiez-jupyter==0.5.10; extra == 'jupyter'
169
+ Requires-Dist: jupyter-server==2.17.0; extra == 'jupyter'
170
+ Requires-Dist: jupyterlab==4.4.7; extra == 'jupyter'
171
+ Requires-Dist: waldiez-jupyter==0.6.0; extra == 'jupyter'
167
172
  Provides-Extra: mqtt
168
173
  Requires-Dist: paho-mqtt<3.0,>=2.1.0; extra == 'mqtt'
169
174
  Provides-Extra: redis
170
175
  Requires-Dist: ag2[redis]==0.9.9; extra == 'redis'
176
+ Provides-Extra: reload
177
+ Requires-Dist: watchdog>=5.0.0; extra == 'reload'
171
178
  Provides-Extra: runner
172
- Requires-Dist: waldiez-runner==0.5.10; (python_version >= '3.11') and extra == 'runner'
179
+ Requires-Dist: waldiez-runner==0.6.0; (python_version >= '3.11') and extra == 'runner'
173
180
  Provides-Extra: studio
174
- Requires-Dist: waldiez-studio==0.5.10; extra == 'studio'
181
+ Requires-Dist: waldiez-studio==0.6.0; extra == 'studio'
175
182
  Provides-Extra: test
176
183
  Requires-Dist: ag2[redis]==0.9.9; extra == 'test'
177
184
  Requires-Dist: ag2[websockets]==0.9.9; extra == 'test'
178
- Requires-Dist: fakeredis==2.31.0; extra == 'test'
185
+ Requires-Dist: fakeredis==2.31.1; extra == 'test'
179
186
  Requires-Dist: paho-mqtt<3.0,>=2.1.0; extra == 'test'
180
- Requires-Dist: pytest-asyncio==1.1.0; extra == 'test'
181
- Requires-Dist: pytest-cov==6.2.1; extra == 'test'
187
+ Requires-Dist: pytest-asyncio==1.2.0; extra == 'test'
188
+ Requires-Dist: pytest-cov==7.0.0; extra == 'test'
182
189
  Requires-Dist: pytest-env==1.1.5; extra == 'test'
183
190
  Requires-Dist: pytest-html==4.1.1; extra == 'test'
184
- Requires-Dist: pytest-sugar==1.1.0; extra == 'test'
191
+ Requires-Dist: pytest-sugar==1.1.1; extra == 'test'
185
192
  Requires-Dist: pytest-timeout==2.4.0; extra == 'test'
186
193
  Requires-Dist: pytest-xdist==3.8.0; extra == 'test'
187
- Requires-Dist: pytest==8.4.1; extra == 'test'
194
+ Requires-Dist: pytest==8.4.2; extra == 'test'
195
+ Requires-Dist: watchdog>=5.0.0; extra == 'test'
196
+ Requires-Dist: websockets<16,>=14.0; extra == 'test'
188
197
  Provides-Extra: websockets
189
- Requires-Dist: ag2[websockets]==0.9.9; extra == 'websockets'
198
+ Requires-Dist: websockets<16,>=14.0; extra == 'websockets'
190
199
  Description-Content-Type: text/markdown
191
200
 
192
201
  # Waldiez
@@ -300,7 +309,7 @@ docker run --rm `
300
309
 
301
310
  ```shell
302
311
  CONTAINER_COMMAND=docker # or podman
303
- # Asuming ./flow.waldiez exists
312
+ # Assuming ./flow.waldiez exists
304
313
  HOST_INPUT="$(pwd)/flow.waldiez"
305
314
  CONTAINER_INPUT="/home/waldiez/workspace/flow.waldiez"
306
315
  HOST_OUTPUT_DIR="$(pwd)/output"