virtuai-cli 0.7.1__tar.gz → 0.7.2__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.
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/PKG-INFO +1 -1
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/pyproject.toml +1 -1
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli/__init__.py +1 -1
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli/chat/tui.py +42 -6
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli.egg-info/PKG-INFO +1 -1
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/README.md +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/setup.cfg +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli/chat/__init__.py +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli/chat/ask.py +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli/chat/command.py +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli/chat/history.py +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli/chat/sse.py +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli/chat/widgets.py +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli/config.py +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli/executor.py +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli/main.py +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli/runner.py +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli/security.py +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli.egg-info/SOURCES.txt +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli.egg-info/dependency_links.txt +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli.egg-info/entry_points.txt +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli.egg-info/requires.txt +0 -0
- {virtuai_cli-0.7.1 → virtuai_cli-0.7.2}/src/virtuai_cli.egg-info/top_level.txt +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""VirtuAI local CLI."""
|
|
2
|
-
__version__ = "0.7.
|
|
2
|
+
__version__ = "0.7.2"
|
|
@@ -379,17 +379,53 @@ class ChatApp(App):
|
|
|
379
379
|
)
|
|
380
380
|
await scroll.mount(Static(header))
|
|
381
381
|
|
|
382
|
+
loaded_session = self.session_id
|
|
382
383
|
for msg in messages:
|
|
383
384
|
mtype = (msg.get("message_type") or "").lower()
|
|
384
385
|
content = msg.get("content") or ""
|
|
386
|
+
steps = msg.get("steps") or []
|
|
385
387
|
if mtype in ("user", "human"):
|
|
386
388
|
await scroll.mount(UserBubble(content))
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
389
|
+
continue
|
|
390
|
+
|
|
391
|
+
turn = AssistantTurn(show_thinking=False)
|
|
392
|
+
await scroll.mount(turn)
|
|
393
|
+
|
|
394
|
+
replayed_visible = False
|
|
395
|
+
if isinstance(steps, list) and steps:
|
|
396
|
+
# Replay the original event stream through the same handler
|
|
397
|
+
# the live stream uses, so tool cards, file diffs, todos,
|
|
398
|
+
# and subagent traces all re-render identically to when
|
|
399
|
+
# the turn first ran. Skip lifecycle events that mutate
|
|
400
|
+
# app state (session_id) or close the stream.
|
|
401
|
+
for step in steps:
|
|
402
|
+
if not isinstance(step, dict):
|
|
403
|
+
continue
|
|
404
|
+
etype = step.get("type")
|
|
405
|
+
if etype in ("start", "done", "complete"):
|
|
406
|
+
continue
|
|
407
|
+
try:
|
|
408
|
+
await self._handle_event(step, turn)
|
|
409
|
+
if etype in (
|
|
410
|
+
"token", "text_segment", "tool_start", "tool_end",
|
|
411
|
+
"todos", "subagent_start", "subagent_end",
|
|
412
|
+
"memory_updated", "skill_loaded",
|
|
413
|
+
):
|
|
414
|
+
replayed_visible = True
|
|
415
|
+
except Exception:
|
|
416
|
+
# One bad step shouldn't break the whole replay.
|
|
417
|
+
continue
|
|
418
|
+
|
|
419
|
+
# Fall back to the persisted final text if there were no steps
|
|
420
|
+
# (older messages saved before steps tracking) or the steps
|
|
421
|
+
# rendered nothing visible.
|
|
422
|
+
if not replayed_visible and content:
|
|
423
|
+
await turn.append_token(content)
|
|
424
|
+
await turn.mark_final()
|
|
425
|
+
|
|
426
|
+
# Replay's `start` events were skipped, but in case anything else
|
|
427
|
+
# touched session_id, restore it to the conversation we loaded.
|
|
428
|
+
self.session_id = loaded_session
|
|
393
429
|
scroll.scroll_end(animate=False)
|
|
394
430
|
self._set_status(f"loaded {self.session_id}")
|
|
395
431
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|