virtuai-cli 0.5.2__tar.gz → 0.5.3__tar.gz

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 (23) hide show
  1. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/PKG-INFO +1 -1
  2. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/pyproject.toml +1 -1
  3. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli/__init__.py +1 -1
  4. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli/chat/ask.py +2 -0
  5. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli/chat/sse.py +14 -2
  6. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli/chat/tui.py +4 -0
  7. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli.egg-info/PKG-INFO +1 -1
  8. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/README.md +0 -0
  9. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/setup.cfg +0 -0
  10. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli/chat/__init__.py +0 -0
  11. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli/chat/command.py +0 -0
  12. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli/chat/history.py +0 -0
  13. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli/chat/widgets.py +0 -0
  14. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli/config.py +0 -0
  15. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli/executor.py +0 -0
  16. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli/main.py +0 -0
  17. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli/runner.py +0 -0
  18. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli/security.py +0 -0
  19. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli.egg-info/SOURCES.txt +0 -0
  20. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli.egg-info/dependency_links.txt +0 -0
  21. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli.egg-info/entry_points.txt +0 -0
  22. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli.egg-info/requires.txt +0 -0
  23. {virtuai_cli-0.5.2 → virtuai_cli-0.5.3}/src/virtuai_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: virtuai-cli
3
- Version: 0.5.2
3
+ Version: 0.5.3
4
4
  Summary: Run VirtuAI deep agents on your local machine
5
5
  Author-email: uCloudStore <lmoreno@ucloudstore.com>
6
6
  License: Proprietary
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "virtuai-cli"
7
- version = "0.5.2"
7
+ version = "0.5.3"
8
8
  description = "Run VirtuAI deep agents on your local machine"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,2 +1,2 @@
1
1
  """VirtuAI local CLI."""
2
- __version__ = "0.5.2"
2
+ __version__ = "0.5.3"
@@ -107,6 +107,8 @@ async def _run_ask(
107
107
  server_url, token, agent_id, message,
108
108
  session_id=session_id, model_id=model_id,
109
109
  ):
110
+ if not isinstance(event, dict):
111
+ continue
110
112
  etype = event.get("type")
111
113
 
112
114
  if mode == "json":
@@ -44,8 +44,20 @@ async def stream_chat(
44
44
  async for sse in event_source.aiter_sse():
45
45
  if not sse.data:
46
46
  continue
47
+ # Classic-agent path emits `data: [DONE]` after the stream;
48
+ # treat that as a done event for symmetry with the deep path.
49
+ if sse.data.strip() == "[DONE]":
50
+ yield {"type": "done"}
51
+ continue
47
52
  try:
48
- yield json.loads(sse.data)
53
+ parsed = json.loads(sse.data)
49
54
  except json.JSONDecodeError:
50
- # Server occasionally emits non-JSON keepalive lines; skip.
51
55
  continue
56
+ if isinstance(parsed, dict):
57
+ yield parsed
58
+ elif isinstance(parsed, str):
59
+ # Classic agents stream tokens as bare JSON strings
60
+ # (`data: "hello "`). Wrap them so downstream handlers
61
+ # don't need to know about the legacy protocol.
62
+ yield {"type": "token", "content": parsed}
63
+ # Other shapes (lists, ints, null) are dropped silently.
@@ -462,6 +462,10 @@ class ChatApp(App):
462
462
  pass
463
463
 
464
464
  async def _handle_event(self, event: dict, turn: AssistantTurn) -> None:
465
+ # Defensive: a malformed server frame (string/list/None) used to crash
466
+ # the stream with "'str' object has no attribute 'get'".
467
+ if not isinstance(event, dict):
468
+ return
465
469
  etype = event.get("type")
466
470
  if etype == "start":
467
471
  sid = event.get("session_id")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: virtuai-cli
3
- Version: 0.5.2
3
+ Version: 0.5.3
4
4
  Summary: Run VirtuAI deep agents on your local machine
5
5
  Author-email: uCloudStore <lmoreno@ucloudstore.com>
6
6
  License: Proprietary
File without changes
File without changes