systemr-cli 1.1.4__tar.gz → 1.2.0__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.
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/PKG-INFO +1 -1
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/__init__.py +1 -1
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/commands/chat_commands.py +33 -5
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/pyproject.toml +1 -1
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/.gitignore +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/DESIGN.md +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/README.md +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/clawhub/systemr-trading/SKILL.md +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/clawhub/systemr-trading/scripts/mcp_stdio_proxy.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/__main__.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/auth.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/cli.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/client.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/commands/__init__.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/commands/auth_commands.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/commands/cron_commands.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/commands/doctor_command.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/commands/eval_commands.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/commands/journal_commands.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/commands/plan_commands.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/commands/risk_commands.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/commands/scan_commands.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/commands/size_commands.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/config.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/confirmation.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/credits.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/cron.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/display/__init__.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/display/chat_renderer.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/display/formatters.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/display/tables.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/display/theme.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/hooks.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/logging.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/model_failover.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/orchestrator.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/profile.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/store.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/streaming.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/tool_router.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/neo/types.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/__init__.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_auth.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_chat_helpers.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_chat_renderer.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_cli.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_config.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_confirmation.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_credits.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_cron.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_doctor.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_formatters.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_hooks.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_logging.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_model_failover.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_orchestrator.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_profile.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_store.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_streaming.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_tool_router.py +0 -0
- {systemr_cli-1.1.4 → systemr_cli-1.2.0}/tests/test_types.py +0 -0
|
@@ -409,22 +409,33 @@ async def _do_chat(
|
|
|
409
409
|
Returns:
|
|
410
410
|
The collected assistant response text.
|
|
411
411
|
"""
|
|
412
|
+
import time as _time
|
|
413
|
+
import sys
|
|
414
|
+
|
|
412
415
|
collected_text = ""
|
|
413
416
|
tool_count = 0
|
|
414
417
|
has_trade = False
|
|
418
|
+
streaming_started = False
|
|
419
|
+
start_time = _time.time()
|
|
415
420
|
|
|
416
421
|
try:
|
|
417
422
|
async for event in stream_chat(request, access_token):
|
|
418
423
|
if event.event == "thinking":
|
|
419
|
-
text = event.parsed.get("text", event.parsed.get("content", ""))
|
|
424
|
+
text = event.parsed.get("text", event.parsed.get("status", event.parsed.get("content", "")))
|
|
420
425
|
if text:
|
|
421
|
-
|
|
426
|
+
# Clear line and show thinking status
|
|
427
|
+
sys.stdout.write(f"\r \033[2m◐ {text[:70]}\033[0m\033[K")
|
|
428
|
+
sys.stdout.flush()
|
|
422
429
|
|
|
423
430
|
elif event.event == "action":
|
|
424
431
|
tool = event.parsed.get("action", event.parsed.get("tool", event.parsed.get("name", "")))
|
|
425
432
|
params = event.parsed.get("parameters", event.parsed.get("args", {}))
|
|
426
433
|
tool_count += 1
|
|
427
434
|
|
|
435
|
+
# Clear thinking line before showing tool
|
|
436
|
+
sys.stdout.write("\r\033[K")
|
|
437
|
+
sys.stdout.flush()
|
|
438
|
+
|
|
428
439
|
# Fire BEFORE_TOOL_CALL hook — can inspect/log tool calls
|
|
429
440
|
if tool:
|
|
430
441
|
fire_hook(HookEvent.BEFORE_TOOL_CALL, context={
|
|
@@ -495,12 +506,29 @@ async def _do_chat(
|
|
|
495
506
|
elif event.event == "text_delta":
|
|
496
507
|
text = event.parsed.get("text", event.parsed.get("delta", event.data))
|
|
497
508
|
if text and text != "null":
|
|
509
|
+
# Start green border on first chunk
|
|
510
|
+
if not streaming_started:
|
|
511
|
+
sys.stdout.write("\r\033[K") # Clear thinking line
|
|
512
|
+
sys.stdout.write(f"\n \033[38;2;62;207;142m┃\033[0m ")
|
|
513
|
+
streaming_started = True
|
|
514
|
+
# Stream text in real-time, handle newlines with border
|
|
515
|
+
for ch in text:
|
|
516
|
+
if ch == "\n":
|
|
517
|
+
sys.stdout.write(f"\n \033[38;2;62;207;142m┃\033[0m ")
|
|
518
|
+
else:
|
|
519
|
+
sys.stdout.write(ch)
|
|
520
|
+
sys.stdout.flush()
|
|
498
521
|
collected_text += text
|
|
499
522
|
|
|
500
523
|
elif event.event == "done":
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
524
|
+
# Close the streaming block
|
|
525
|
+
if streaming_started:
|
|
526
|
+
elapsed = _time.time() - start_time
|
|
527
|
+
sys.stdout.write(f"\n \033[38;2;62;207;142m┃\033[0m")
|
|
528
|
+
sys.stdout.write(f"\n\n \033[2m✦ {elapsed:.1f}s\033[0m")
|
|
529
|
+
sys.stdout.write("\n")
|
|
530
|
+
sys.stdout.flush()
|
|
531
|
+
elif not collected_text.strip():
|
|
504
532
|
full = event.parsed.get(
|
|
505
533
|
"response", event.parsed.get("content", ""),
|
|
506
534
|
)
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|